An Introduction to Java Servlet
K. Yue November 25, 2001
copyright 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. 
    }
  }
}

Example: NasaLister.java

This servlet lists the information on the selected NASA support area. The program should use a text file with one record per line. An example input file: NasaListerData.txt. The field of each record is separated by a comma. The fields are sensor symbol, support area, description and class code respectively.

There are two HTTP parameters: filename and area. Filename is the name of the data text file (e.g. NasaListerData.txt) and area is the support area (e.g. Space Station). There is no erro handling in this program.

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

public class NasaLister 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.
   if (req.getMethod().equals("HEAD")) return;

    // get the parameter values of filename and area.
   String filename = req.getParameter("filename");
   String inputArea = req.getParameter("area");

    // Hack: JRun problem with getPathTranslated()
   String path = "F:\\courses\\CSCI4230\\Fall2001\\f01demo1\\jrun\\WEB-INF\\classes\\";
   // Prepare file name.
   // String path = req.getPathTranslated();
   // if (path == null) {
   // path = getServletConfig().getServletContext().getRealPath("/Pa");
   // }
   filename = path.substring(0,path.lastIndexOf(File.separatorChar)+1) + filename;

    String result = "";
   // Try to load and read the data file.
   try {
      FileReader fileReader = new FileReader(filename);
      BufferedReader bufferedReader = new BufferedReader(fileReader);
      String inline;
      StringTokenizer st;
      String symbol, area, desc, classCode;
      while ((inline = bufferedReader.readLine()) != null) {
         st = new StringTokenizer(inline,",");
         // Assume no error in input line.
         // Get data in the line.
         symbol = (st.hasMoreTokens())? (st.nextToken()) : "";
         area = (st.hasMoreTokens())? (st.nextToken()) : "";
         desc = (st.hasMoreTokens())? (st.nextToken()) : "";
         classCode = (st.hasMoreTokens())? (st.nextToken()) : "";
         if (area.equalsIgnoreCase(inputArea)) {
            result = result + "<TR><TD>" + symbol
               + "</TD><TD>" + desc
               + "</TD><TD>" + classCode
               + "</TR>";
         }
      }
      if (result.equals("")) {
         result = "There are no areas in the data file matching the " +
               "input area <SPAN STYLE='color:blue'>" +
               inputArea + "</SPAN>. Please try again.";
      }
      else {
         // construct the entire table using the
         // cells so far.
         result = "<TABLE BORDER=1 BGCOLOR=#FFFFCC>\n"
            + "<TR><TD><SPAN STYLE='color:blue'>Symbol</SPAN></TD>"
            + "<TD><SPAN STYLE='color:blue'>Description</SPAN></TD>"
            + "<TD><SPAN STYLE='color:blue'>Class Code</SPAN></TD></TR>"
            + result
            + "</TABLE>";
      }
   }
   catch (FileNotFoundException ignored) { }
   catch (IOException ignored) { }
   if (result.equals("")) {
      result = "Sorry, the data file cannot be open." + "Filename = " + filename +       "<p>";
   }

    // Print result.
   PrintWriter out = res.getWriter();
   out.println("<HTML>");
   out.println("<HEAD><TITLE>Search Result</TITLE></HEAD>");
   out.println("<BODY>");
   out.println("<H2 STYLE='color:blue'>Result of searching:</H2><P>");
   out.println(result);
   out.println("</BODY></HTML>");
}
}