Introduction To Servlets
Introduction To Servlets
Introduction To Servlets
Gopalji Varshneya
Course B.Tech 2nd Year
Branch IT
The Web page is based on data submitted by
the user
E.g., results page from search engines and order-
confirmation pages at on-line stores
The Web page is derived from data that
changes frequently
E.g., a weather report or news headlines page
The Web page uses information from databases
or other server-side sources
E.g., an e-commerce site could use a servlet to build
a Web page that lists the current price and
availability of each item that is for sale.
What you know:
Java
JDBC
What we’ll tell you:
How to use Java inside a webserver!
Why you might care:
Building non-trivial web interfaces and applications
In particular: database-backed web applications
Static webpages
Plain files stored in the filesystem
Webserver accepts pathnames
Returns contents of corresponding file
Boring!
Can’t generate customized content—always serve
the same static pages…
Web Server
GET /path/index.html
STATUS …
<file contents> read
Filesystem
CGI: Easy “fix”
Common Gateway Interface
Oldest standard
But at least a standard!
Inefficient
No persistent state
Forward requests to external programs
Spawn one process for each new request (ouch!)
Communicate viaStandard input/output
Environment variables
Process terminates after request is handled
Web Server CGI Program
GET /cgi-bin/query? KEY=foo
KEY=foo
<response
STATUS … text foo>
<response text foo>
stdin
Database, etc
stdout Filesystem
Little Java programs…
Contain application-specific code
Web server does generic part of request handling
Servlets run “in” the web server and do some of the
handling
Highlights
Standard!
Efficiency (much better than CGI)
Security (Java!)
Persistence (handle multiple requests)
Web Server
JVM
GET /srv/pkg.Servlet?
doGe
KEY=foo res < t(req, res
STATUS … respo ) Servlet
<response foo> s e fo
o>
Servlet
t( r eq, r es)
GET /srv/pkg.Servlet? doGe
KEY=foo
<r es po nse bar>
res
STATUS …
<response bar>
javax.servlet.http.HttpServlet
doDelete( )
doGet( )
doOptions( )
doPost( )
doPut( )
doTrace( )
getLastModified( )
service( )
Basic Servlet
HttpServlet class is extended from GenericServlet
class
GenericServlet.service() method has been defined
as an abstract method
The two objects that the service() method
receives are ServletRequest and ServletResponse
ServletRequest Object
Holds information that is being sent to the servlet
ServletResponse Object
Holds data that is being sent back to the client
Unlike the GenericServlet, when extending
HttpServlet, don’t have to implement the
service() method. It is already implemented for
you
When HttpServlet.service( ) is invoked, it calls
doGet( ) or doPost( ), depending upon how data
is sent from the client
HttpServletRequest and HttpServletResponse
classes are just extensions of ServletRequest and
ServletResponse with HTTP-specific information
stored in them
Applet life cycle methods: init( ), start( ),
paint( ), stop( ), and destroy( ) – appropriate
methods called based on user action
Similarly, servlets operate in the context of a
request and response model managed by a
servlet engine
The engine does the following
Loads the servlet when it is first requested
Calls the servlet’s init( ) method
Handles any number of requests by calling the
servlet’s service( ) method
When shutting down, calls each servlet’s destroy( )
method
Request for a servlet received by the servlet engine
Checks to see if the servlet is already loaded
If not, uses a class loader to get the required servlet class
and instantiates it by calling the constructor method
After the servlet is loaded, but before it services any
requests, the init ( ) method is called
Inside init( ), the resources used by the servlet are
initialized. E.g: establishing database connection
This method is called only once just before the servlet is
placed into service
The init( ) method takes a ServletConfig object as a
parameter
Most common way of doing this is to have it call the
super.init( ) passing it the ServletConfig object
The service( ) method handles all requests sent by a client
It cannot start servicing requests until the init( ) method has
been executed
Only a single instance of the servlet is created and the servlet
engine dispatches each request in a single thread
The service( ) method is used only when extending
GenericServlet class
Since servlets are designed to operate in the HTTP environment,
the HttpServlet class is extended
The service(HttpServletRequest, HttpServletResponse) method
examines the request and calls the appropriate doGet() or
doPost() method.
A typical Http servlet includes overrides to one or more of these
subsidiary methods rather than an override to service()
This method signifies the end of a servlet’s life
The resources allocated during init( ) are
released
Save persistent information that will be used
the next time the servlet is loaded
The servlet engine unloads the servlet
Calling destroy( ) yourself will not acutally
unload the servlet. Only the servlet engine can
do this
Idea:
Use regular HTML for most of page
Mark dynamic content with special tags
Details in second half of course
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD><TITLE>Welcome to Our Store</TITLE></HEAD>
<BODY>
<H1>Welcome to Our Store</H1>
<SMALL>Welcome,
<!-- User name is "New User" for first-time visitors -->
<%= Utils.getUserNameFromCookie(request) %>
To access your account settings, click
<A HREF="Account-Settings.html">here.</A></SMALL>
<P>
Regular HTML for rest of on-line store’s Web page
</BODY></HTML>
Apache Tomcat
http://jakarta.apache.org/tomcat/
Allaire/Macromedia JRun
http://www.macromedia.com/software/jrun/
New Atlanta ServletExec
http://www.servletexec.com/
Gefion Software LiteWebServer
http://www.gefionsoftware.com/LiteWebServer/
Caucho's Resin
http://www.caucho.com/
Set your CLASSPATH
Servlet JAR file (e.g.,
install_dir\lib\common\servlet.jar).
Top of your package hierarchy
Put your servlet classes in proper location
Locations vary from server to server. E.g.,
tomcat_install_dir\webapps\examples\WEB-INF\classes
jrun_install_dir\servers\default\default-app\WEB-INF\classes
Invoke your servlets
http://host/servlet/ServletName
Custom URL-to-servlet mapping (via web.xml)
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class ServletTemplate extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// Use "request" to read incoming HTTP headers
// (e.g. cookies) and HTML form data (query data)
// 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
}
}
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
JSESSIONID → 1239865610
String sID = makeUniqueString();
Hashtable sessionInfo = new Hashtable();
Hashtable globalTable = findTableStoringSessions();
globalTable.put(sID, sessionInfo);
Cookie sessionCookie = new Cookie("JSESSIONID", sID);
sessionCookie.setPath("/");
response.addCookie(sessionCookie);
1239865610
JSESSIONID → 1239865610
PATH → /
String sID = makeUniqueString();
Hashtable sessionInfo = new Hashtable();
Hashtable globalTable = findTableStoringSessions();
globalTable.put(sID, sessionInfo);
Cookie sessionCookie = new Cookie("JSESSIONID", sID);
sessionCookie.setPath("/");
response.addCookie(sessionCookie);
1239865610
// On request
String sID = request.getCookie("JSESSIONID");
Hashtable globalTable = findTableStoringSessions();
Hashtable sInfo = (Hashtable) globalTable.get(sID);
Cookie: JSESSIONID=1239865610;
// On request
String sID = request.getCookie("JSESSIONID");
Hashtable globalTable = findTableStoringSessions();
Hashtable sInfo = (Hashtable) globalTable.get(sID);
1239865610
Cookie: JSESSIONID=1239865610;
// On request
String sID = request.getCookie("JSESSIONID");
Hashtable globalTable = findTableStoringSessions();
Hashtable sInfo = (Hashtable) globalTable.get(sID);
Rewrite all URLs in response to contain SessionID
http://foo.com/servlet/cart?id=123xyz
Parse out session ID from request line
encodeURL() in HttpResponse object will rewrite
session-id onto URL
Limitations
Always include ?sessionID=238423984
e.g.
http://www.amazon.com/exec/obidos/subst/home/
home.html/103-0036360-1119059
<input type=“hidden” name=“session” value=“...”>
Session tracking API built on top of URL
rewriting or cookies
Look up HttpSession object associated with current
request (or create new one)
All cookie/URL rewriting mechanics hidden
Look up information associated with a session
Associate information with a session
HttpSession session = request.getSession(true);
ShoppingCart sc = (ShoppingCart)
session.getAttribute("shoppingCart");
if (cart == null) {
cart = new ShoppingCart();
session.setAttribute("shoppingCart", cart);
}
...
// do something with your shopping cart object
public String getId()
public boolean isNew()
public long getCreationTime()
public long getLastAccessedTime()
public int getMaxInactiveInterval()
public void setMaxInactiveInterval(int secs)
public void invalidate()
HttpSession session = request.getSession(true);
session.setAttribute("referringPage",
request.getHeader("Referer"));
ShoppingCart cart =
(ShoppingCart)session.getAttribute("previousItems");
if (cart == null) {
cart = new ShoppingCart();
session.setAttribute("previousItems", cart);
}
Servlet Container
Session ID = 123XYZ
Amazon Shopping Cart sc
[item 1=324]
Response:
Set-Cookie: sid=123XYZ
Servlet Container
Request:
Set-Cookie: sid=123XYZ
Session ID = 123XYZ
Amazon Shopping Cart sc
[item 1=324]
Servlet Container
Request:
Set-Cookie: sid=123XYZ
Session ID = 123XYZ
Servlet Container
Printing to output not really a special case
when writing heaps of HTML!
Well… why not make that the common case in
the syntax and program statements the “special
case?”
And while we’re at it, why not hide the
compilation steps (let the server do it)?
Now things look more like “plain old HTML”
(only they aren’t… they can produce dynamic
content and really are Java programs)
<%@ page import=“java.io.*” %>
<html>
<head><title>Sample JSP</title></head>
<% String s = “JSP”; %>
<body>
<h1>Hello <%= s %> World!</h1>
<p><% out.print(“Scriptlet Statement Hello!”); %></p>
<p>Key is <%= request.getParameter(“KEY”) %></p>
</body>
</html>
<body>
<h1>Student Information for <%= courseId %></h1>
<p><table border=“1”>
<tr><th>CourseID</th><th>Student</th><th>StudentID</th></tr>
<% while (rs.next()) { %>
<tr>
<td><%= rs.getString(“cid”) %></td>
<td><%= rs.getString(“sname”) %></td>
<td><%= rs.getString(“sid”) %></td>
</tr>
<% } // end while %>
</table></p>
</body>
</html>
Dynamically loadable server modules
Web server offers standard API for request handlers
Request handlers are dynamic libraries
Loaded into server address space (security?!)
Very efficient!
Better suited for generic server extensions than application-
specific logic
CGI flavors
Persistent CGI (PCGI) / FastCGI
Too little, too late
83
There is more than one type of JSP “tag,” depending on
what you want done with the Java
<%= expression %>
The expression is evaluated and the result is inserted into the
HTML page
<% code %>
The code is inserted into the servlet's service method
This construction is called a scriptlet
<%! declarations %>
The declarations are inserted into the servlet class, not into a
method
84
<HTML>
<BODY>
Hello! The time is now <%= new java.util.Date() %>
</BODY>
</HTML>
Notes:
The <%= ... %> tag is used, because we are computing
a value and inserting it into the HTML
The fully qualified name (java.util.Date) is used,
instead of the short name (Date), because we haven’t
yet talked about how to do import declarations
85
You can declare your own variables, as usual
JSP provides several predefined variables
request : The HttpServletRequest parameter
response : The HttpServletResponse parameter
session : The HttpSession associated with the
request, or null if there is none
out : A JspWriter (like a PrintWriter) used to send
output to the client
Example:
Your hostname: <%= request.getRemoteHost() %>
86
Scriptlets are enclosed in <% ... %> tags
Scriptlets do not produce a value that is inserted directly
into the HTML (as is done with <%= ... %>)
Scriptlets are Java code that may write into the HTML
Example:
<% String queryData = request.getQueryString();
out.println("Attached GET data: " + queryData); %>
Scriptlets are inserted into the servlet exactly as
written, and are not compiled until the entire servlet
is compiled
Example:
<% if (Math.random() < 0.5) { %>
Have a <B>nice</B> day!
<% } else { %>
Have a <B>lousy</B> day!
<% } %>
87
Use <%! ... %> for declarations to be added to your
servlet class, not to any particular method
Caution: Servlets are multithreaded, so nonlocal variables
must be handled with extreme care
If declared with <% ... %>, variables are local and OK
Data can also safely be put in the request or session objects
Example:
<%! private int accessCount = 0; %>
Accesses to page since server reboot:
<%= ++accessCount %>
You can use <%! ... %> to declare methods as easily as
to declare variables
88
Directives affect the servlet class itself
A directive has the form:
<%@ directive attribute="value" %>
or
<%@ directive attribute1="value1"
attribute2="value2"
...
attributeN="valueN" %>
The most useful directive is page, which lets
you import packages
Example: <%@ page import="java.util.*" %>
89
The include directive inserts another file into the
file being parsed
The included file is treated as just more JSP, hence it
can include static HTML, scripting elements, actions,
and directives
Syntax: <%@ include file="URL " %>
The URL is treated as relative to the JSP page
If the URL begins with a slash, it is treated as relative
to the home directory of the Web server
The include directive is especially useful for
inserting things like navigation bars
90
Actions are XML-syntax tags used to control
the servlet engine
<jsp:include page="URL " flush="true" />
Inserts the indicated relative URL at execution time
(not at compile time, like the include directive does)
This is great for rapidly changing data
<jsp:forward page="URL" />
<jsp:forward page="<%= JavaExpression %>" />
Jump to the (static) URL or the (dynamically
computed) JavaExpression resulting in a URL
91
JSP can be embedded in XML as well as in HTML
Due to XML’s syntax rules, the tags must be different
(but they do the same things)
HTML: <%= expression %>
XML: <jsp:expression>expression</jsp:expression>
HTML: <% code %>
XML: <jsp:scriptlet>code</jsp:scriptlet>
HTML: <%! declarations %>
XML:
<jsp:declaration>declarations</jsp:declaration>
HTML: <%@ include file=URL %>
XML: <jsp:directive.include file="URL"/>
92
93