Web Container ModelAgenda:
ServletContext parameter :For the ServletContext initialization parameter.
We can retrive ServletContext parameters by using ServletContext object for that purpose ServletContext interface defines the following methods for accessing context initialization parameters.
Demo program to display context initialization parameters :
public class FirstServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PrintWriter out=response.getWriter();
ServletContext context=this.getServletConfig().getServletContext( );
Enumeration enum=context.getInitParameterNames( );
while(enum.hasMoreElements()){
String paramValue=(String)enum.getInitParameter(paramName);
out.println(paramName+" ... "+paramValue);
}
}
web.xml
<web-app>
<context-param>
<param-name>user</param-name>
<param-value>scott</param-value>
</context-param>
<context-param>
<param-name>pwd</param-name>
<param-value>tiger</param-value>
</context-param>
<servlet>
<servlet-name>first</servlet-name>
<servlet-class>FirstServlet</servlet-class>
<init-param>
<param-name></param-name>
<param-value></param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>first</servlet-name>
<url-pattern>/fs</url-pattern>
</servlet-mapping>
</web-app>
Note : With in the Servlet if we can call getInitParameter() directly then it provides Servlet initialization parameters but not ServletContext parameters , hence initparameters by default Servlet initialization parameters. Note:We can Access Servlet initialization parameters in the following ways .
String value=getInitParameter("movie");
String value=getServletConfig( ).getInitParameter("movie");
We can Access context initialization parameters in the following ways .
String value=getServletContext( ).getInitParameter("movie");
String value=getServletConfig( ).getServletContext( ).getInitParameter("movie");
Note: Whether Servlet or context init-parameters , these are deploy time constants i.e., from the Servlet , we can read their values but we are not allow to modify i.e., we have only getter()'s but not setter()'s Comparision between Servlet init & context initialization parameters :
Servlet Scopes :Objective : For the fundamental Servlet attribute scopes. (Request, session & context )
Attribute : Place holder to store the information with in the web-application. The main purpose of these parameters are to bring information from outside environment into the Servlet , and these are read-only . Based on our requirement we can't create a new parameter , we can't modify and we can't remove existing parameters with in the Servlet. Here we can't use parameters to store and share information between the components of application.To handle this requirement sun people introduced attributes concept. Based on our requirement we can create a new attribute , we can modify and remove existing attributes. Hence attributes concept is best suitable to store and share information between the components of web-application. Based on our requirement , we have to store this attributes into the proper scopes. There are 3 scopes are possible in the Servlets .
Request Scope :
Note:
Session Scope :
Application Scope (or) Context Scope :
Multithreading issues associated with each scope :
Parameters are key-value pairs . Both key & value are String objects. Hence at the time of retrieval it is not required to perform any type -casting . We can assign directly parameter value to the String type variable without performing any type-casting.
String pvalue=request.getParameter("user");
String pvalue=request.getInitParameter("user");
Attributes also key-value pairs but keys are String type and values can be any Object type. Hence at the time of retrival. Compulsary we should perform type-casting.
String value = request.getAttribute("user");
CompiletimeError:Incompatible types
found:java.lang.Object
required:java.lang.String
String value=(String)request.getAttribute("user"); IIQ: To access the value of request scoped attribute user, which of the following is valid ?
public class FirstServlet extends HttpServlet {
StringBuffer buffer1=new StringBuffer("raja");
static StringBuffer buffer2=new StringBuffer();
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
StringBuffer filter=new StringBuffer();
HttpSession session=request.getSession();
}
The above example which of the following are Thread Safe ?
Differences between parameters and attributes :
CustRequest.java
public class CustRequest extends HttpServletRequestWrapper{
public CustRequest(HttpServletRequest request) {
super(request);
}
public String getString(String word){
String word1=super.getParameter(word);
if(word1.equals("java")|| word1.equals("scjp"))
return word;
else
return word1;
}
}
TargetServlet.java
public class TargetServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PrintWriter out = response.getWriter();
String word=((ServletRequest) response).getParameter("word");
out.println("You typed :"+word);
}
}
Demo program to print all context scoped attributes:
public class ContextAttributeDemo extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PrintWriter out = response.getWriter();
out.println("<h1>Context Attributes </h1>");
ServletContext context=getServletContext();
context.setAttribute("course", "SCWCD");
Enumeration e=context.getAttributeNames();
while (e.hasMoreElements()) {
String aname = (String) e.nextElement();
Object avalue=context.getAttribute(aname);
out.println(aname+"......."+avalue+"<br>");
}
}
}
output :
org.apache.catalina.resources.......
org.apache.naming.resources.ProxyDirContext@50a649
course.......SCWCD
com.sun.faces.config.WebConfiguration.......
com.sun.faces.config.WebConfiguration@d507e9
org.apache.AnnotationProcessor.......
org.apache.catalina.util.DefaultAnnotationProcessor@1fa6d18
For every web-application , web-container always add some attributes in application Scope for its internal purpose. Here context Scoped attributes never be empty.
Ex 2: Write a program to print hit count of the web-application:
|
| public RequestDispatcher getRequestDispatcher("String target") |
RequestDispatcher rd=request.getRequestDispatcher("/test2"); //absolute path
RequestDispatcher rd=request.getRequestDispatcher("test2"); //relative path
If the target resource is not available then we will get 404 status code saying requested resource is not available.
| public RequestDispatcher getRequestDispatcher("String target"); |
| public RequestDispatcher getNamedDispatcher("String servletName") ; //in this servletName is logicalname |
| RequestDispatcher rd=context.getNamedDispatcher("targetServlet"); //in this targetServlet is logicalname |
| RequestDispatcher from ServletRequest | RequestDispatcher from ServletContext |
|---|---|
| RequestDispatcher rd = request.getRequestDispatcher("/test2"); RequestDispatcher rd = request.getRequestDispatcher("test2"); The target resource can be specified either by absolute path (or) relative path. |
RequestDispatcher rd = context.getRequestDispatcher("/test2"); The target resource should be specified only by absolute path but not relative path. Otherwise we will get IllegalArgumentException. |
| We can use this RequestDispatcher to communicate only with in the same application | We can use this to communicate either with in the same or outside of the application . But recommended to use to communicate outside of the web-application |
| We can't get RequestDispatcher by <servlet-name> tag | We can get RequestDispatcher by <servlet-name> for this we have getNamedDispatcher( ) |
public class ForwardServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("Hello");
RequestDispatcher rd=request.getRequestDispatcher("/forward2");
rd.forward(request,response);
out.println("Hi");
System.out.println(10/0); //-->1
}
}
public class ForwardTwo extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("This is Second Forward Servlet ");
}
}
public class ForwardTwo extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("This is Forward Servlet ");
out.flush();
RequestDispatcher rd=request.getRequestDispatcher("/forward");
rd.forward(request, response);
// ---life cycle will start to the second servlet
}
}
We can pass Query String as part of forward mechanism
public class ForwardTwo extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("This is Forward Servlet ");
RequestDispatcher rd=request.getRequestDispatcher("/forward?uname=raja&pwdscwcd");
rd.forward(request, response);
}
}
public class ForwardServet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String name=request.getParameter("uname");
String pwd=request.getParameter("pwd");
out.println(name+"........."+pwd);
}
}
login.html
<form action="/servlet/vs"> <table> <tr><td>Name :</td><td> <input type="text" name="uname"></td></tr> <tr><td>Password : </td><td> <input type="text" name="pwd"></td></tr> <tr><td><input type="submit" value="submit"></td></tr> </table> </form>ValidateServlet.java
public class ValidateServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("Validate Servlet");
String name=request.getParameter("uname");
String pwd=request.getParameter("pwd");
if(name.equalsIgnoreCase("raja")&&pwd.equalsIgnoreCase("scwcd")){
RequestDispatcher rd=getServletContext().getRequestDispatcher("/inbox.jsp");
rd.forward(request, response);
}
else {
RequestDispatcher rd=request.getRequestDispatcher("error.jsp");
rd.forward(request, response);
}
}
}
error.jsp
Invalid Credentials , please login here <a href="login.html">LOGIN</a>index.jsp
<h1>Successful Login</h1>
public class IncludeServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("First Include Servlet <br>");
RequestDispatcher rd=request.getRequestDispatcher("/include2");
rd.include(request, response);
out.println("First Include Servlet Again ");
}
}
public class IncludeTwo extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("Include Second Servlet <br>");
}
}
When ever we are sending the request to IncludeServlet the following is the output :
First Include Servlet Include Second Servlet First Include Servlet AgainAfter committing the response we can call include( ) But we can't call forward( ) and sendRedirect( ) .
| forward( ) | include( ) |
|---|---|
s1 ---->forwarding Servlet s2 ---->forwarded Servlet | s1 ----> including Servlet s2 ----> included Servlet |
| Once first Servlet forwards the request to the second Servlet , second Servlet is completely control on response object , provide the response. | In the case of include first Servlet is responsible to provide required response. |
| While performing forward call the response object will be cleared automatically. Hence FirstServlet response won't be displayed for the end-user. | While performing include, the response object won't be cleared. Hence first servlet response also will be displayed for the end-user. |
| After committing the response we can't perform forward. Otherwise we will get IllegalStateException. | After committing the response we can call include mechanism. |
| With in the same Servlet we can call forward( ) only once and mostly as the last statement. | With in the Servlet we can call include( ) any no. of times. |
| In the case of forward( ) , second Servlet has complete control on the response object. | In the case of include , 2 ndServlet doesn't have complete control on the response object. It is not allowed to change response headers. |
| forward mechanism we can use frequently in Servlets because it is associated with processing. | Include mechanism we can use frequently in JSP's , Because it is associated with view part. |
ServletContext context=getServletContext( );
ServletContext fcontext=context.getServletContext("/webapp2");
RequestDispatcher rd=fcontext.getRequestDispatcher("/test2");
rd.forward(req , res );

