Sie sind auf Seite 1von 58

Java Servlets

Svetlin Nakov
Borislava Spasova
Contents
1. Java Servlets Technology Overview
• What is a Java Servlet?
• Servlet Services
• Why Use Servlets?
• Time Servlet – Example
• Deploying Servlets on Eclipse IDE
2. Servlets Architecture
• Servlets API
• Servlets Life-Cycle
Contents (2)
1. Servlet Examples
• Processing Parameters – Hello Servlet
• Image Counter Servlet
2. Using Sessions
• What is a Session?
• The Sessions API
• Session Timeout
3. Session Examples
• Login / Logout Application
• The Browser's Cache Problems
Java Servlets
Technology Overview
What is a Java Servlet?

• Java Servlets are:


• Technology for generating dynamic Web
pages (like PHP, ASP, ASP.NET, ...)
• Protocol and platform-independent server
side components, written in Java, which
extend the standard Web servers
• Java programs that serve HTTP requests
• The HttpServlet class
• Provides dynamic Web content generation
(HTML, XML, …)
What is a Java Servlet? (2)

• Servlets
• Provide a general framework for services built
on the request-response paradigm
• Portable to any Java application server
• Have access to the entire family of Java and
Java EE APIs
• JDBC, Persistence, EJB, JMS, JAX-WS,
JTA, JTS, RMI, JNDI, JAXP, ...
• Fundamental part of all Java Web
application technologies (JSP, JSF, ...)
Servlet Services
• Java Servlets provide many useful services
• Provides low-level API for building Internet
services
• Serves as foundation to JavaServer Pages (JSP)
and JavaServer Faces (JSF) technologies
• Can deliver multiple types of data to any client
• XML, HTML, WML, GIF, etc...
• Can serve as “Controller” of JSP/Servlet
application
Why Use Servlets?

• Portability
• Write once, serve everywhere
• Power
• Can take advantage of all Java APIs
• Elegance
• Simplicity due to abstraction
• Efficiency & Endurance
• Highly scalable
Why Use Servlets? (2)
• Safety
• Strong type-checking
• Memory management
• Integration
• Servlets tightly coupled with server
• Extensibility & Flexibility
• Servlets designed to be easily extensible, though
currently optimized for HTTP uses
• Flexible invocation of servlet (SSI, servlet-chaining,
filters, etc.)
Time Servlet – Example

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class TimeServlet extends HttpServlet {


public void doGet(HttpServletRequest aRequest,
HttpServletResponse aResponse)
throws ServletException, IOException {
PrintWriter out = aResponse.getWriter();
out.println("<HTML>");
out.println("The time is: " +
new java.util.Date());
out.println("</HTML>");
}
}
Deploying Servlets on Eclipse
IDE
• First create new Web application
Deploying Servlets on Eclipse
IDE (2)
• Add new servlet to the Web application
Deploying Servlets on Eclipse
IDE (3)
• Run the servlet
Deploying Servlets on Eclipse
IDE (4)
• The servlet in action
Java Servlets
Technical Architecture
Servlets Architecture
• The HttpServlet class
• Serves client's HTTP requests
• For each of the HTTP methods, GET, POST, and
others, there is corresponding method:
• doGet(…) – serves HTTP GET requests
• doPost(…) – serves HTTP POST requests
• doPut(…), doHead(…), doDelete(…), doTrace(…),
doOptions(…)
• The Servlet usually must implement one of the first
two methods or the service(…) method
Servlets Architecture (2)
• The HttpServletRequest object
• Contains the request data from the client
• HTTP request headers
• Form data and query parameters
• Other client data (cookies, path, etc.)
• The HttpServletResponse object
• Encapsulates data sent back to client
• HTTP response headers (content type, cookies, etc.)
• Response body (as OutputStream)
Servlets Architecture (3)
• The HTTP GET method is used when:
• The processing of the request does not change the
state of the server
• The amount of form data is small
• You want to allow the request to be bookmarked
• The HTTP POST method is used when:
• The processing of the request changes the state of
the server, e.g. storing data in a DB
• The amount of form data is large
• The contents of the data should not be visible in the
URL (for example, passwords)
Servlets API
• The most important servlet functionality:
• Retrieve the HTML form parameters from the
request (both GET and POST parameters)
HttpServletRequest.getParameter(String)

