Transcript servlets
COMP201 Java Programming
Part III: Advanced Features
Topic 15: Servlets
Materials Based on The Java Tutorial
http://java.sun.com/docs/books/tutorial//servlets/
COMP201 Topic 15 / Slide 2
Outline
Introduction
A simple servlet
General information about servlets
HTTP Servlets
Session tracking and cookies
Running servlets
COMP201 Topic 15 / Slide 3
Introduction
Servlets are modules that extend (Java-enabled web)
servers.
E.g. Respond to client requests by consulting a database
Most widely used within HTTP servers.
Duke’s Book store
COMP201 Topic 15 / Slide 4
Introduction
Traditionally, HTTP servers handle
client requests by using CGI (common
gateway interface) scripts.
1.
User fills out a form and submit.
2.
HTTP server gets URL requests from
the net.
3.
HTTP server finds the CGI script
specified in the HTML file, runs it with
parameters from requesting URL
4.
HTTP server takes output from the
CGI program (most often output is
HTML text), fixes it up with a full
complete HTTP header, and sends it
back to the original requesting client
HTML:
<form action=“cgi_bin/rpe"
method=POST>
First Name: <input type=text size=20
name=firstname>
Last Name: <input type=text size=20
name=lastname>
<input type=submit>
COMP201 Topic 15 / Slide 5
Introduction
Advantages of servlets (over CGI scripts)
More efficient
– VM always running, servlet objects persist instead of being continually
created/destroyed as CGI processes are
More secure
– SecurityManager can constrain servlets in manner similar to
applets
Portable: written in Java, while CGI scripts in C, Perl, shell script …
State-conscious
– Can track session information easily.
Can access vast Java packages such as networking, threads, etc.
COMP201 Topic 15 / Slide 6
Servlet vs. Applet
Servlets are to servers what applets are to browsers: small Java
programs compiled to bytecode that can be loaded dynamically and that
extend the capabilities of the host.
But:
Applets run by browser, servlets run by server.
Applets are “client-side java”, servlets are “server-side java”.
Applets makes appearance of web pages alive, servlets makes
contents of web pages dynamic.
Unlike applets, however, servlets have no graphical user interface.
Implement only back-end processing.
COMP201 Topic 15 / Slide 7
A Simple Servlet
import java.io.*;
import javax.servlet.*;
public class SimpleGenericServlet extends GenericServlet
{
public void service (ServletRequest request,
ServletResponse response)
throws ServletException, IOException
{
response.setContentType("text/plain");
PrintWriter out = response.getWriter();
out.println("Hello World");
out.close();
}
}
Note: no main method. Servlet run by server, just as applet run
by browser
COMP201 Topic 15 / Slide 8
A Simple Servlet
service: The most important method in a servlet,
Determines what the servlet does.
Invoked automatically when a request comes in.
Needs to be overridden.
It takes two arguments:
service (ServletRequest request,
ServletResponse response)
ServletRequest and ServletResponse are interfaces defined
by the javax.servlet
Get information about a request from the ServletRequest
object request.
Get information about a response via the ServletResponse
object response.
COMP201 Topic 15 / Slide 9
General Information about Servlets
Architecture of package
javax.servlet
Servlet interface: declares servlet methods
(init, service, etc.)
GenericServlet implements Servlet
HttpServlet subclass adds features specific to
HTTP
Technically, a servlet is a program that extends
either GenericServlet or HttpServlet.
COMP201 Topic 15 / Slide 10
General Information about Servlets
Servlet Life Cycle
Servlets are controlled by servers
1.
2.
3.
A server loads and initializes the servlet
The servlet handles zero or more client requests
The server terminates the servlet
COMP201 Topic 15 / Slide 11
Servlet Life Cycle
Methods
public void init():
Called only once when servlet is being created.
Good place for set up, open Database, etc.
public void service():
Called once for each request.
In HttpServlet, it delegates requests to doGet, doPost, etc.
public void destroy():
Called when server decides to terminate the servlet.
Release resources.
COMP201 Topic 15 / Slide 12
HTTP Servlets
Subclasses of javax.servlet.http.HttpSerlvet
For HTTP requests.
HTTP requests include
GET, conditional GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS
The default is GET.
Type of request specified in HTML file:
<form action="/py/maps.py?Pyt=Tmap&YY=28457" method=GET> …
</form>
<form method=POST action="/cgi-bin/ipc/idbsprd"> … </form>
COMP201 Topic 15 / Slide 13
HTTP Servlets
Classes and interfaces in javax.servlet.http include
HttpServlet extends GenericServlet
HttpServletRequest extends ServletRequest
HttpServletResponse extends ServletResponse
…
HttpServlet class has already overridden the service method to
delegate requests to special purpose methods such as doGet and
doPost.
Don’t override the service method when sub classing
HttpServlet. Instead, refine the special purpose methods, mostly
doGet and doPost.
COMP201 Topic 15 / Slide 14
HTTP Servlets
Methods of HttpServlet and HTTP requests
Methods
HTTP Requests
Comments
doGet
GET, HEAD
Usually overridden
doPost
POST
Usually overridden
doPut
PUT
Usually not overridden
doOptions
OPTIONS
Almost never overridden
doTrace
TRACE
Almost never overridden
All methods take two arguments: an HttpServletRequest object
and an HttpServletResponse object.
Return a BAD_REQUEST (400) error by default.
COMP201 Topic 15 / Slide 15
HTTP Servlets
HttpServletRequest Objects
Provide access to HTTP header data and the arguments of the request.
Values of individual parameters
getParameterNames method provides the names of the
parameters
getParameter method returns the value of a named parameter.
getParameterValues method returns an array of all values of a
parameter if it has more than one values.
Parameters and their values comes as a stream. Need to parse yourself.
For HTTP GET requests, getQueryString method returns a String
of raw data from the client.
For HTTP POST, PUT, and DELETE requests,
getReader method returns a BufferedReader for reading
text raw data.
getInputStream method returns a ServletInputStream
for reading binary raw data
COMP201 Topic 15 / Slide 16
HTTP Servlets
HttpServletResponse Objects
Provide two ways of returning data to the user:
getWriter method returns a PrintWriter for sending text data to
client
getOutputStream method returns a ServletOutputStream for
sending binary data to client.
Need to close the Writer or ServletOutputStream after you
send the response.
HTTP Header Data
Must set HTTP header data before you access the Writer or
OutputStream.
HttpServletResponse interface provides methods to access the
header data.
For example, the setContentType method sets the content type.
(This header is often the only one manually set.)
Handling GET requests: Override the doGet method
public class BookDetailServlet extends HttpServlet
{
public void doGet (HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
...
// set content-type header before accessing the Writer
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println(...); // then write the response
//Get the identifier of the book from request
String bookId = request.getParameter("bookId");
if (bookId != null)
{ out.println( information about the book );}
out.close();
……
Try getRequest.html and getRequest2.html
BookDetailServlet.java in bookstore example
Handling POST requests: Override the doGPost method
public class ReceiptServlet extends HttpServlet
{
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
...
// set content type header before accessing the Writer
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println(...); // then write the response
out.println("<h3>Thank you for … " +
request.getParameter("cardname") +
...);
out.close();
}
Try postRequest.html
ReceiptServlet.java in bookstore
example
COMP201 Topic 15 / Slide 19
Session Tracking
Motivation
In the Duke’s Bookstore example, suppose a client has selected
several books. (Do this and check the page produced by CatalogServlet.)
Problem 1:
The client requests
ShowCartServlet to show the books in his/her shopping cart.
Or CashierSerlvet to buy the books.
Question: How do ShowCartServlet or CashierSerlvet know the
selected books?
Problem 2:
The client decides to leave the bookstore and visit some other pages.
Question: When the client comes back and makes further requests, how
do the servlets know the books that have been selected previously?
COMP201 Topic 15 / Slide 20
Session Tracking
Session tracking is a mechanism that servlets use to maintain state
about a series of requests
From the same user (that is, requests originating from the same
browser)
Across some period of time (30 minutes for the Java Web Server).
Solution to Problem 2.
Sessions are shared among the servlets accessed by the same
client.
Solution to Problem 1.
COMP201 Topic 15 / Slide 21
Session Tracking
To use session tracking,
Get a session (a HttpSession object) from the request.
HttpSession getSession(boolean create)
HttpSession session = request.getSession(true);
Do this before accessing response streams.
Store or get data from the HttpSession object.
public void putValue(String name, Object obj)
public Object getValue(String name).
Invalidate the session (optional).
Manually: Session.invalidate()
Automatically when no request after certain time.
public void doGet(HttpServletRequest req,
HttpServletResponse resp)
throws ServletException, IOException
{ resp.setContentType("text/html");
HttpSession session = req.getSession(false);
PrintWriter out = resp.getWriter();
out.println("<HTML><BODY><h1>Count me!</h1><HR>");
if (session == null)
{
out.println("Welcome, I don't believe we've met!");
session = req.getSession(true);
session.putValue("Count", new Integer(1));
out.println(”I think of you as "+ session.getId());
} else
{ int n=((Integer)session.getValue("Count")).intValue();
out.println("You again? ” + session.getId());
out.println(”That makes " + n + " visits!”);
session.putValue("Count", new Integer(n + 1));
}
out.println("</BODY></HTML>");
out.close();
} //HelloAgainServlet.java
public void doGet (HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
// Get the user's session and shopping cart
HttpSession session = request.getSession(true);
ShoppingCart cart =
(ShoppingCart)session.getValue(session.getId());
// If the user has no cart, create a new one
if (cart == null) {
cart = new ShoppingCart();
session.putValue(session.getId(), cart);}
//Only one piece of data
// set content-type header before accessing the Writer
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println(…) // then write the data of the response
// Additions to the shopping cart
String bookToAdd = request.getParameter("Buy");
if (bookToAdd != null) {
BookDetails book =
frontEnd.getBookDetails(bookToAdd);
cart.add(bookToAdd, book); …. // add book to cart
}
CatalogServlet.java
COMP201 Topic 15 / Slide 25
Cookies
A way for servlet to send some information to client for storage and
later retrieval.
Each cookie is a name=value pair.
Servlets send cookies to clients by adding fields to HTTP response
headers.
Clients automatically return cookies by adding fields to HTTP request
headers.
Cookies returned to a server. Cookies shared among servlets on the
server accessed by the same client.
Cookies can be used for
Session tracking. HttpSession implemented using cookies.
Persistent state. E.g. name, address, email address. When user access
some servlets again, no need to provide such information one more
time.
COMP201 Topic 15 / Slide 26
Cookies
Cookies are objects of class javax.servlet.http.Cookie
To send a cookie,
1.
2.
3.
Create a Cookie object
Cookie c = new Cookie(name, value);
Set attributes if necessary
c.setMaxAge(30); // expire after 30 seconds
Send the cookie
response.addCookie(c);
To get information from a cookie,
1.
2.
Retrieve all the cookies from the user's request
Cookie[] cookies = request.getCookies();
Find the cookie that you are interested in and get its value
for (int i = 0; i < cookies.length; i++) {
String name = cookies[i].getName();
String value = cookies[i].getValue();
}
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("Cookies received from client:<br>");
Cookie[] cookies = request.getCookies();
for (int i = 0; i < cookies.length; i++) {
Cookie c = cookies[i];
String name = c.getName();
String value = c.getValue();
out.println(name + " = " + value + "<br>");
}
out.println("<br>Cookies sent to client:><br>");
String name = request.getParameter("cookieName");
if (name != null && name.length() > 0) {
String value =
request.getParameter("cookieValue");
Cookie c = new Cookie(name, value);
c.setMaxAge(30);
response.addCookie(c);
out.println(name + " = " + value + "<br>");
}} // CookieServlet.java
COMP201 Topic 15 / Slide 28
Running Servlets
1.
Download and install Java Servlet development kit
Several versions are available: JSDK 2.0, JSDK 2.1, and Java
Servlet 2.3.
We will use JSDK 2.1.
2.
Compile servlet
3.
Configure server for servlets
4.
Place servlet at appropriate location
5.
Call it from browser or HTML file
COMP201 Topic 15 / Slide 29
Running Servlets
Download JavaServer Web Development kit JSWDK1.0.1 from
http://java.sun.com/products/servlet/archive.html
A package that contains JavaServer Pages 1.0.1
and the JSDK 2.1
Installation instructions for Solaris (TA will discuss installation for Windows):
Uncompress the file obtained to get a tar file.
Expand the tar file. You will get a subdirectory zzz/jswdk1.0.1, where zzz is the directory where you keep the tar file.
The subdirectory contains all files in the JSWDK1.0.1 package.
Add two ".jar" files into the classpath in .cshrc_user:
zzz/jswdk-1.0.1/lib/servlet.jar,
zzz/jswdk-1.0.1/webserver.jar
Now we should be able to compile SimpleGenericSerlvet.java
using javac
COMP201 Topic 15 / Slide 30
Compiling and Running Servlets
Configure server for servlets:
By system administrator for standard HTTP servers
We will use the HTTP server that comes with JSDK 2.1
Setting servlet properties:
Modify file
zzz/jswdk-1.0.1/webpages/WEB-INF/servlets.properties
Name servlet (for convenience)
simple.code=SimpleGenericServlet
2.
Initialize parameters required by servlet
Starting and stopping server
1.
zzz/jswdk-1.0.1/startserver
zzz/jswdk-1.0.1/stopserver
Notes:
1.
By default, server runs on localhost at port 8080.
2.
Document root at zzz/jswdk-1.0.1/webpages
3.
Can change those in zzz/jswdk-1.0.1/webserver.xml
COMP201 Topic 15 / Slide 31
Compiling and Running Servlets
Accessing the server
Web pages should be placed under document root.
2.
Servlets (class files) should be placed under
Document root/WEB-INF/servlets/.
Example: Place SimpleGenericServlet.class under the servlets
subdirectory and you can access it from browser:
http://localhost:8080/servlet/SimpleGenericSerlvet or
http://localhost:8080/servlet/simple
1.
NOTE:
When client requests a servlet, server creates a servlet object. The object
hangs around until server stops its (which usually happens when server
shuts down).
To reload a servlet, stop and restart server! (This is the limitation of the HTTP
server that comes with JSDK 2.1. Normal web servers reload modified
servlets automatically)
COMP201 Topic 15 / Slide 32
Running Servlets
One can call servlets by the following ways:
Calling a servlet directly by typing the URL into a browser’s location window
http://machine-name:port/servlet/servlet-name
http:/localhost:8080/servlet/bookstore
Calling servlets from an HTML page by put the URL in HTML Tags:
<a href=“http://localhost:8080/servlet/cashier>Check Out </a>
< form action = http://localhost:8080/servlet/receipt method = post”>
Calling Servlets from Servlets:
1.
Make an Http request of another servlet
2.
Call another servlet’s public methods directly, if the two servlets run
within the same server:
BookDBServlet database = (BookDBServlet)
getServletConfig().getServletcontext().
getServlet(“bookdb”);