Servlet Basics
Servlets are Java programs running on a web server that produce results viewed remotely on a web server. Servlets has the same purpose that CGI or PHP had in the past. We shall describe how Servlets works with some examples. You will also learn about Servlet Request and Response Model, Servlet Life Cycle, Servlet Scope Objects and Error Handling.
Servlet Request and Response Model
Note that although there are two types of servlets (GenericServlet and HttpServlet), we will discuss here only HttpServlet since GenericServlet can be used for advanced needs. The important thing here is that you should use GenericServlet if you want your servlet to response in another protocol rather than HTTP.

Figure-1 Request and Response Model of HttpServlets
HttpServlets are servlets that respond to the HTTP protocol requests which is used by web servers to return us the requested web pages. We need to extend javax.servlet.http.HttpServlet class to write a servlet. We should select one of doGet or doPost methods for overriding. This choice depends on what type of http request (GET request or POST request) we are expecting. GET request is generally only used to retrieve data from the web server, however POST request are used for more complex requests like storing data. We will generally override both methods in our tutorials and call a processRequest method to handle both types of request.
Let’s start with our first servlet which is called HelloWorld1 servlet. HelloWorld1 servlet will just print “Hello World1” message.
|
The source code shown in this section can be found in HelloWorld1 project.
|
Figure-2 shows overridden doGet and doPost methods in our HelloWorld1 servlet. Both methods call processRequest method to handle the http requests. Figure-3 shows processRequest method.
|
/** Handles the HTTP < code >GET< /code > method.
* @param request servlet request
* @param response servlet response
*/
protected void doGet(HttpServletRequest request,
ttpServletResponse response)
throws ServletException, IOException {
..........processRequest(request, response);
}
/** Handles the HTTP < code >POST< /code > method.
* @param request servlet request
* @param response servlet response
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
..........processRequest(request, response);
}
|
Figure-2 Overridden doGet and doPost methods in HelloWorld1 servlet
|
public class HelloWorld1 extends HttpServlet {
.
/** Processes requests for both HTTP < code >GET< /code > and < code >POST< /code > methods.
* @param request servlet request
* @param request servlet response
*/
.
protected void processRequest (HttpServletRequest request, HttpServletResponse response)
.....throws ServletException, IOException {
.....response.setContentType(“text/html;charset=UTF-8”);
..........PrintWriter out = response.getWriter();
..........Out.println(“< html >”);
..........Out.println(“< head >”);
..........Out.println(“< title >Servlet HelloWorld1< /title >”);
..........Out.println(“< /head >”);
..........Out.println(“< body >”);
..........Out.println(“< h1 >HelloWorld1< /h1 >”);
..........Out.println(“< /body >”);
..........Out.println(“< /html >”);
..........Out.close();
}
|
Figure-3 ProcessRequest method used in HelloWorld1 servlet
We get the PrintWriter object from HttpServletResponse object to write the contents of the html page to other side. After writing our content, we close the PrintWriter object. You will get a result similar to shown in Figure-4 after you run the project.

Figure-4 HelloWorld1 servlet running in a browser
Servlet Life Cycle
Servlet container creates only one instance of each servlet but the request of each user is handled with a separate thread. Each thread then calls doGet or doPost methods. This idea is shown in Figure-5.