• Retrieve a servlet initialization parameter


ServletConfig.getInitParameter()

• Retrieve HTTP request header information


HttpServletRequest.getHeader(String)
Servlets API (2)
• Set an HTTP response header / content type
HttpServletResponse.setHeader(<name>, <value>) /
HttpServletResponse.setContentType(String)

• Acquire a text stream for the response


HttpServletResponse.getWriter()

• Acquire a binary stream for the response


HttpServletResponse.getOutputStream()

• Redirect an HTTP request to another URL


HttpServletResponse.sendRedirect()
Servlets Life-Cycle

• The Web container New Destroyed


manages the life cycle
of servlet instances init()
Running
destroy()
• The life-cycle methods
should not be called service()
...()
by your code doGet()
doDelete()

doPost() doPut()

• You can provide an implementation of these


methods in HttpServlet descendent classes to
manipulate the servlet instance and the resources it
depends on
The init() Method

• Called by the Web container when the servlet


instance is first created
• The Servlets specification guarantees that no
requests will be processed by this servlet until
the init method has completed
• Override the init() method when:
• You need to create or open any servlet-specific
resources that you need for processing user
requests
• You need to initialize the state of the servlet
The service() Method

• Called by the Web container to process a


user request
• Dispatches the HTTP requests to doGet(…),
doPost(…), etc. depending on the HTTP
request method (GET, POST, and so on)
• Sends the result as HTTP response
• Usually we do not need to override this
method
The destroy() Method

• Called by the Web container when the servlet


instance is being eliminated
• The Servlet specification guarantees that all
requests will be completely processed before
this method is called
• Override the destroy method when:
• You need to release any servlet-specific
resources that you had opened in the init()
method
• You need to persist the state of the servlet
Java Servlets
Examples
Processing Parameters – Hello
Servlet
• We want to create a servlet that takes an user
name as a parameter and says "Hello,
<user_name>"
• We need HTML form with a text field
<form method="GET or POST" action="the servlet">
<input type="text" name="user_name">
</form>

• The servlet can later retrieve the value entered


in the form field
String name = request.getParameter("user_name");
Hello Servlet – Example
HelloForm.html
<html><body>
<form method="GET" action="HelloServlet">
Please enter your name:
<input type="text" name="user_name">
<input type="submit" value="OK">
</form>
</body></html>

