過濾器
顧名思義是起到過濾的作用,所有的請求在真正到達servlet之前都會首先經過過濾器過濾一遍。過濾器也是 Servlet的一種,是以也有init和destroy方法,還有一個服務方法service,隻是這裡提供的服務是過濾; 一個Servlet要想成為過濾器需要 實作javax.servlet.Filter 接口 ;
一般用戶端送出請求後會交給Servlet;如果過濾器存在,則用戶端發出的請求都是先交給過濾器,然後交給Servlet;
我們可以完成一些在執行Servlet之前必須要做的事,比如request.setCharacterEncoding("GBK");
必須實作以下方法:
1.public void init(FilterConfig config) throws ServletException{} // init方法在Web容器啟動時就會調用;
2.public void doFilter(ServletRequest req,ServletResponse resp,FilterChain chain){} // doFilter的參數是ServletRequest和ServletResponse而不是Http的;
3.public void destroy(){}//應用被關閉時調用
在實作doFilter方法時一定要執行如下操作:
public void doFilter(ServletRequest req,ServletResponse resp,FilterChain chain){
chain.doFilter(req,resp); //向servlet傳遞請求,否則servlet無法執行
}
寫完過濾器後,我們必須要限制過濾器調用的範圍,即域名為多少時會調用過濾器,我們在web.xml 中進行配置
- <filter>
- <filter-name>myFilter</filter-name><!--filter的名字-->
- <filter-class>com.lq.Filter.Myfilter</filter-class><!--filter的類全路徑-->
- </filter>
- <filter-mapping>
- <filter-name>myFilter</filter-name><!--和filter的名字一一對應-->
- <url-pattern>/*</url-pattern><!--比如url-pattern中為 /* ,則對于所有請求進行過濾-->
- </filter-mapping>
監聽器
監聽器顧名思義就是監聽某種事件的發生,即當某個事件發生時,就觸發了某個設定好的監聽器,但是這裡觸發的原因不同。例如地震監測儀器監聽地震的發生,大氣監測儀,監測空氣的變化以提供預警。 在servlet中因監聽對象的不同也分為不同的監聽器,這裡指的監聽對象是application、session、request對象,每種對象有各自的監聽器。 編寫完監聽器類後,需要在web.xml中做如下配置
- <listener>
- <listener-class>監聽器類的全路徑</listener-class>
- </listener>
1.application監聽器:ServletContextListener
需要實作的方法:
(1)public void contextInitialized(ServletContextEvent e); //在application建立時就調用
(2)public void contextDestroyed(ServletContextEvent e); //當application銷毀時調用
ServletContextEvent的getServletContext()方法可以取得application對象;
2.application屬性監聽器:ServletContextAttributeListener
需要實作的方法:
(1)public void attributeAdded(ServletContextAttributeEvent e); //當調用application.setAttribute()時調用
(2)public void attributeRemoved(ServletContextAttributeEvent e); //當調用applcaition.removeAttribute()時調用
(3)public void attributeReplaced(ServletContextAttributeEvent e); //當調用兩次application.setAttribute()賦予相同屬性時調用
參數ServletContextAttributeEvent可以獲得觸發該監聽器的屬性名稱和屬性值,方法有:
(1)getName(); 取得屬性的名稱;
(2)getValue(); 取得屬性的值;(注意:傳回的是Object,必須轉型)
3.session監聽器:HttpSessionListener
需要實作的方法:
(1)public void sessionCreated(HttpSessionEvent e); //當打開一個浏覽器時,就會觸發這個方法;
(2)public void sessionDestroyed(HttpSessionEvent e); //當調用session.invalidate();或逾時時調用
HttpSessionEvent的方法getSession()獲得觸發監聽器的session對象;
銷毀session有3種方式:
(1)session.invalidate();//直接銷毀
(2)在web.xml中設定逾時時間://所有session起作用
- <session-config>
- <session-timeout>5</session-timeout> <!-- 5分鐘 -->
- </session-config>
(3)session.setMaxInactiveInterval(秒鐘值);//給指定的session設定逾時時間
注意:如果會話逾時時間設定為-1,則表示會話永遠不會逾時;
4.session屬性監聽器:HttpSessionAttributeListener
需要實作的方法:
(1)public void attributeAdded(HttpSessionBindingEvent e); //當調用session.setAttribute()時調用
(2)public void attributeRemoved(HttpSessionBindingEvent e); //當調用session.removeAttribute()時調用
(3)public void attributeReplaced(HttpSessionBindingEvent e); //當調用兩次session.setAttribute()賦予相同屬性時調用
HttpSessionBindingEvent 方法:
(1)getSession();//擷取觸發監聽器的session
(2)getName();//擷取屬性名稱
(3)getValue();//擷取屬性值
5.session屬性綁定監聽器:HttpSessionBindingListener
需要實作的方法:
(1)public void valueBound(HttpSessionBindingEvent e);
(2)public void valueUnbound(HttpSessionBindingEvent e);
注意:這個監聽器不用在web.xml中進行配置,而自動生效。
當實作這個接口的類被作為屬性添加如内置對象時,就會觸發valueBound;當删除這個屬性時,則會觸發valueUnbound;
比如
class A implements HttpSessionBindingListener{
.....
public void valueBound(HttpSessionBindingEvent e){}
public void valueUnbound(HttpSessionBindingEvent e){}
}
當調用
session.setAttribute("a",new A())時即添加A類對象時,則會觸發valueBound方法,當調用session.removeAttribute("a")時觸發valueUnbound方法;
6.request監聽器:ServletRequestListener
需要實作的方法:
(1)public void requestInitialized(ServletRequestEvent e); //當請求一個網頁(jsp/servlet)時會調用
(2)public void requestDestroyed(ServletRequestEvent e); //當請求結束時會調用
ServletRequestEvent 方法:
(1)getServletContext();取得application對象;
(2)getServletRequest(); 取得request對象;
7.request屬性監聽器:ServletRequestAttributeListener
需要實作的方法:
(1)attributeAdded(ServletRequestAttributeEvent e); //當調用request.setAttribute()時調用
(2)attributeRemoved(ServletRequestAttributeEvent e); //當調用request.removeAttribute()時調用
(3)attributeReplaced(ServletRequestAttributeEvent e); //當調用兩次request.setAttribute()賦予相同屬性時調用
ServletRequestAttributeEvent 方法:
(1)getName();//擷取屬性名
(2)getValue();//擷取屬性值
監聽器應用場景
ServletContextListener:在任何Servlet提供服務之前執行、在Servlet銷毀時執行,用于提前初始化一些資源,比如資料庫連接配接、銷毀一些資源,比如資料庫連接配接;
HttpSessionListener:多少個線上使用者,即跟蹤會話;
ServletContextAttributeListener:上下文中添加、删除、替換了屬性;
ServletRequestListener:請求到來時記錄日志;
ServletRequestAttributeListener:添加、删除、替換請求屬性;
HttpSessionBindingListener:監聽屬性類的添加、删除;
HttpSessionAttributeListener:會話屬性添加、删除、替換;
HttpSessionActivationListener:你有一個屬性類,并且希望這個類的對象在綁定會話遷移到另一個JVM中;
HttpSessionAttributeListener&HttpSessionBindingListener
HttpSessionAttributeListener:當會話中添加、删除、替換屬性時;
HttpSessionBindingListener:當屬性本身作為會話的屬性、從會話中删除時;
HttpSessionBindingListener方法:
(1)public void valueBound(HttpSessionBindingEvent event);
(2)public void valueUnbound(HttpSessionBindingEvent event);
注意:HttpSessionAttributeListener不需要在web.xml中注冊;