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
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
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>");
}
}