An Introduction to Java Servlet
K. Yue April 15, 2001

Introduction

javac -classpath ./servlet.jar;./server.jar MyProg.java

Servlet Lifecycle

Writing Java Servlets

Defining Servlets

Example:   skeleton

import javax.servlet.*;
import javax.servlet.http.*;

public class MyIterativeServlet extends HttpServlet
                                implements SingleThreadModel {
   /* Servlet which handles client requests iteratively */
   ...
}

Example: SimpleHello.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class SimpleHello extends HttpServlet {
public void service(ServletRequest request, ServletResponse response)
   throws ServletException, IOException
   {
       response.setContentType("text/html");
       PrintWriter toClient = response.getWriter();
       toClient.println("<html>");
       toClient.println("<p>Hello, world</p>");
       toClient.println("</html>");
       toClient.close();
   }
}

javax.servlet.http.HttpServletResponse

Example: SetCookie.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
public class SetCookie extends HttpServlet {
   public void service(HttpServletRequest request, HttpServletResponse response)
       throws ServletException, IOException
   {   //  set a cookie
       String name = "last_visited";
       String value = (new Date()).toString();
       Cookie cookie = new Cookie(name, value);
       cookie.setMaxAge(1000000);
       response.addCookie(cookie);
       response.setContentType("text/html");
       PrintWriter toClient = response.getWriter();
       toClient.println("<html>");
       toClient.println("<p>A cookie has been set: ");
       toClient.println(name + " => " + value + ".");
       toClient.println("</html>");
       toClient.close();
   }
}

javax.servlet.http.HttpServletRequest

Example 1: ParameterSnoop.java

import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class ParameterSnoop extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
   res.setContentType("text/plain");
   PrintWriter out = res.getWriter();

   out.println("Query String:");
   out.println(req.getQueryString());
   out.println();

   out.println("Request Parameters:");
   Enumeration enum = req.getParameterNames();
   while (enum.hasMoreElements()) {
      String name = (String) enum.nextElement();
      String values[] = req.getParameterValues(name);
      if (values != null) {
         for (int i = 0; i < values.length; i++) {
            out.println(name + " (" + i + "): " + values[i]);
         }
      }
   }
}
}

Example: GetCookie.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

public class GetCookie extends HttpServlet {
public void service(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException
{ // get all cookies
   Cookie[] cookies = request.getCookies();
   String name = "";
   String value = "";
   response.setContentType("text/html");
   PrintWriter toClient = response.getWriter();
   toClient.println("<html>");
   if (cookies != null) {
      toClient.println("<p><ul>The following cookies found: ");
      for (int i=0; i<cookies.length; i++) {
         name = cookies[i].getName();
         value = cookies[i].getValue();
         toClient.println("<li>" + name + " => " + value + ".");
      }
      toClient.println("</ul>");
   }
   else {
      toClient.println("There is no cookie.");
   }
   toClient.println("</html>");
   toClient.close();
}
}

Handling HTTP Requests

Example: Hello.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Hello extends HttpServlet {
   public void doGet(HttpServletRequest req, HttpServletResponse res)
                throws ServletException, IOException {
    // Set the Content-Type header
    res.setContentType("text/html");

    // Return early if this is a HEAD method.  Note that doHead calls
    // doGet by default.
    if (req.getMethod().equals("HEAD")) return;

    PrintWriter out = res.getWriter();
    String name = req.getParameter("name");
    //  generate the dynamic HTML contents.
    out.println("<HTML>");
    out.println("<HEAD><TITLE>Hello, " + name + "</TITLE></HEAD>");
    out.println("<BODY>");
    out.println("Hello, " + name);
    out.println("</BODY></HTML>");
  }
  public void doPost(HttpServletRequest req, HttpServletResponse res)
                                throws ServletException, IOException {
    doGet(req, res);
  }
}

More details on Java Servlet Life-Cycle

Example: InitDestroyCounter.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class InitDestroyCounter extends HttpServlet {

  int count;
  String counterFileName = "InitDestroyCounter.initial";
  public void init(ServletConfig config) throws ServletException {
    // Always call super.init(config) first  (servlet mantra #1)
    super.init(config);

    // Try to load the initial count from our saved persistent state
    try {
      FileReader fileReader = new FileReader(counterFileName);
      BufferedReader bufferedReader = new BufferedReader(fileReader);
      String initial = bufferedReader.readLine();
      count = Integer.parseInt(initial);
      return;
    }
    catch (FileNotFoundException ignored) { }  // no saved state
    catch (IOException ignored) { }            // problem during read
    catch (NumberFormatException ignored) { }  // corrupt saved state
    String initial = getInitParameter("initial");
    try {
      count = Integer.parseInt(initial);
      return;
    }
    catch (NumberFormatException ignored) { } 
    // null or non-integer value

    // Default to an initial count of "0"
    count = 0;
  }

  public void doGet(HttpServletRequest req, HttpServletResponse res)
                               throws ServletException, IOException {
    //   Here, I change it to HTML.
    res.setContentType("text/html");
    PrintWriter out = res.getWriter();

    int local_count;
    synchronized(this) {
      local_count = ++count;
      if (count % 10 == 0) saveState();
    }
    out.println("<html><body bgcolor=#ccccff>" +
                "Since loading, this servlet has been accessed " +
                local_count + " times.  See you.</body></html>");
  }

  public void destroy() {
    saveState();
  }

  public void saveState() {
    // Try to save the accumulated count
    try {
      FileWriter fileWriter = new FileWriter(counterFileName);
      String initial = Integer.toString(count);
      fileWriter.write(initial, 0, initial.length());
      fileWriter.close();
      return;
    }
    catch (IOException e) {  // problem during write
      // Log the exception. 
    }
  }
}