|
|||||
Web
Design & Development CS506
VU
Lesson
30
Dispatching
Requests
In
this handout we will start
with request dispatching techniques and
give some examples related
to that.
Further
more some methods of HttpResponse and
HttpRequestwill also be discussed.
Finally, this handout
will
be concluded by discussing the importance
of session tracking. Before
starting, let's take a look
at the
summery of the
previous lecture.
Recap
In the
previous lecture we had some
discussion about Response
Redirection and Request Dispatcher.
We
said
that Response Redirection
was used to redirect
response of the Servlet to another
application resource.
This
resource might be another Servlet or
any JSP page.
Two
forms of Response redirection were
discussed. These
were:
. Sending
a standard request:
Using
response.sendRedirect("path of resource") method, a new
request is generated
which
redirects the
user to the given URL. If the
URL is of another servlet, that
second servlet will not
be
able
to access the original request
object.
. Redirection to an
error page:
An
error code is passed as a
parameter along with message
to response.sendError(int, msg)
method.
This method redirects the user to the
particular error page in
case of occurrence of
specified
error.
Similarly
request dispatching provides us the
facility to forward the request
processing to another servlet,
or to
include the output of another resource
(servlet, JSP or HTML etc) in the
response. Unlike
Response
Redirection,
request object of calling
resource is available to called
resource. The two ways of
Request
Dispatching
are:
. Forward:
Forwards the
responsibility of request processing to
another resource.
. Include:
Allows
a servlet to include the results of
another resource in its response. So
unlike forward, the
first
servlet to receive the request is the one
which finishes the
response.
Example
Code: Request Dispatching
Include
Lets
start with the example of
include. We will see how a
Servlet includes the output of another
resource in
its
response. The following
example includes a calling
Servlet MyServlet and Servlet
IncludeServlet,
who's
output will be included in the
calling Servlet.
The
code of MyServlet.java servlet is
given below.
MyServlet.java
import
java.io.*;
import
java.net.*;
import
javax.servlet.*;
import
javax.servlet.http.*;
public
class MyServlet
extends
HttpServlet {
/*
this method is being called by
both doGet() and doPost().We
usually
follow this practice, when we
are not sure about
the
type
of incoming request to the servlet. So
the actual
processing
is being done in the processRequest().
*/
protected
void processRequest(HttpServletRequest
request, HttpServletResponse
response)
218
Web
Design & Development CS506
VU
throws
ServletException, IOException {
response.setContentType("text/html");
PrintWriter
out = response.getWriter();
out.println("<html>");
out.println("<body>");
out.println("<h1>Start
of include request
</h1>");
out.flush();
//
getting the object of ServletContext,
that will be used to
//
obtain the object of
RequestDispacther
ServletContext
context = getServletContext();
//
getting the object of RequestDispatcher by
passing the path
// of
included resource as a
parameter
RequestDispatcher
rd =
context.getRequestDispatcher("/includeservlet");
//
calling include method of RequestDispatcher by
passing
//
request and response objects as
parameters. This will
execute
//the
second servlet and include
its output in the first
servlet
rd.include(request,
response);
/* the
statements below will be executed
after including the
output
of the /includeservlet */
out.println("<h1>End
of
out.println("</body>");
out.println("</html>");
//
closing PrintWriter
stream
out.close();
}
//
This method only calls
processRequest()
protected
void doGet(HttpServletRequest
request, HttpServletResponse
response)
throws
ServletException, IOException {
processRequest(request,
response);
}
//
This method only calls
processRequest()
protected
void doPost(HttpServletRequest
request, HttpServletResponse
response)
throws
ServletException, IOException {
processRequest(request,
response);
}
} //
end MyServlet
Include
Servlet
Now
lets take a look at the code of
IncludeServlet.java
import
java.io.*;
import
java.net.*;
import
javax.servlet.*;
import
javax.servlet.http.*;
public
class IncludeServlet extends
HttpServlet {
//
this method is being called by
both doGet()
and
doPost()
protected
void processRequest(HttpServletRequest
request, HttpServletResponse
response)
throws
ServletException, IOException {
219
Web
Design & Development CS506
VU
//
Obtaining the object of PrintWriter,
this will return the
//
same PrintWriter object we have in
MyServlet
PrintWriter
out = response.getWriter();
//
Including a HTML tag using
PrintWriter
out.println("<h1>
<marquee>I am included
</marquee></h1>");
}
protected
void doGet(HttpServletRequest
request, HttpServletResponse
response)
throws
ServletException, IOException {
processRequest(request,
response);
}
protected
void doPost(HttpServletRequest
request, HttpServletResponse
response)
throws
ServletException, IOException {
}
} // end
IncludeServlet
In the
processRequest(), firstly we get the
PrintWriter stream from the
HttpServletResponse object. Then
we
include an HTML tag to the output of the
calling servlet. One thing
that must be considered is
that
PrintWriter
stream is not closed in the end,
because it is the same stream
that is being used in the
calling
servlet
and this stream may
also be used in the calling
servlet again. So, if it is
closed over here, it can
not
be
used again in the calling
servlet.
web.xml
<?xml
version="1.0"
encoding="UTF-8"?>
<web-app>
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>MyServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>IncludeServlet</servlet-name>
<servlet-class>IncludeServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/myservlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>IncludeServlet</servlet-name>
<url-pattern>/includeservlet</url-pattern>
</servlet-mapping>
</web-app>
Code
Example: Request Dispatcher -
forward
As
discussed earlier, we can
forward the request
processing to another resource
using forward method of
request
dispatcher. In this example, the user
enters his/her name and salary on the
index.html and submits
the
form to FirstServlet, which calculates
the tax on salary and forwards the
request to another servlet
for
further
processing i.e. SecondServlet.
index.html
<html>
<body>
<form
method="POST" ACTION = "firstservlet"
NAME="myForm">
<h2>
Enter your name</h2>
<INPUT
TYPE="text" name="name"/>
<br/>
220
Web
Design & Development CS506
VU
<h2>
Salary</h2>
<INPUT
TYPE="text" name="salary"/>
<BR/><BR/>
<INPUT
type="submit" value="Submit"/>
</form>
</html>
FirstServlet.java
import
java.io.*;
import
java.net.*;
import
javax.servlet.*;
import
javax.servlet.http.*;
public
class FirstServlet
extends
HttpServlet {
//
this method is being called by
both doGet()
and
doPost()
protected
void processRequest(HttpServletRequest request,
HttpServletResponse response)
sthrows
ServletException, IOException {
//
getting value of salary text
filed of the HTML form
String
salary = request.getParameter("salary");
//
converting it to the integer.
int
sal = Integer.parseInt(salary);
//
calculating 15% tax
int
tax = (int)(sal *
0.15);
//
converting tax into
string
String
taxValue = tax + "";
//
request object can store
values in key-value form, later
it
//
can be retrieved by using
getAttribute() method
request.setAttribute("tax",
taxValue);
//
getting object of
servletContext
ServletContext
sContext = getServletContext();
//
getting object of request
dispatcher
RequestDispatcher
rd = sContext.getRequestDispatcher("/secondservlet");
//
calling forward method of request
dispatcher
rd.forward(request,
response);
}
//
This method is calling
processRequest()
protected
void doGet(HttpServletRequest
request, HttpServletResponse
response)
throws
ServletException, IOException {
processRequest(request,
response);
}
//
This method is calling
processRequest()
protected
void doPost(HttpServletRequest
request, HttpServletResponse
response)
throws
ServletException, IOException {
processRequest(request,
response);
}
}
Note:
It the
case of Forward, it is illegal to
make the reference of PrintWriter stream
in the calling
Servlet.
Only the called resource can
use PrintWriter stream to
generate response
SecondServlet.java
import
java.io.*;
import
java.net.*;
import
javax.servlet.*;
221
Web
Design & Development CS506
VU
import
javax.servlet.http.*;
public
class SecondServlet
extends
HttpServlet {
//
this method is being called by
both doGet()
and
doPost()
protected
void processRequest(HttpServletRequest request,
HttpServletResponse response)
throws
ServletException, IOException {
response.setContentType("text/html");
PrintWriter
out = response.getWriter();
//
obtaining values of name and salary text
fields of index.html
String
name = request.getParameter("name");
String
salary = request.getParameter("salary");
/*
getting attribute value that
has been set by the
calling
servlet
i.e. FirstServlet */
String
tax =
(String)request.getAttribute("tax");
//
generating HTML tags using
PrintWriter
out.println("<html>");
out.println("<head>");
out.println("<title>SecondServlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>
Welcome " + name+ "</h1>");
out.println("<h3>
Salary " + salary+
"</h3>");
out.println("<h3>
Tax " + tax+
"</h3>");
out.println("</body>");
out.println("</html>");
out.close();
}
//
This method is calling
processRequest()
protected
void doGet(HttpServletRequest request,
HttpServletResponse response)
throws
ServletException, IOException {
processRequest(request,
response);
}
//
This method is calling
processRequest()
protected
void doPost(HttpServletRequest request,
HttpServletResponse response)
throws
ServletException, IOException {
processRequest(request,
response);
}
}
web.xml
<?xml
version="1.0"
encoding="UTF-8"?>
<web-app>
<servlet>
<servlet-name>FirstServlet</servlet-name>
<servlet-class>FirstServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>SecondServlet</servlet-name>
<servlet-class>SecondServlet</servlet-class>
</servlet>
222
Web
Design & Development CS506
VU
<servlet-mapping>
<servlet-name>FirstServlet</servlet-name>
<url-pattern>/firstservlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>SecondServlet</servlet-name>
<url-pattern>/secondservlet</url-pattern>
</servlet-mapping>
</web-app>
HttpServletRequest
Methods
Let's
discuss some methods of
HttpServletRequestclass
setAttribute(String,
Object)
We
can put any object to the
context using setAttribute()
method in the key-value pair
form.. These
attributes
are also set or reset
between requests. These are
often used in conjunction
with Request
Dispatcher.
This has also been
illustrated in the above example. These
attributes are available
every where
in the
same web application so that
any other Servlet or JSP
resource can access them by
using
getAttribute()
method.
getAttribute(String)
The
objects set by the setAttribute() method
can be accessed using
getAttribute() method. Passing the
key
in the
form of string as a parameter to
this method will return the
object associated with that
particular key
in the
context. Cast the object
into its appropriate
type.
getMethod()
This
method returns the name of HTTP method
which was used to send the
request. The two
possible
returning
values could be, get or post.
getRequestURL()
It
can be used to track the
source of Request. It returns the part of
the request's URL with out
query string.
getProtocol()
It returns the
name and version of the protocol
used.
getHeaderNames()
It returns the
enumeration of all available
header names that are
contained in the request.
getHearderName()
It
takes a String parameter
that represents the header
name and returns that appropriate
header. Null value
is
returned if there is no header exists
with the specified
name.
HttpServletResponse
Methods
Let's
discuss some methods of
HttpServletResponse class
setContentType()
Almost
every Servlet uses this
header. It is used before
getting the PrintWriter Stream. It is
used to set the
223
Web
Design & Development CS506
VU
Content
Type that the PrintWriter is
going to use. Usually we set
"text/html",
when we want to send
text
output
or generate HTML tags on the client's
browser.
setContentLength(
)
This
method is used to set the content length.
It takes length as an integer
parameter.
addCookie()
This
method is used to add a value to the
Set-Cookie header. It takes a
Cookie object as a parameter
and
adds
it to the Cookie-header. We will talk
more about Cookies in the session
tracking part.
sendRedirect()
This
method redirects the user to the specific
URL. This method also
accepts the relative URL. It
takes
URL
string as parameter and redirects the
user to that
resource.
SESSION
TRACKING
Many
applications require a series of
requests from the same
client to be associated with
one another. For
example,
any online shopping
application saves the state of a
user's shopping cart across
multiple requests.
Web-based
applications are responsible for
maintaining such state,
because HTTP protocol is
stateless. To
support
applications that need to
maintain state, Java Servlet
technology provides an API for
managing
sessions
and allows several mechanisms
for implementing
sessions.
Before
looking inside the session
tracking mechanism lets see
the limitation of HTTP
protocol to get the
real
picture of problems that can happen
with out maintaining the
session.
Continuity
problem- user's point of
view
Suppose
a user logs on to the online
bookshop, selects so
224
Web
Design & Development CS506
VU
Continuity
problem- Server's point of
view
The
server has a very different
point of view. It considers
each request independent
from other even if
the
requests
are made by the same
client.
References
Java
A Lab Course by Umair
Javed
Core
Servlet and JSP by Marty
Hall
225
Table of Contents:
|
|||||