Updated Module 4
Updated Module 4
Introducing servlets: Background; The Life Cycle of a Servlet; Using Tomcat for Servlet Development;
A simple Servlet; The Servlet API; The Jakarta. Servlet Package; Reading Servlet Parameter; The
Jakarta.servlet.http package; Handling HTTP Requests and Responses; Using Cookies; Session
Tracking.
Java Server Pages (JSP); JSP tags, Variables and Objects, Methods, Control statements, Loops, Request
String, Parsing other information, User sessions, Cookies, Session Objects
Introducing servlets
Servlet technology is used to create web application (resides at server side and generates dynamic web
page).
Servlet technology is robust and scalable because of java language. Before Servlet, CGI (Common
Gateway Interface) scripting language was popular as a server-side programming language. But there
was many disadvantages of this technology. We have discussed these disadvantages below.
There are many interfaces and classes in the servlet API such as Servlet, GenericServlet, HttpServlet,
ServletRequest, ServletResponse etc.
What is a Servlet?
Servlet can be described in many ways, depending on the context.
A web application is an application accessible from the web. A web application is composed of web
components like Servlet, JSP, Filter etc. and other components such as HTML. The web components
typically execute in Web Server and respond to HTTP request.
CGI technology enables the web server to call an external program and pass HTTP request information
to the external program to process the request. For each request, it starts a new process.
Disadvantages of CGI
There are many advantages of servlet over CGI. The web container creates threads for handling the
multiple requests to the servlet. Threads have a lot of benefits over the Processes such as they share a
common memory area, lightweight, cost of communication between the threads are low. The basic
benefits of servlet are as follows:
1. better performance: because it creates a thread for each request not process.
2. Portability: because it uses java language.
3. Robust: Servlets are managed by JVM so we don't need to worry about memory leak, garbage
collection etc.
4. Secure: because it uses java language..
The web container maintains the life cycle of a servlet instance. Let's see the life cycle of the servlet:
The classloader is responsible to load the servlet class. The servlet class is loaded when the first request
for the servlet is received by the web container.
The web container creates the instance of a servlet after loading the servlet class. The servlet instance is
created only once in the servlet life cycle.
The web container calls the init method only once after creating the servlet instance. The init method is
used to initialize the servlet. It is the life cycle method of the javax.servlet.Servlet interface. Syntax of
the init method is given below:
The web container calls the service method each time when request for the servlet is received. If servlet
is not initialized, it follows the first three steps as described above then calls the service method. If
servlet is initialized, it calls the service method. Notice that servlet is initialized only once. The syntax
of the service method of the Servlet interface is given below:
public void service(ServletRequest request, ServletResponse response) throws ServletException,
IOException
The web container calls the destroy method before removing the servlet instance from the service. It
gives the servlet an opportunity to clean up any resource for example memory, thread etc. The syntax of
the destroy method of the Servlet interface is given below:
The step-by-step procedure for creating and running servlets in different scenarios.
Open Eclipse
File → New → Dynamic Web Project
Enter project name (e.g., "SimpleServlet")
Select Tomcat v9.0 as target runtime
Click Finish
package com.servlet;
import java.io.IOException;
import java.io.PrntWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class HelloWorld
*/
@WebServlet("/HelloWorld")
public class HelloWorld extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public HelloWorld() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
// TODO Auto-generated method stub
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<h2><font color=blue>Hello World!!! </font></h2>");
out.println("</body></html>");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
Right-click on project
Run As → Run on Server
Select Tomcat v9.0
Access via: http://localhost:8080/SimpleServlet/FirstServlet
Running a Servlet with HTML:
package com.AdditionServlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/add")
public class AdditionServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
try {
int num1 = Integer.parseInt(request.getParameter("num1"));
int num2 = Integer.parseInt(request.getParameter("num2"));
int sum = num1 + num2;
out.println("<html>");
out.println("<head><title>Addition Result</title></head>");
out.println("<body>");
out.println("<h2>Addition Result</h2>");
out.println("<p>" + num1 + " + " + num2 + " = " + sum + "</p>");
out.println("<br><a href='index.html'>Back to Calculator</a>");
out.println("</body>");
out.println("</html>");
} catch (Exception e) {
out.println("<html>");
out.println("<head><title>Error</title></head>");
out.println("<body>");
out.println("<h2>Error</h2>");
out.println("<p>Please enter valid numbers</p>");
out.println("<br><a href='index.html'>Back to Calculator</a>");
out.println("</body>");
out.println("</html>");
}
}
Step 3: Run
Right-click on WebContent
New → JSP File
calculator.jsp
package com.calculator;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/calculate")
public class CalculatorServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
// Get parameters
double num1 = Double.parseDouble(request.getParameter("num1"));
double num2 = Double.parseDouble(request.getParameter("num2"));
String operation = request.getParameter("operation");
// Perform calculation
double result = 0;
switch(operation) {
case "add":
result = num1 + num2;
break;
case "subtract":
result = num1 - num2;
break;
case "multiply":
result = num1 * num2;
break;
case "divide":
if(num2 == 0) {
request.setAttribute("error", "Cannot divide by zero!");
request.getRequestDispatcher("calculator.jsp").forward(request, response);
return;
}
result = num1 / num2;
break;
default:
request.setAttribute("error", "Invalid operation!");
request.getRequestDispatcher("calculator.jsp").forward(request, response);
return;
}
} catch(NumberFormatException e) {
request.setAttribute("error", "Please enter valid numbers!");
request.getRequestDispatcher("calculator.jsp").forward(request, response);
}
}
Step 3: Run
package com.factorial;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/factorial")
public class FactorialServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
try {
// Get the number from the form
int number = Integer.parseInt(request.getParameter("number"));
// Validate the input
if (number < 0) {
throw new IllegalArgumentException("Number cannot be negative");
}
if (number > 20) {
throw new IllegalArgumentException("Number too large, maximum allowed is 20");
}
// Calculate factorial
long factorial = 1;
String calculation = "Calculation steps:<br>";
if (number == 0 || number == 1) {
factorial = 1;
calculation += number + "! = 1";
} else {
calculation += number + "! = " + number;
for (int i = number; i >= 1; i--) {
factorial *= i;
if (i != number) {
calculation += " × " + i;
}
}
calculation += " = " + factorial;
}
} catch (NumberFormatException e) {
displayError(out, "Please enter a valid number");
} catch (IllegalArgumentException e) {
displayError(out, e.getMessage());
}
}
The Servlet API is a Java technology for building web applications. Here's a practical example of a
basic Servlet:
Key components:
@WebServlet: Maps servlet to URL pattern
HttpServletRequest: Contains client request data
HttpServletResponse: Sends response to client
doGet/doPost: Handle HTTP GET/POST requests
To deploy, add this servlet to a Java web application in a servlet container like Tomcat. Access via:
http://localhost:8080/yourapp/hello?name=Dr.Sm.Badhusha
HelloServlet.java
package com.example;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.WebServlet;
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Get writer
PrintWriter out = response.getWriter();
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
Jakarta Servlet Example
package com.Jakarta;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
@WebServlet("/studentForm")
public class StudentServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("""
<html>
<body>
<h2>Student Registration</h2>
</table>
<br><input type="submit" value="Register">
</form>
</body>
</html>
""");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Reading servlet parameters
String id = request.getParameter("id");
String name = request.getParameter("name");
String course = request.getParameter("course");
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("""
<html>
<body>
<h2>Registration Successful</h2>
<p>Student ID: %s</p>
<p>Name: %s</p>
<p>Course: %s</p>
</body>
</html>
""".formatted(id, name, course));
}
}
HTTP Request/Response flow works with Servlets and JSP:
Project Structure:
CopyWebContent/
├── WEB-INF/
│ └── web.xml (if needed)
├── index.jsp
├── result.jsp
└── classes/
└── UserDataServlet.class
Key Components:
a) Index.jsp (Request Creation):
b) Request Parameters:
c) Request Attributes:
d) Response Types:
package com.HTTP_REQ_RES;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//UserDataServlet.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.WebServlet;
@WebServlet("/processUser")
public class UserDataServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Redirect GET requests to the input form
response.sendRedirect("index.jsp");
}
}
Project Setup:
Configuration:
The @WebServlet("/CookieServlet") annotation maps this servlet to the URL pattern "/CookieServlet"
Alternatively, you can configure it in web.xml if not using annotations
When a user first visits, they see a form to enter their name
After submitting, a cookie is created with their name
On subsequent visits, they'll see a welcome message with their name
They can logout, which deletes the cookie
Creating cookies
Setting cookie properties (expiration, path)
Reading cookies
Deleting cookies
Basic session management
package com.cookieservlet;
//Step 1: Required imports
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.WebServlet;
response.setContentType("text/html");
PrintWriter out = response.getWriter();
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals("user")) {
existingUser = cookie.getValue();
break;
}
}
}
// Step 8: Generate HTML response
out.println("<html>");
out.println("<head><title>Cookie Example</title></head>");
out.println("<body>");
if (existingUser != null) {
count+=1;
out.println("<font color=blue><h2>Welcome back, " + existingUser+"!</h2></font>");
out.println("<font color=magenta><h2>You have visited this page "+count+" times!</h2></font>");
}
// Step 9: Add option to delete cookie
// out.println("<form action='CookieServlet' method='post'>");
// out.println("<input type='submit' value='Logout'>");
// out.println("</form>");
else {
out.println("<h2>Welcome Guest!</h2>");
out.println("<form action='CookieServlet' method='get'>");
out.println("Enter your name: <input type='text' name='userName'>");
out.println("<input type='submit' value='Submit'>");
out.println("</form>");
}
out.println("</body></html>");
}
Setup Requirements:
Make sure you have a Java EE compatible web server (like Apache Tomcat)
Java Development Kit (JDK) installed
Servlet API in your project dependencies
Session Tracking
The servlet uses HttpSession to track user sessions It automatically creates a new session if one doesn't exist
using request.getSession(true) Stores and retrieves visit count information in the session
Displays session details like ID, creation time, and last access time
Deployment Steps:
Security Considerations:
SessionTrackingServlet.java
package com.sessiontracking;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.WebServlet;
import java.util.Date;
@WebServlet("/SessionTracker")
public class SessionTrackingServlet extends HttpServlet {
o/p
Java Server Pages
JavaServer Pages (JSP) is a server-side technology that allows you to create dynamic web content by
combining HTML with Java code. It's part of the Java EE (Enterprise Edition) platform and was designed
to make it easier for developers to build web applications.
Key aspects of JSP:
4. Dynamic Content Generation
5. JSP pages can generate dynamic content based on user input, database data, or other variables
JSP Tags:
Page-level instructions
Predefined functionality
Variables:
Control Statements:
If-Else:
<% if (user.isLoggedIn()) { %>
Welcome back!
<% } else { %>
Please log in.
<% } %>
Switch:
<%
switch(userType) {
case "admin": %>
<h1>Admin Panel</h1>
<% break;
case "user": %>
<h1>User Dashboard</h1>
<% break;
} %>
Loops:
For Loop:
<% for(int i = 0; i < 5; i++) { %>
<p>Item <%= i %></p>
<% } %>
While Loop:
<%
int i = 0;
while(i < items.size()) { %>
<li><%= items.get(i) %></li>
<% i++; } %>
Instance Methods:
<%!
public String formatDate(Date date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(date);
}
%>
Using Methods:
<p>Today's date: <%= formatDate(new Date()) %></p>
index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<form action="welcome.jsp">
Please Enter your name : <input type="text" name="uname"><br/>
<input type="submit" value="Start the session"><br/>
</form>
</body>
</html>
The name which is entered by user in the index page is displayed on the welcome.jsp page and it saves
the same variable in the session object so that it can be retrieved on any page till the session becomes
inactive.
welcome.jsp
<%
String name=request.getParameter("uname");
out.print("Welcome!"+name);
out.print("<br>Session has started ... "+name);
session.setAttribute("user",name);
out.print("<br>your name has been stored in session object");
session.setMaxInactiveInterval(60);
out.print("<br>One minute is set for the session expiry");
out.print("<br>Kindly press the following link to check it<br>");
%>
</body>
</html>
In second.jsp page, the value of variable is retrieved from the session and displayed.
second.jsp
<%
String name=(String)session.getAttribute("user");
if(name==null)
out.print("Sorry the session has ended");
else
out.print("Hello "+name);
%>
</body>
</html>
Cookies
Cookies are small pieces of data stored on the client's browser, which can be used to maintain
state information or user preferences across multiple requests.
Browser developers long ago recognized that HTTP’s statelessness poses a huge problem for
Web developers, and thus cookies were born. A cookie is a small piece of information that
browsers store on behalf of Web servers. Every time a browser requests a page from a certain
server, it gives back the cookie that it initially received.
Cookies are located in browser directories. They are basically a small piece of data sent from a website
and stored in the user’s web browser while the user is browsing and are mainly used for user
identification. That is why when you enter a website using cookies, you may be asked to fill out a
form providing personal information. This information is wrapped into a cookie and sent to your web
browser, which then stores the information for later use. Every time the user goes back to the same
website, the browser retrieves and sends this file to the website’s server.
Here's a brief overview of cookies
Any web app provides easy-to-use methods for setting and getting cookies.
Cookies can be set on the HttpResponse object.
Incoming cookies can be accessed via the request.COOKIES dictionary.
The session framework uses cookies to store a session ID, with the actual session data stored on
the server side.
1. Set a cookie:
Enter name, domain, and max age (try with 10 seconds)
Click "Add Cookie"
See confirmation with details
2. View cookie list:
Return to main page
Watch as the cookie automatically disappears after the specified time
List updates in real-time
3. Added Automatic Expiration:
Added JavaScript to refresh the page every second
Added logic to check and remove expired cookies based on their set time and max age
Stores cookie set time in seconds since epoch for accurate expiration calculation
4. Simplified Display:
Table now only shows Cookie Name, Domain, and Max Age
Added note about automatic updates
Set default max age to 10 seconds for easier testing
5. Enhanced Cookie Management:
Cookies automatically disappear from the list when they expire
No manual deletion required
Maintains accurate list of active cookies
<div class="form-group">
<tr><td><label>Max Age (seconds):</label></td>
<td><input type="number" name="maxAge" value="10" required>
</td></tr> </div>
</table>
<hr>
if (cookieList != null) {
// Remove expired cookies
Iterator<Map<String, String>> iterator = cookieList.iterator();
while (iterator.hasNext()) {
Map<String, String> cookie = iterator.next();
long setTime = Long.parseLong(cookie.get("setTime"));
int maxAge = Integer.parseInt(cookie.get("maxAge"));
if (currentTime > setTime + maxAge) {
iterator.remove(); // Remove expired cookie
continue;
}
}
session.setAttribute("cookieList", cookieList); // Update session with cleaned list
}
// Add to list
cookieList.add(cookieEntry);