| public void init(FilterConfig config) throws ServletException |
| public void destroy( ) |
| public void doFilter(ServletRequest request , ServletResponse response, FilterChain chain) throws ServletException, IOException |
| public void doFilter(ServletRequest request, ServletResponse response )throws ServletException, IOException |
public class FirstFilter implements Filter {
public void init(FilterConfig config) throws ServletException {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
PrintWriter out=response.getWriter();
out.println("This is First Filter before processing the request
i.e., pre-processing");
chain.doFilter(request, response);
out.println("This is First Filter after processing the request
i.e., post-processing");
}
public void destroy() {
}
}
public class TargetServletFilter extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("This is Target Servlet Filter ");
}
}
<servlet>
<servlet-name>TargetServletFilter</servlet-name>
<servlet-class>jobs.TargetServletFilter</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TargetServletFilter</servlet-name>
<url-pattern>/tsfilter</url-pattern>
</servlet-mapping>
<filter>
<filter-name>firstfilter</filter-name>
<filter-class>jobs.FirstFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>firstfilter</filter-name>
<url-pattern>/tsfilter</url-pattern>
</filter-mapping>
<filter-mapping> <filter-name>DemoFilter<filter-name> <url-pattern>/test</url-pattern> </filter-mapping>When ever we are sending a request for with specified url-pattern then only Filter will be executed.
<filter-mapping> <filter-name>DemoFilter</filter-name> <servlet-name>TargetServlet</servlet-name> </filter-mapping>Once Servlet got the request automatically Filter will be executed.
A request directly from the browser. (REQUEST ) By RequestDispatcher 's forward call. (FORWARD) By RequestDispatcher's include call. (INCLUDE ) By RequestDispatcher's error call. (ERROR)
<filter-mapping> <filter-name>DemoFilter</filter-name> <url-pattern>/test</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping>In this case Filter won't be executed for RequestDispatcher's INCLUDE call and ERROR page call.
<filter-mapping> <filter-name> <url-pattern> <dispatcher>INCLUDE</dispatcher> </filter-mapping>When ever we are Using <dispatcher> tag, then default behaviour won't be reflected. i.e., we are Overriding default-behaviour by using <dispatcher> tag.
public class FirstDispatcherServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("First Dispatcher Servlet Pre-processing<br>");
RequestDispatcher rd=request.getRequestDispatcher("/dispatcher1");
rd.include(request, response);
out.println("<br>First Dispatcher Servlet Post-processing<br>");
}
}
TargetDispatcherServlet.java
public class TargetDispatcherServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
for(int i=0;i<5;i++)
out.println("<br>This is Target Dispatcher Servlet"+i+"<br>");
}
}
TargetDispatcherServletTwo.java
public class TargetDispatcherServletTwo extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println(10/0);
}
}
DispatcherFilter.java
public class DispatcherFilter implements Filter {
public void destroy() {
System.out.println("Destroy method");
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
PrintWriter out=response.getWriter();
out.println("<br>This is First Filter before processing the request
i.e., pre-processing<br>");
chain.doFilter(request, response);
out.println("<br>This is First Filter after processing the request
i.e., post-processing<br>");
}
public void init(FilterConfig config) throws ServletException {
System.out.println("Filter init method");
}
}

<filter-mapping> <filter-name>Filter1</filter-name> <url-pattern>/Recipes/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>Filter2</filter-name> <url-pattern>/Recipes/HotList.do</url-pattern> </filter-mapping> <filter-mapping> <filter-name>Filter3</filter-name> <url-pattern>/Recipes/Add/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>Filter4</filter-name> <url-pattern>/Recipes/Modify/Modify.do</url-pattern> </filter-mapping> <filter-mapping> <filter-name>Filter5</filter-name> <url-pattern>*</url-pattern> </filter-mapping>
| Request URI | Order of Execution |
|---|---|
| /Recipes/HotList.do | Filter 1,5,2 |
| /Recipes/HotReport.do | Filter 1,5 |
| /HotList.do | Filter 5 |
| /Recipes/Modify/Modify.do | Filter 1,5,4 |
| /Recipes/Add/AddRecipes.do | Filter 1,3,5 |
| Filter's doFilter( ) | FilterChain's doFilter( ) |
|---|---|
| public void doFilter(ServletRequest request , ServletResponse response , FilterChain fc) throws ServletException, IOException | public void doFilter(ServletRequest request , ServletResponse response ) throws ServletException, IOException |
| We can use this method to define entire filtering logic. | We can use this method to forward request to the next level. |
| This doFilter( ) is a callback method because web-container will call this method automatically for every request. | It is a inline method because we have to call this method explicitly then only it will be executed . |
<form action="./wrapper"> Enter Word : <input type="text" name="word"><br> <input type="submit" value="submit"> </form>BadWordWrapperFilter.java
public class BadWordWrapperFilter implements Filter {
public void destroy() {
System.out.println("destroy method");
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
CustomizeWrapperRequest myRequest=new
CustomizeWrapperRequest((HttpServletRequest) request);
chain.doFilter(myRequest, response);
}
public void init(FilterConfig config) throws ServletException {
System.out.println("init method");
}
}
CustomizeWrapperRequest.java
public class CustomizeWrapperRequest extends HttpServletRequestWrapper {
public CustomizeWrapperRequest(HttpServletRequest request) {
super(request);
}
public String getParameter(String x) {
String word1=super.getParameter(x);
if(word1.equalsIgnoreCase("java") || word1.equalsIgnoreCase("scjp") ){
return "SLEEP";
}
else {
return word1;
}
}
}
TargetWrapperServlet.java
public class TargetWrapperServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String word=request.getParameter("word");
out.println("The Entered word is :"+word);
}
}
public class ResponseWrapperFilter implements Filter {
public void destroy() {
System.out.println("Response Wrapper destroy");
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
CustomizeWrapperResponse myReponse=new CustomizeWrapperResponse(
(HttpServletResponse) response);
chain.doFilter(request, myReponse);
String text=myReponse.toString();
if(text!=null)
text=text.toUpperCase();
response.getWriter().write(text);
}
public void init(FilterConfig config) throws ServletException {
System.out.println("Response Wrapper init");
}
}
CustomizeWrapperResponse.java
public class CustomizeWrapperResponse extends HttpServletResponseWrapper {
protected CharArrayWriter charWriter;
protected PrintWriter writer;
public CustomizeWrapperResponse(HttpServletResponse response) {
super(response);
charWriter=new CharArrayWriter();
}
public PrintWriter getWriter() throws IOException {
if(writer!=null){
return writer;
}
return writer=new PrintWriter(charWriter);
}
public String toString() {
String text=null;
if(writer!=null) {
text=charWriter.toString();
}
return text;
}
}
TargetResponseWrapperServlet.java
public class TargetResponseWrapperServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter(); //customize response
out.println("Hi Ashok , Wrappers are very easy ");
}
}
In the above program some implementations required
<web-app>
<servlet>
<servlet-name>FirstServlet</servlet-name>
<servlet-class>jobs.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FirstServlet</servlet-name>
<url-pattern>/fs</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>CustRequest</servlet-name>
<servlet-class>jobs.CustRequest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CustRequest</servlet-name>
<url-pattern>/cr</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>TargetServlet</servlet-name>
<servlet-class>jobs.TargetServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TargetServlet</servlet-name>
<url-pattern>/ts</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ContextAttributeDemo</servlet-name>
<servlet-class>jobs.ContextAttributeDemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ContextAttributeDemo</servlet-name>
<url-pattern>/cad</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>HitCountDemo</servlet-name>
<servlet-class>jobs.HitCountDemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HitCountDemo</servlet-name>
<url-pattern>/hcd</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>SessionCount</servlet-name>
<servlet-class>jobs.SessionCount</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SessionCount</servlet-name>
<url-pattern>/sc</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>UserCount</servlet-name>
<servlet-class>jobs.UserCount</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserCount</servlet-name>
<url-pattern>/uc</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>IPAddress</servlet-name>
<servlet-class>jobs.IPAddress</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>IPAddress</servlet-name>
<url-pattern>/ip</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ContextScopeThreadSafe</servlet-name>
<servlet-class>jobs.ContextScopeThreadSafe</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ContextScopeThreadSafe</servlet-name>
<url-pattern>/csts</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ContextSyncronize</servlet-name>
<servlet-class>jobs.ContextSyncronize</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ContextSyncronize</servlet-name>
<url-pattern>/cs</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ForwardServlet</servlet-name>
<servlet-class>jobs.ForwardServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ForwardServlet</servlet-name>
<url-pattern>/forward</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ForwardTwo</servlet-name>
<servlet-class>jobs.ForwardTwo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ForwardTwo</servlet-name>
<url-pattern>/forward2</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ValidateServlet</servlet-name>
<servlet-class>jobs.ValidateServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ValidateServlet</servlet-name>
<url-pattern>/vs</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>IncludeServlet</servlet-name>
<servlet-class>jobs.IncludeServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>IncludeServlet</servlet-name>
<url-pattern>/include</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>IncludeTwo</servlet-name>
<servlet-class>jobs.IncludeTwo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>IncludeTwo</servlet-name>
<url-pattern>/include2</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>TargetServletFilter</servlet-name>
<servlet-class>jobs.TargetServletFilter</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TargetServletFilter</servlet-name>
<url-pattern>/tsfilter</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>FirstDispatcherServlet</servlet-name>
<servlet-class>jobs.FirstDispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FirstDispatcherServlet</servlet-name>
<url-pattern>/dispatcher</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>TargetDispatcherServlet</servlet-name>
<servlet-class>jobs.TargetDispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TargetDispatcherServlet</servlet-name>
<url-pattern>/dispatcher1</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>TargetDispatcherServletTwo</servlet-name>
<servlet-class>jobs.TargetDispatcherServletTwo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TargetDispatcherServletTwo</servlet-name>
<url-pattern>/dispatcher2</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>TargetWrapperServlet</servlet-name>
<servlet-class>jobs.TargetWrapperServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TargetWrapperServlet</servlet-name>
<url-pattern>/wrapper</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ResponseWrapperFilter</servlet-name>
<servlet-class>jobs.ResponseWrapperFilter</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ResponseWrapperFilter</servlet-name>
<url-pattern>/responsefilter</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>TargetResponseWrapperServlet</servlet-name>
<servlet-class>jobs.TargetResponseWrapperServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TargetResponseWrapperServlet</servlet-name>
<url-pattern>/responsewrapper</url-pattern>
</servlet-mapping>
<filter>
<filter-name>firstfilter</filter-name>
<filter-class>jobs.FirstFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>firstfilter</filter-name>
<url-pattern>/tsfilter</url-pattern>
</filter-mapping>
<filter>
<filter-name>dispatcherfilter</filter-name>
<filter-class>jobs.DispatcherFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>dispatcherfilter</filter-name>
<servlet-name>FirstDispatcherServlet</servlet-name>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
<filter>
<filter-name>BadWordWrapperFilter</filter-name>
<filter-class>jobs.BadWordWrapperFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>BadWordWrapperFilter</filter-name>
<url-pattern>/wrapper</url-pattern>
</filter-mapping>
<filter>
<filter-name>ResponseWrapperFilter</filter-name>
<filter-class>jobs.ResponseWrapperFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ResponseWrapperFilter</filter-name>
<url-pattern>/responsewrapper</url-pattern>
</filter-mapping>
<error-page>
<exception-type>java.lang.ArithmeticException</exception-type>
<location>/dispatcher1</location>
</error-page>
</web-app>