ZeePedia

JAVA: Dispatching Requests

<< JAVA: More on Servlets
JAVA: Session Tracking 1 >>
img
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
img
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
img
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
img
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
img
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
img
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
img
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
img
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