责任链的设计模式可以参考 Servlet 的 FilterChain.FilterChain 中的每个 Filter(过滤器) 就像一个个的链条 http://tool.oschina.net/apidocs/apidoc?api=javaEE6
接口 Filter
doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
The doFilter method of the Filter is called by the container each time a request/response pair is passed through the chain due to a client request for a resource at the end of the chain.
过滤器 Filter 中 doFliter 方法完成实际的过滤操作, 通过参数 FilterChain 把多个过滤器串联起来.
参数 FliterChain
doFilter(ServletRequest request, ServletResponse response)
Causes the next filter in the chain to be invoked, or if the calling filter is the last filter in the chain, causes the resource at the end of the chain to be invoked.
执行 fliterChain 的 doFilter 方法, 会执行下一个 filter 的 doFilter 方法同时 FliterChain 会当做参数传给下一个 Filter.(Filter 的执行循序 和在 web.xml 配置的顺序一致)
责任链设计模式的特点是
Filter1 code11 chain.doFilter() code12 | Filter2 code21 chain.doFilter() code22 |
Servlet 的 request 请求 | Servlet 的 resopnse 响应 |
执行 code11 后通过 chain.doFilter() 方法, 代码会到 Filter2 中去 然后执行 code21(如果有下一个 filter 会接着执行下一个 filter) | 执行完所有的过滤器之后 开始 response 返回 先从最末的一个过滤器开始返回 于是 response 时候的代码执行顺序是 code22 code12 |
上面的执行顺序会是 code11 code21 code22 code12 FilterChain 通过参数传递起到串联所有 Filter 的作用, 通过执行 chain.doFilter() 来进入下一个 Filter
代码证明:
1. 首先声明一个 Servlet
- package javaee.net.cn.websocket;
- 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 MyServlet extends HttpServlet {
- private static final long serialVersionUID = 1L;
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {;
- System.out.println("doGet>>>>>>>>>>>>>>>>>>");
- }
- }
2. 声明两个过滤器
- package javaee.net.cn.websocket;
- 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 NoteFilter implements Filter {
- @Override
- public void destroy() {
- System.out.println("note destory<<<<<<<<<<<<<<<<");
- }
- @Override
- public void doFilter(ServletRequest request, ServletResponse response,
- FilterChain chain) throws IOException, ServletException {
- System.out.println("request note filter");
- chain.doFilter(request, response);
- System.out.println("response note filter");
- }
- @Override
- public void init(FilterConfig filterConfig) throws ServletException {
- System.out.println("note init<<<<<<<<<<<<<<");
- }
- }
- package javaee.net.cn.websocket;
- 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 htmlFilter implements Filter {
- @Override
- public void destroy() {
- System.out.println("html destory<<<<<<<<<<<<<<<<");
- }
- @Override
- public void doFilter(ServletRequest request, ServletResponse response,
- FilterChain chain) throws IOException, ServletException {
- System.out.println("request html filter");
- chain.doFilter(request, response);
- System.out.println("response html filter");
- }
- @Override
- public void init(FilterConfig filterConfig) throws ServletException {
- System.out.println("html init<<<<<<<<<<<<<<");
- }
- }
3. 在 web.xml 中配置 Servlet 和过滤器
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
- <display-name>Tab3</display-name>
- <welcome-file-list>
- <welcome-file>index.html</welcome-file>
- <welcome-file>index.htm</welcome-file>
- </welcome-file-list>
- <filter>
- <filter-name>NoteFilter</filter-name>
- <filter-class>javaee.net.cn.websocket.NoteFilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>NoteFilter</filter-name>
- <url-pattern>/myServlet</url-pattern>
- </filter-mapping>
- <filter>
- <filter-name>HtmlFilter</filter-name>
- <filter-class>javaee.net.cn.websocket.HtmlFilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>HtmlFilter</filter-name>
- <url-pattern>/myServlet</url-pattern>
- </filter-mapping>
- <!-- 上面配置 fliter 下面配置 Servlet -->
- <servlet>
- <servlet-name>MyServlet</servlet-name>
- <servlet-class>javaee.net.cn.websocket.MyServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>MyServlet</servlet-name>
- <url-pattern>/myServlet</url-pattern>
- </servlet-mapping>
- </web-app>
4. 浏览器输入 web.xml 配置的 url 路径: http://127.0.0.1:8080/myServlet
输出结果是:
- request note filter
- request html filter
- doGet>>>>>>>>>>>>>>>>>>
- response html filter
- response note filter
和上面分析一致
来源: http://www.bubuko.com/infodetail-2659743.html