View
234
Download
0
Tags:
Embed Size (px)
Citation preview
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 Servletimport 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. A server loads and initializes the servlet 2. The servlet handles zero or more client requests 3. 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
All methods take two arguments: an HttpServletRequest object and an HttpServletResponse object.
Return a BAD_REQUEST (400) error by default.
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
COMP201 Topic 15 / Slide 15
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
HTTP Servlets
COMP201 Topic 15 / Slide 16
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.)
HTTP Servlets
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.htmlBookDetailServlet.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
CatalogServlet.java
// 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
}
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. Create a Cookie object Cookie c = new Cookie(name, value);
2. Set attributes if necessary c.setMaxAge(30); // expire after 30 seconds
3. Send the cookie response.addCookie(c);
To get information from a cookie, 1. Retrieve all the cookies from the user's request
Cookie[] cookies = request.getCookies();2. 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 kitSeveral 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/jswdk-1.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
1. Name servlet (for convenience)simple.code=SimpleGenericServlet
2. Initialize parameters required by servlet Starting and stopping server
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/webpages3. Can change those in zzz/jswdk-1.0.1/webserver.xml
COMP201 Topic 15 / Slide 31
Compiling and Running Servlets Accessing the server
1. 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 orhttp://localhost:8080/servlet/simple
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 servlet2. Call another servlet’s public methods directly, if the two servlets run
within the same server:BookDBServlet database = (BookDBServlet)
getServletConfig().getServletcontext().getServlet(“bookdb”);