CS396N - Web Programming |
Spring 2002 |
Chapter 19 - Server-Side Java Servlets |
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class ServletTemplateextendsHttpServlet
{
public void doGet(HttpServletRequest
request,
HttpServletResponse response)
throwsServletException,
IOException {
// Use "request" to
read incoming HTTP headers
// (e.g., cookies)
and query data from HTML forms.
// Use "response" to
specify the HTTP response status
// code and headers
(e.g. the content type, cookies).
PrintWriter out = response.getWriter();
// Use "out" to send
content to browser
}
}
Plain Text Generator Servlet
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
/* Very simplistic servlet that generates plain text. */
public class HelloWorld extends HttpServlet
{
public void doGet(HttpServletRequest
request,
HttpServletResponse response)
throws
ServletException, IOException {
PrintWriter out = response.getWriter();
out.println("Hello
World");
}
}
package cwp;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
/* Simple servlet that generates HTML. */
public class HelloWWW extends HttpServlet
{
public void doGet(HttpServletRequest
request,
HttpServletResponse response)
throws ServletException, IOException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String docType =
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD
HTML 4.0 " +
"Transitional//EN\">\n";
out.println(docType +
"<HTML>\n" +
"<HEAD><TITLE>Hello WWW</TITLE></HEAD>\n" +
"<BODY>\n" +
"<H1>Hello WWW</H1>\n" +
"</BODY></HTML>");
}
}
Servlet Using Initialization Parameters
package cwp;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
/* Example using servlet initialization. Here, the message
* to print and the number of times the message should
be
* repeated is taken from the init parameters.
*/
public class ShowMessage extends
HttpServlet
{
private String message;
private String defaultMessage = "No message.";
private int repeats = 1;
public void init() throws ServletException {
ServletConfig config
= getServletConfig();
message = config.getInitParameter("message");
if (message == null) {
message = defaultMessage;
}
try {
String
repeatString = config.getInitParameter("repeats");
repeats = Integer.parseInt(repeatString);
} catch(NumberFormatException nfe) {
// NumberFormatException handles
case where repeatString
// is null *and* case where it
is in an illegal format.
}
}
public void doGet(HttpServletRequest
request,
HttpServletResponse response)
throws ServletException,
IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "The ShowMessage Servlet";
out.println(ServletUtilities.headWithTitle(title)
+
"<BODY BGCOLOR=\"#FDF5E6\">\n" +
"<H1 ALIGN=\"CENTER\">" + title + "</H1>");
for(int i=0; i<repeats;
i++) {
out.println("<B>" + message
+ "</B><BR>");
}
out.println("</BODY></HTML>");
}
}
Reading Three Explicit Parameters
package cwp;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
/** Simple servlet that reads three parameters
from the
* form data.
* <P>
* Taken from Core Web Programming
Java 2 Edition
* from Prentice Hall and Sun
Microsystems Press,
* http://www.corewebprogramming.com/.
* May be freely used or adapted.
*/
public class ThreeParams extends HttpServlet
{
public void doGet(HttpServletRequest
request,
HttpServletResponse response)
throws
ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "Reading
Three Request Parameters";
out.println(ServletUtilities.headWithTitle(title)
+
"<BODY BGCOLOR=\"#FDF5E6\">\n" +
"<H1 ALIGN=\"CENTER\">" + title + "</H1>\n" +
"<UL>\n" +
" <LI><B>param1</B>: "
+ request.getParameter("param1")
+ "\n" +
" <LI><B>param2</B>: "
+ request.getParameter("param2")
+ "\n" +
" <LI><B>param3</B>: "
+ request.getParameter("param3")
+ "\n" +
"</UL>\n" +
"</BODY></HTML>");
}
}
Sample Code
package cwp;
import javax.servlet.*;
import javax.servlet.http.*;
public class ServletUtilities {
// This is only a source code fragment
/** Given a string, this method replaces all occurrences
of
* '<' with '<', all occurrences
of '>' with
* '>', and (to handle cases that occur
inside attribute
* values), all occurrences of double quotes
with
* '"' and all occurrences of '&'
with '&'.
* Without such filtering, an arbitrary string
* could not safely be inserted in a Web page.
*/
public static String filter(String input) {
StringBuffer filtered = new StringBuffer(input.length());
char c;
for(int i=0; i<input.length(); i++) {
c = input.charAt(i);
if (c == '<') {
filtered.append("<");
} else if (c == '>') {
filtered.append(">");
} else if (c == '"') {
filtered.append(""");
} else if (c == '&') {
filtered.append("&");
} else {
filtered.append(c);
}
}
return(filtered.toString());
}
}
Making a Table of Request Headers
package cwp;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
/** Shows all the request headers sent on this request.
* <P>
* Taken from Core Web Programming Java 2 Edition
* from Prentice Hall and Sun Microsystems Press,
* http://www.corewebprogramming.com/.
* May be freely used or adapted.
*/
public class ShowRequestHeaders extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "Servlet Example: Showing
Request Headers";
out.println(ServletUtilities.headWithTitle(title)
+
"<BODY BGCOLOR=\"#FDF5E6\">\n" +
"<H1 ALIGN=\"CENTER\">" + title + "</H1>\n" +
"<B>Request Method: </B>" +
request.getMethod() + "<BR>\n" +
"<B>Request URI: </B>" +
request.getRequestURI() + "<BR>\n" +
"<B>Request Protocol: </B>" +
request.getProtocol() + "<BR><BR>\n"
+
"<TABLE BORDER=1 ALIGN=\"CENTER\">\n" +
"<TR BGCOLOR=\"#FFAD00\">\n" +
"<TH>Header Name<TH>Header Value");
Enumeration headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()) {
String headerName = (String)headerNames.nextElement();
out.println("<TR><TD>"
+ headerName);
out.println("
<TD>" + request.getHeader(headerName));
}
out.println("</TABLE>\n</BODY></HTML>");
}
/** Let the same servlet handle both GET and POST. */
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
doGet(request, response);
}
}
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.net.*;
/** Servlet that takes a search string,
number of results per
* page, and a search engine
name, sending the query to
* that search engine. Illustrates
manipulating
* the response status line.
It sends a 302 response
* (via sendRedirect) if it
gets a known search engine,
* and sends a 404 response
(via sendError) otherwise.
*/
public class SearchEngines extends HttpServlet
{
public void doGet(HttpServletRequest
request,
HttpServletResponse response)
throws
ServletException, IOException {
String searchString
= request.getParameter("searchString");
if ((searchString ==
null) ||
(searchString.length() == 0)) {
reportProblem(response,
"Missing search string.");
return;
}
// The URLEncoder changes
spaces to "+" signs and other
// non-alphanumeric
characters to "%XY", where XY is the
// hex value of the
ASCII (or ISO Latin-1) character.
// Browsers always
URL-encode form values, so the
// getParameter method
decodes automatically. But since
// we're just passing
this on to another server, we need to
// re-encode it.
searchString = URLEncoder.encode(searchString);
String numResults =
request.getParameter("numResults");
if ((numResults ==
null) ||
(numResults.equals("0")) ||
(numResults.length() == 0)) {
numResults
= "10";
}
String searchEngine
=
request.getParameter("searchEngine");
if (searchEngine ==
null) {
reportProblem(response,
"Missing search engine name.");
return;
}
SearchSpec[] commonSpecs
= SearchSpec.getCommonSpecs();
for(int i=0; i<commonSpecs.length;
i++) {
SearchSpec
searchSpec = commonSpecs[i];
if (searchSpec.getName().equals(searchEngine))
{
String url =
searchSpec.makeURL(searchString, numResults);
response.sendRedirect(url);
return;
}
}
reportProblem(response,
"Unrecognized search engine.");
}
private void reportProblem(HttpServletResponse
response,
String message)
throws
IOException {
response.sendError(response.SC_NOT_FOUND,
"<H2>" + message + "</H2>");
}
public void doPost(HttpServletRequest
request,
HttpServletResponse response)
throws
ServletException, IOException {
doGet(request, response);
}
}
Additional Code
package cwp;
/** Small class that encapsulates how to construct a
* search string for a particular search engine.
*/
public class SearchSpec {
private String name, baseURL, numResultsSuffix;
private static SearchSpec[] commonSpecs =
{ new SearchSpec("google",
"http://www.google.com/search?q=",
"&num="),
new SearchSpec("infoseek",
"http://infoseek.go.com/Titles?qt=",
"&nh="),
new SearchSpec("lycos",
"http://lycospro.lycos.com/cgi-bin/" +
"pursuit?query=",
"&maxhits="),
new SearchSpec("hotbot",
"http://www.hotbot.com/?MT=",
"&DC=")
};
public SearchSpec(String name,
String baseURL,
String numResultsSuffix) {
this.name = name;
this.baseURL = baseURL;
this.numResultsSuffix = numResultsSuffix;
}
public String makeURL(String searchString,
String numResults) {
return(baseURL + searchString +
numResultsSuffix + numResults);
}
public String getName() {
return(name);
}
public static SearchSpec[] getCommonSpecs() {
return(commonSpecs);
}
}
HTML Code
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML
4.0 Transitional//EN">
<!--
Front end to servlet that redirects request
to search engines.
-->
<HTML>
<HEAD>
<TITLE>Searching the Web</TITLE>
</HEAD>
<BODY BGCOLOR="#FDF5E6">
<H1 ALIGN="CENTER">Searching the Web</H1>
<FORM ACTION="/servlet/cwp.SearchEngines">
<CENTER>
Search String:
<INPUT TYPE="TEXT"
NAME="searchString"><BR>
Results to Show Per
Page:
<INPUT TYPE="TEXT"
NAME="numResults"
VALUE=10 SIZE=3><BR>
<INPUT TYPE="RADIO"
NAME="searchEngine"
VALUE="google">
Google |
<INPUT TYPE="RADIO"
NAME="searchEngine"
VALUE="infoseek">
Infoseek |
<INPUT TYPE="RADIO"
NAME="searchEngine"
VALUE="lycos">
Lycos |
<INPUT TYPE="RADIO"
NAME="searchEngine"
VALUE="hotbot">
HotBot
<BR>
<INPUT TYPE="SUBMIT"
VALUE="Search">
</CENTER>
</FORM>
</BODY>
</HTML>