Figure-5 A way of handling Servlet requests
The init method of the servlet is called when the servlet is first created and each time the server receives a request for a servlet, the server spawns a new thread calls service method.
The service method checks the HTTP request type (GET, SET, PUT, DELETE, etc.) and calls doGet, doPost, doPut, doDelete, etc. method as appropriate.
Finally, the server may decide to remove a previous loaded servlets. In this case, the server calls destroy method of the servlet.
Servlet Scope Objects
There are four scope objects in servlets which enables sharing information between web components. The scope objects and their corresponding Java classes are listed below:
• Web Context – javax.servlet.ServletContext
• Session – javax.servlet.http.HttpSession
• Request – javax.servlet.HttpServletRequest
• Page – javax.servlet.jsp.PageContext
You can get attribute values from servlet scope objects using getAttribute method and set new values of attributes using setAttribute method. For example, you can get the client’s IP address by calling getRemoteAddr method of HttpServletRequest class.
Let’s develop an example on how to use servlet scope objects. In this example, we will print the information about the server which hosts our servlet.
|
The source code shown in this section can be found in ServerInfoServlet project.
|
In our example, we will use the following methods to get the information about the server which hosts the client:
public String getServerName()
public String getServerPort()
public String getServletContext().getServerInfo()
Figure-6 shows processRequestMethod of ServerInfoServlet servlet and Figure-7 shows the output of the servlet in a browser.
| ..........
public class ServerInfoServlet extends HttpServlet {
..........
/** Processes requests for both HTTP < code >GET< /code > and < code >POST< /code > methods.
* @param request servlet request
* @param request servlet response
*/
..........
protected void processRequest (HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
..........response.setContentType(“text/html;charset=UTF-8”);
..........PrintWriter out = response.getWriter();
..........
..........Out.println(“< html >”);
..........Out.println(“< head >”);
..........Out.println(“< title >Servlet ServerInfoServlet< /title >”);
..........Out.println(“< /head >”);
..........
..........Out.println(“< body >”);
..........Out.println(“< p >Server Name:+request.getServerName()+”< br >”);
..........Out.println(“
Server
Port :+request.getServerPort()+”< br >”);
..........Out.println(“Server Path:+request.getServerPath()+”< /p >”);
..........
..........Out.println(“< /body >”);
..........Out.println(“< /html >”);
..........
..........Out.close();
}
..........
|
Figure-6 ProcessRequest method used in ServerInfoServlet servlet

Figure-7 ServerInfoServlet servlet running in a browser
Error Handling
There are two ways to handle errors in servlets. You can send an error message or throw a ServletException.
For example, if a servlet can not find the requested file, it can display a 404 (“File Not Found”) message to the user by using the following command instead of directly writing the output to the PrintWriter object:
response.sendError(HttpServletResponse.SC_NOT_FOUND)
There are several other HTTP error codes which can be sent to the client. Some of the important ones are listed in Table-1. You can search on the internet about the details of those messages if they are not clear for you.
|
Mnemonic
|
Code
|
Message
|
|
SC_OK
|
200
|
OK
|
|
SC_NO_CONTENT
|
204
|
No Content
|
|
SC_MOVED_PERMANENTLY
|
301
|
Moved Permanently
|
|
SC_MOVED_ TEMPORARILY
|
302
|
Moved Temporarily
|
|
SC_ UNAUTHORIZED
|
401
|
Unauthorized
|
|
SC_NOT_FOUND
|
404
|
Not Found
|
|
SC_SERVICE_UNAVAILABLE
|
503
|
Service Unavailable
|
Table-1 Some important HTTP error codes
Let’s develop an example for sending an error code from a servlet. The servlet name is HttpErrorServlet and it is used to send a SC_NOT_FOUND (please see the table above) which is generally known as 404 error.
|
The source code shown in this section can be found in HttpErrorServlet project.
|
The code for the HttpErrorServlet servlet is shown in Figure-8. As you will notice, we did not get OutputStream from the request object this time since we don’t write any message and will just send a 404 error using sendError method of the response object. The output of the servlet is shown in Figure-9.
|
public class HttpErrorServlet extends HttpServlet {
.
/** Processes requests for both HTTP < code >GET< /code > and < code >POST< /code > methods.
* @param request servlet request
* @param response servlet response
*/
protected void processRequest(HttpServletRequest request,
ttpServletResponse response)
throws ServletException, IOException {
.......... response.setContentType("text/html;charset=UTF-8");
.......... response.sendError(HttpServletResponse.SC_NOT_FOUND);
}
/** Handles the HTTP < code >GET< /code > method.
* @param request servlet request
* @param response servlet response
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
..........processRequest(request, response);
}
..........
|
Figure-8 ProcessRequest method used in HttpErrorServlet servlet

Figure-9 HttpErrorServlet servlet running in a browser
There are two possible exception classes to use when handling errors using ServletException: ServletException and its derivative UnavailableException.
ServletException is a general purpose exception and the handling mechanism for it depends on the web server used. UnavailableException exception is a bit more useful, because if a servlet throws this exception, it is notifying the server that it is unavailable to service requests. You can throw these exceptions with the following way:
throw new UnavailableException(this, "Try back in two minutes");
Links
• Servlet Technology Homepage - http://java.sun.com/products/servlet/
Trackback(0)
|