HelloServlet.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class HelloServlet extends HttpServlet {


Hello Servlet – Example
HelloServlet.java
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {

response.setContentType("text/html");
ServletOutputStream out = response.getOutputStream();
String userName = request.getParameter("user_name");
out.println("<html><head>");
out.println("\t<title>Hello Servlet</title>");
out.println("</head><body>");
out.println("\t<h1>Hello, " + userName + "</h1>");
out.println("</body></html>");

}
Creating The Form in Eclipse IDE

• Create new HTML form


Creating New Servlet in Eclipse
IDE
• Create new Servlet
Hello Servlet in Action
Hello Servlet –
HTTP Request
• What happens when the user enters his name?
• Internet Explorer (IE) sends the following HTTP
request to Tomcat

GET /FirstWebApp/HelloServlet?user_name=Nakov HTTP/1.1


Accept: image/gif, image/x-xbitmap, image/jpeg,image/pjpeg,
application/vnd.ms-excel, application/vnd.ms-powerpoint,
application/msword, application/x-shockwave-flash, */*
Accept-Language: bg
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT
5.1; Q312461)
Host: nakov:8084
Connection: Keep-Alive
Hello Servlet –
HTTP Response
• What happens when Tomcat receive and process
the HTTP request
• Tomcat sends the following HTTP response to
Internet Explorer

HTTP/1.1 200 OK
Content-Length: 100
Date: Fri, 26 Mar 2006 10:06:28 GMT
Server: Apache-Coyote/1.1

<html><head>
<title>Hello Servlet</title>
</head><body>
<h1>Hello, Nakov</h1>
</body></html>
Image Counter Servlet
• We want to create a servlet that displays an
image counter (as JPEG image)
• The servlet should maintain an internal counter
• Can be initialized in the init() method and
incremented in the doGet() method
• It should produce binary output (the JPEG)
image
• The content type should be set to "image/jpeg"
Image Counter Servlet (2)

import javax.servlet.*;
import javax.servlet.http.*;
...

public class ImageCounterServlet extends HttpServlet {


private String mStartDate;
private int mVisitCounter;

public void init() {


mStartDate = (new Date()).toString();
mVisitCounter = 0;
}

public BufferedImage createImage(String msg) {


...
}
Image Counter Servlet (3)

public void doGet(HttpServletRequest request,


HttpServletResponse response)
throws IOException, ServletException {
String msg;
synchronized(this) {
mVisitCounter++;
msg = "" + mVisitCounter + " visits since " +
mStartDate;
}
BufferedImage image = createImage(msg);
response.setContentType("image/jpeg");
OutputStream out = response.getOutputStream();
// Encode the image in JPEG format and
// write the image to the output stream
}
}
Image Counter Servlet in Action
Using Sessions
What is a Session?
• A session is a state associated with particular user
that is maintained at the server side
• Sessions persist between the HTTP requests
• Sessions enable creating applications that depend
on individual user data. For example:
• Login / logout functionality
• Wizard pages
• Shopping carts
• Personalization services
• Maintaining state about the user’s preferences
Sessions in Servlets
• Servlets include a built-in Sessions API
• Sessions are maintained automatically, with no
additional coding
• The Web container associates an unique
HttpSession object to each different client
• Different clients have different session objects at
the server
• Requests from the same client have the same
session object
• Sessions can store various data
The Sessions API
• The sessions API allows
• To get the HttpSession object from the
HTTPServletRequest object
• Extract data from the user’s session object
• Append data to the user’s session object
• Extract meta-information about the session
object, e.g. when was the session created
Getting The Session Object

• To get the session object use the method


HttpServletRequest.getSession()
• Example:
HttpSession session = request.getSession();

• If the user already has a session, the existing


session is returned
• If no session still exists, a new one is created and
returned
• If you want to know if this is a new session, call the
isNew() method
Behind The Scenes
• When you call getSession() each user is
automatically assigned a unique Session ID
• How does this Session ID get to the user?
• Option 1: If the browser supports cookies, the servlet
will automatically create a session cookie, and store
the session ID within the cookie
• In Tomcat, the cookie is called JSESSIONID
• Option 2: If the browser does not support cookies, the
servlet will try to extract the session ID from the URL
Extracting Data From The
Session
• The session object works like a HashMap
• Enables storing any type of Java object
• Objects are stored by key (like in hash tables)
• Extracting existing object:
Integer accessCount =
(Integer) session.getAttribute("accessCount");

• Getting a list of all “keys” associated with the


session

Enumeration attributes =
request.getAttributeNames();
Storing Data In The Session

• We can store data in the session object for


using it later
HttpSession session = request.getSession();
session.setAttribute("name", "Svetlin Nakov");

• Objects in the session can be removed when not


needed more
session.removeAttribute("name");
Getting Additional Session
Information
• Getting the unique session ID associated with this
user, e.g. gj9xswvw9p
public String getId();

• Checking if the session was just created


public boolean isNew();

• Checking when the session was first created


public long getCreationTime();
• Checking when the session was last active
public long getLastAccessedTime();
Session Timeout
• We can get the maximal session validity interval
(in seconds)
public int getMaxInactiveInterval();

• After such interval of inactivity the session is


automatically invalidated
• We can modify the maximal inactivity interval

public void setMaxInactiveInterval (int seconds);


• A negative value specifies that the session should
never time out
Terminating Sessions
• To terminate session manually use the
method:
public void invalidate();

• Typically done during the "user logout"


• The session can become invalid not only
manually
• Sessions can expire automatically due to
inactivity
Login / Logout – Example

• We want to create a simple Web application that


restricts the access by login form
• We will use sessions to store information about
the authenticated users
• We will use the key "username"
• When it present, there is a logged in user
• During the login we will add the user name in the
session
• Logout will invalidate the session
• The main servlet will check the current user
Login Form
LoginForm.html

<html>
<head><title>Login</title></head>
<body>
<form method="POST" action="LoginServlet">
Please login:<br>
Username:
<input type="text" name="username"><br>
Password:
<input type="password" name="password"><br>
<input type="submit" value="Login">
</form>
</body>
</html>
Login Servlet
LoginServlet.java
public class LoginServlet extends HttpServlet {
public void doPost(HttpServletRequest req,
HttpServletResponse resp)
throws IOException, ServletException {
String username = req.getParameter("username");
String password = req.getParameter("password");
PrintWriter out = resp.getWriter();
if (isLoginValid(username, password)) {
HttpSession session = req.getSession();
session.setAttribute("USER", username);
response.sendRedirect("MainServlet");
} else {
response.sendRedirect("InvalidLogin.html");
}
}
}
Main Servlet
MainServlet.java
public class MainServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse resp)
throws ServletException, IOException {
HttpSession session = request.getSession();
String userName = (String)
session.getAttribute("USER");
if (userName != null) {
response.setContentType("text/html");
ServletOutputStream out = resp.getOutputStream();
out.println("<html><body><h1>");
out.println("Hello, " + userName + "! ");
out.println("</h1></body></html>");
} else {
response.sendRedirect("LoginForm.html");
}
}
}
Logout Servlet
LogoutServlet.java
public class LogoutServlet extends HttpServlet {
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession();
session.invalidate();
response.setContentType("text/html");
ServletOutputStream out =
response.getOutputStream();
out.println("<html><head>");
out.println("<title>Logout</title></head>");
out.println("<body>");
out.println("<h1>Logout successfull.</h1>");
out.println("</body></html>");
}
}
Invalid Login Page
InvalidLogin.html

<html>
<head>
<title>Error</title>
</head>
<body>
<h1>Invalid login!</h1>
Please <a href="LoginForm.html">try again</a>.
</body>
</html>
The Browser's Cache Problems

• Most Web browsers use caching of the


displayed pages and images
• This can cause the user to see old state of the
pages
• Seems like a bug in the application
• To prevent showing the old state we need to
disable the browser cache:

response.setHeader("Pragma", "No-cache");
response.setDateHeader("Expires", 0);
response.setHeader("Cache-Control", "no-cache");
Problems
1. Create a servlet that prints in a table the numbers
from 1 to 1000 and their square root.
2. Create a servlet that takes as parameters two
integer numbers and calculates their sum.
Create a HTML form that invokes the servlet. Try
to use GET and POST methods.
4. Implement a servlet that plays the "Number
guess game". When the client first invoke the
servlet it generates a random number in the
range [1..100]. The user is asked to guess this
number. At each guess the servlet says only
"greater" or "smaller". The game ends when the
user tell the number.
Homework
1. Create a servlet that takes as a parameter a
number and displays it as image that is hard to
be recognized by OCR software. The image
should have intentionally inserted defects.
2. Create an HTML form and a servlet for performing
conversions of distances from one metric to
another. The metrics that should be supported
are: meter, centimeter, kilometer, foot, inch, yard,
mile.
1 cm = 0.01 meters 1 km = 1000 meters
1 foot = 0.3048 meters 1 inch = 0.0254 meters
1 yard = 0.9144 meters 1 mile = 1609.344 meters
Homework (2)
1. Create a sequence of HTML forms and servlets
that allow entering information about a student.
The information is entered in 3 steps in 3
separate forms:
Step 1: First name, last name, age
Step 2: Address (country, town, street)
Step 3: University, faculty, specialty
The data entered in the 3 steps should be stored
in the session and finally displayed.
• Create a servlet that reads an image (from WEB-
INF\img\logo.gif) and returns it.

Das könnte Ihnen auch gefallen