本文源碼: GitHub·點這裡 || GitEE·點這裡
一、Listener監聽器
1、概念簡介
JavaWeb三大元件:Servlet,Listener,Filter。監聽器就是指在應用程式中監聽相關對象狀态變化的元件。
2、事件源對象
指被監聽對象。
- ServletContext
ServletContextListener
生命周期監聽,它有兩個方法,出生時調用
contextInitialized()
,銷毀時調用
contextDestroyed()
;
ServletContextAttributeListener
屬性監聽,它有三個方法,添加屬性
attributeAdded()
,替換屬性
attributeReplaced()
,移除屬性時
attributeRemoved()
。
- HttpSession
HttpSessionListener
生命周期監聽:它有兩個方法,出生時調用
sessionCreated()
sessionDestroyed()
;
HttpSessioniAttributeListener
屬性監聽:它有三個方法,添加屬性
attributeAdded()
attributeReplaced()
,移除屬性
attributeRemoved()
- ServletRequest
ServletRequestListener
requestInitialized()
requestDestroyed()
ServletRequestAttributeListener
attributeAdded()
attributeReplaced()
attributeRemoved()
3、編碼案例
- 相關監聽器
TheContextListener
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
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());
}
}
- web.xml配置檔案
<!-- 監聽器相關配置 -->
<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");
// 1、擷取TheContextListener初始化資料
ServletContext servletContext = this.getServletContext() ;
String author = String.valueOf(servletContext.getAttribute("author")) ;
System.out.println("TheContextListener Author:"+author);
// 2、Request屬性設定
request.setAttribute("mood","smile");
request.setAttribute("mood","agitated");
// 3、Session建立,1分鐘失效,調用銷毀
HttpSession session = request.getSession(true) ;
session.setAttribute("casually","casually");
response.getWriter().print("Hello:Listener");
}
}
二、Filter過濾器
1、過濾器簡介
用戶端請求Servlet時,先執行相關Filter,如果Filter通過,則繼承執行請求的Servlet;如果Filter不通過,則不會執行使用者請求的Servlet。過濾器可以動态地攔截請求和響應。
2、Filter接口
Filter接口定義了三個核心方法。
- init()
應用程式啟動時,伺服器執行個體化Filter對象,并調用其init方法,讀取web.xml配置,完成對象的初始化加載。
- doFilter()
實際的過濾操作,請求達到伺服器時,Servlet容器将先調用過濾器的doFilter方法。
- destroy()
容器在銷毀過濾器前調用該方法,釋放過濾器占用的資源。
- 編寫過濾器
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");
}
}
三、Interceptor攔截器
Spring架構中的攔截器Interceptor類似于Servlet中的過濾器Filter,主要用于攔截使用者請求并作相應的處理。例如通過攔截器可以進行權限驗證、記錄請求資訊的日志、判斷使用者是否登入等。請求轉發不執行攔截、過濾;重定向執行攔截和過濾。
---END---