本文源碼: GitHub·點這裏 || GitEE·點這裏
JavaWeb三大組件:Servlet,Listener,Filter。監聽器就是指在應用程序中監聽相關對象狀態變化的組件。html
指被監聽對象。java
ServletContextListener
生命週期監聽,它有兩個方法,出生時調用contextInitialized()
,銷燬時調用contextDestroyed()
;node
ServletContextAttributeListener
屬性監聽,它有三個方法,添加屬性attributeAdded()
,替換屬性attributeReplaced()
,移除屬性時attributeRemoved()
。git
HttpSessionListener
生命週期監聽:它有兩個方法,出生時調用sessionCreated()
,銷燬時調用sessionDestroyed()
;github
HttpSessioniAttributeListener
屬性監聽:它有三個方法,添加屬性attributeAdded()
,替換屬性attributeReplaced()
,移除屬性attributeRemoved()
。web
ServletRequestListener
生命週期監聽:它有兩個方法,出生時調用requestInitialized()
,銷燬時調用requestDestroyed()
;segmentfault
ServletRequestAttributeListener
屬性監聽:它有三個方法,添加屬性attributeAdded()
,替換屬性attributeReplaced()
,移除屬性attributeRemoved()
。服務器
TheContextListener
session
public class TheContextListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent servletContextEvent) { System.out.println("初始化:TheContextListener"); ServletContext servletContext = servletContextEvent.getServletContext() ; servletContext.setAttribute("author","cicada"); } @Override public void contextDestroyed(ServletContextEvent servletContextEvent) { System.out.println("銷燬:TheContextListener"); } }
TheRequestListener
app
public class TheRequestListener implements ServletRequestListener { @Override public void requestDestroyed(ServletRequestEvent servletRequestEvent) { System.out.println("初始化:TheRequestListener"); } @Override public void requestInitialized(ServletRequestEvent servletRequestEvent) { System.out.println("銷燬:TheRequestListener"); } }
TheSessionListener
public class TheSessionListener implements HttpSessionListener { @Override public void sessionCreated(HttpSessionEvent httpSessionEvent) { System.out.println("初始化:TheSessionListener"); } @Override public void sessionDestroyed(HttpSessionEvent httpSessionEvent) { System.out.println("銷燬:TheSessionListener"); } }
RequestAttributeListener
public class RequestAttributeListener implements ServletRequestAttributeListener { @Override public void attributeAdded(ServletRequestAttributeEvent evt) { System.out.println("Request添加屬性:"+evt.getName()+";"+evt.getValue()); } @Override public void attributeRemoved(ServletRequestAttributeEvent evt) { System.out.println("Request移除屬性:"+evt.getName()+";"+evt.getValue()); } @Override public void attributeReplaced(ServletRequestAttributeEvent evt) { System.out.println("Request替換屬性:"+evt.getName()+";"+evt.getValue()); } }
<!-- 監聽器相關配置 --> <listener> <listener-class>com.node05.servlet.listener.TheContextListener</listener-class> </listener> <listener> <listener-class>com.node05.servlet.listener.TheSessionListener</listener-class> </listener> <listener> <listener-class>com.node05.servlet.listener.TheRequestListener</listener-class> </listener> <listener> <listener-class>com.node05.servlet.listener.RequestAttributeListener</listener-class> </listener> <session-config> <!-- 設置session失效時間爲1分鐘 --> <session-timeout>1</session-timeout> </session-config>
public class ListenerServletImpl extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); // 一、獲取TheContextListener初始化數據 ServletContext servletContext = this.getServletContext() ; String author = String.valueOf(servletContext.getAttribute("author")) ; System.out.println("TheContextListener Author:"+author); // 二、Request屬性設置 request.setAttribute("mood","smile"); request.setAttribute("mood","agitated"); // 三、Session建立,1分鐘失效,調用銷燬 HttpSession session = request.getSession(true) ; session.setAttribute("casually","casually"); response.getWriter().print("Hello:Listener"); } }
客戶端請求Servlet時,先執行相關Filter,若是Filter經過,則繼承執行請求的Servlet;若是Filter不經過,則不會執行用戶請求的Servlet。過濾器能夠動態地攔截請求和響應。
Filter接口定義了三個核心方法。
應用程序啓動時,服務器實例化Filter對象,並調用其init方法,讀取web.xml配置,完成對象的初始化加載。
實際的過濾操做,請求達到服務器時,Servlet容器將先調用過濾器的doFilter方法。
容器在銷燬過濾器前調用該方法,釋放過濾器佔用的資源。
public class ThePrintLogFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { String myName = filterConfig.getInitParameter("myName") ; System.out.println("myName:"+myName); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest)servletRequest ; HttpServletResponse response = (HttpServletResponse)servletResponse ; String name = request.getParameter("name") ; if (!name.equals("cicada")){ response.getWriter().print("User Error !"); return ; } chain.doFilter(servletRequest,servletResponse); } @Override public void destroy() { System.out.println("ThePrintLogFilter destroy()"); } }
<!-- 過濾器相關配置 --> <filter> <filter-name>thePrintLogFilter</filter-name> <filter-class>com.node05.servlet.filter.ThePrintLogFilter</filter-class> <init-param> <param-name>myName</param-name> <param-value>cicada</param-value> </init-param> </filter> <filter-mapping> <filter-name>thePrintLogFilter</filter-name> <url-pattern>/filterServletImpl</url-pattern> </filter-mapping>
public class FilterServletImpl extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); response.getWriter().print("Hello:Filter"); } }
Spring框架中的攔截器Interceptor相似於Servlet中的過濾器Filter,主要用於攔截用戶請求並做相應的處理。例如經過攔截器能夠進行權限驗證、記錄請求信息的日誌、判斷用戶是否登陸等。請求轉發不執行攔截、過濾;重定向執行攔截和過濾。
GitHub·地址 https://github.com/cicadasmile/java-base-parent GitEE·地址 https://gitee.com/cicadasmile/java-base-parent