1. 程式人生 > >JDK設計模式之——責任鏈

JDK設計模式之——責任鏈

code bsp contain implement 輸出 pair err req 執行

責任鏈的設計模式可以參考Servlet的FilterChain。FilterChain中的每個Filter(過濾器)就像一個個的鏈條

  • 接口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

和上面分析一致

JDK設計模式之——責任鏈