JDK設計模式之——責任鏈
責任鏈的設計模式可以參考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設計模式之——責任鏈