过滤器filter学习2—dispatcher拦截案例
4、dispatcher拦截案例
(1)FORWARD案例
【1】说明:
案例包括:Fliter3.java + dispatcher.jsp + index.jsp +web.xml文件配置
目的:
Filter3 通过对资源:index.jsp使用forward调用形式的过滤
在dispatcher.jsp页面中 forward 到 index.jsp
做法:
dispatcher.jsp 页面中 :写入这行代码:<jsp:forwardpage="/index.jsp"></jsp:forward>
web.xml文件中:配置拦截/index.jsp页面的过滤器
说明:因为此时的目标资源:index.jsp是通过forward(过滤器所拦截的资源被 Servlet 容器调用的方式之一)方式访问
【2】Fliter3.java
package com.zhku.jsj144.zk.filter.demo1;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class Filter3 implements Filter {
private FilterConfig config;//定义成员变量--> 目的:获得过滤器配置参数
@Override
public void destroy() {
System.out.println("filter3destroy....");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//拦截代码
System.out.println("filter3... start work ....");
String name=config.getInitParameter("name");
String encoding=config.getInitParameter("encoding");
System.out.println("name:"+name);
System.out.println("encoding:"+encoding);
//放行代码
chain.doFilter(request,response);//放行
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("filter3init....");
this.config=filterConfig;
}
}
【3】dispatcher.jsp
<%@ page language="java" import="java.util.*"pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
世界如此美丽<br/>
<jsp:forward page="/index.jsp"></jsp:forward>
</body>
</html>
【4】index.jsp
<%@ page language="java" import="java.util.*"pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
This is my JSP page.
时间如此快<br/>
</body>
</html>
【5】web.xml文件配置
<!-- Filter3 通过对资源:index.jsp使用forward调用形式的过滤 -->
<!--在dispatcher.jsp页面种 forward 到 index.jsp
做法:<jsp:forwardpage="/index.jsp"></jsp:forward>
-->
<filter>
<filter-name>Filter3</filter-name>
<filter-class>com.zhku.jsj144.zk.filter.demo1.Filter3</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<init-param>
<param-name>name</param-name>
<param-value>世间</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Filter3</filter-name>
<url-pattern>/index.jsp</url-pattern>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
(2)REQUEST案例
【1】说明:
案例包括:Filter4.java+Servlet2.java+ web.xml文件配置
目的:
Filter4通过对资源:Servlet2使用request调用形式的过滤
在Servlet2中,通过获取参数,从而调用过滤器Filter4
做法:
Servlet2中 :获取参数:String name=request.getParameter("abc");
web.xml文件中:配置拦截/servlet2的过滤器
说明:因为此时的目标资源:servlet2是通过request(过滤器所拦截的资源被 Servlet 容器调用的方式之一)方式访问
【2】Filter4.java
package com.zhku.jsj144.zk.filter.demo1;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class Filter4 implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//拦截代码
System.out.println("filter4... start work ....");
//放行代码
chain.doFilter(request,response);//放行
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {}
@Override
public void destroy() {}
}
【3】Servlet2.java
package com.zhku.jsj144.zk.filter.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Servlet2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//默认:request
String name=request.getParameter("abc");
System.out.println("abc:"+name);
//include
request.getRequestDispatcher("/index.jsp").include(request,response);
request.getRequestDispatcher("/dispatcher.jsp").include(request,response);
response.getWriter().write("你好");
// //forward
// request.getRequestDispatcher("/head.jsp").forward(request,response);
//
// //error错误的时候
// //配置错误404 500错误等
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}
【4】web.xml文件配置
<!-- Filter4 通过对资源:servlet2 (request请求参数)使用request调用形式的过滤 -->
<filter>
<filter-name>Filter4</filter-name>
<filter-class>com.zhku.jsj144.zk.filter.demo1.Filter4</filter-class>
</filter>
<filter-mapping>
<filter-name>Filter4</filter-name>
<url-pattern>/servlet2</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
(3)INCLUDE案例
【1】说明:
案例包括:Filter5.java+Servlet2.java+ web.xml文件配置+ dispatcher.jsp + index.jsp
目的:
Filter5通过对资源:Servlet2使用include调用形式的过滤
在Servlet2中,通过用include进来页面,即:此时通过include调用形式的过滤,从而调用过滤器Filter4
做法:
Servlet2中 :
request.getRequestDispatcher("/index.jsp").include(request,response);
request.getRequestDispatcher("/dispatcher.jsp").include(request,response);
web.xml文件中:配置拦截/servlet2的过滤器
说明:因为此时的目标资源:servlet2是通过include(过滤器所拦截的资源被 Servlet 容器调用的方式之一)方式访问
【2】Filter5.java
package com.zhku.jsj144.zk.filter.demo1;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class Filter5 implements Filter {
@Override
public void doFilter(ServletRequest request,ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//拦截代码
System.out.println("filter5 ... start work ....");
//放行代码
chain.doFilter(request, response);//放行
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {}
@Override
public void destroy() {}
}
【3】Servlet2.java
package com.zhku.jsj144.zk.filter.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Servlet2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//默认:request
String name=request.getParameter("abc");
System.out.println("abc:"+name);
//include
request.getRequestDispatcher("/index.jsp").include(request,response);
request.getRequestDispatcher("/dispatcher.jsp").include(request,response);
response.getWriter().write("你好");
// //forward
// request.getRequestDispatcher("/head.jsp").forward(request,response);
//
// //error错误的时候
// //配置错误404 500错误等
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}
【4】web.xml文件配置
<!-- Filter5 通过对资源:servlet2中 ,做法:include进来dispatcher.jsp
即: request.getRequestDispatcher("/index.jsp").include(request,response);
request.getRequestDispatcher("/dispatcher.jsp").include(request,response);
使用include调用形式的过滤
-->
<filter>
<filter-name>Filter5</filter-name>
<filter-class>com.zhku.jsj144.zk.filter.demo1.Filter5</filter-class>
</filter>
<filter-mapping>
<filter-name>Filter5</filter-name>
<url-pattern>/dispatcher.jsp</url-pattern>
<dispatcher>INCLUDE</dispatcher>
</filter-mapping>
【5】dispatcher.jsp
看FORWARD案例
【6】index.jsp
看FORWARD案例
(4)ERROR案例
【1】说明:
案例包括:Filter6.java+Servlet3.java+ web.xml文件配置+index.jsp
目的:
Filter6通过对资源:Servlet3使用error调用形式的过滤
在Servlet3中,当servlet中报错时,这时候救护调用过滤器Filter6
做法:
Servlet3中 :通过写入一行错误代码: sdf
web.xml文件中:配置拦截/servlet3的过滤器,并且配置错误信息页面,就是当出现404或者500错误的时候,过滤器会让当前的应用从错误的servlet3中跳转到:指定的index.jsp,这样就可以在程序出错时,仍然可以使用当前web应用,而不是跳出一些奇怪的页面。
说明:因为此时的目标资源:servlet3是通过error(过滤器所拦截的资源被 Servlet 容器调用的方式之一)方式访问
【2】Filter6.java
package com.zhku.jsj144.zk.filter.demo1;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class Filter6 implements Filter {
@Override
public void doFilter(ServletRequest request,ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//拦截代码
System.out.println("filter6 ... start work ....");
//放行代码
chain.doFilter(request, response);//放行
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {}
@Override
public void destroy() {}
}
【3】Servlet3.java
package com.zhku.jsj144.zk.filter.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Servlet3 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("世界如此美丽");
//如果此行代码不注释,即servlet3代码报错,
//因为目标资源是通过声明式异常处理机制调用时,那么该过滤器:filter6将被调用
//反过来说:一旦注释,filter6不会工作。
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}
【4】web.xml文件配置
解释:一旦出现错误,就会跳转到错误信息页面的指定跳转页:index.jsp
<!-- Filter6 通过对资源:使用error调用形式的过滤 -->
<filter>
<filter-name>Filter6</filter-name>
<filter-class>com.zhku.jsj144.zk.filter.demo1.Filter6</filter-class>
</filter>
<filter-mapping>
<filter-name>Filter6</filter-name>
<url-pattern>/servlet3</url-pattern>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
<!-- 配置error信息页面 -->
<error-page>
<error-code>404</error-code>
<location>/index.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/index.jsp</location>
</error-page>
【5】index.jsp
看FORWARD案例