Servletjava
Listenerweb
Filterapache
Listener:監聽器服務器
* 它是一個接口,內容由咱們來實現;session
* 它須要註冊,例如註冊在按鈕上!app
* 監聽器中的方法,會在特殊事件發生時被調用!jsp
觀察者:ide
* 事件源網站
>小偷spa
* 事件
>偷東西
* 監聽器
>警察
>監聽器中的方法:抓捕
* 事件源:三大域!
>ServletContext
<生命週期監聽:ServletContextListener,它有兩個方法,一個在出生時調用,一個在死亡時調用;
<>void contextInitialized(ServletContextEvent sce):建立ServletContext時
<>void contextDestroyed(ServletContextEvent sce):銷燬ServletContext時
<屬性監聽:ServletContextAttributeListener,它有三個方法,一個在添加屬性時調用,一個在替換屬性時調用,最後一個是在移除屬性時調用;
<> void attributeAdded(ServletContextAttributeEvent event):添加屬性時
<> void attributeReplaced(ServletContextAttributeEvent event):替換屬性時
<> void attributeRemoved(ServletContextAttributeEvent event):移除屬性時
>HttpSession
<生命週期監聽:HttpSessionListener,它有兩個方法,一個在出生時調用,一個在死亡時調用;
<>void sessionCreated(HttpSessionEvent se):建立session時
<>void sessionDestroyed(HttpSessionEvent se):銷燬session時
<屬性監聽:HttpSessionAttributeListener,它有三個方法,一個在添加屬性時調用,一個在替換屬性時調用,最後一個是在移除屬性時調用;
<> void attributeAdded(HttpSessionBindingEvent event):添加屬性時
<> void attributeReplaced(HttpSessionBindingEvent event):替換屬性時
<> void attributeRemoved(HttpSessionBindingEvent event):移除屬性時
>ServletRequest
<生命週期監聽:ServletRequestListener,它有兩個方法,一個在出生時調用,一個在死亡時調用;
<>void requestInitialized(ServletRequestEvent sre):建立request時
<>void requesDestroyed(ServletRequestEvent sre):銷燬request時
<屬性監聽:ServletRequestAttributeListener,它有三個方法,一個在添加屬性時調用,一個在替換屬性時調用,最後一個是在移除屬性時調用;
<> void attributeAdded(ServletRequestAttributeEvent srae):添加屬性時
<> void attributeReplaced(ServletRequestAttributeEvent srae):替換屬性時
<> void attributeRemoved(ServletRequestAttributeEvent srae):移除屬性時
* 寫一個監聽器類:要求必須實現某個監聽器接口;
package com.xjs.web.listener; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; /** * ServletContext生死監聽 * @author hp * *能夠在這個監聽器存放一些在Tomcat啓動時就要完成的代碼! */ public class AListener implements ServletContextListener { @Override public void contextDestroyed(ServletContextEvent arg0) { System.out.println("哇,我要掛也!"); } @Override public void contextInitialized(ServletContextEvent arg0) { System.out.println("哇,我來也!"); } }
* 註冊,是在web.xml中配置來完成註冊!
<listener> <listener-class>com.xjs.web.listener.AListener</listener-class> </listener>
* ServletContextEvent:其方法ServletContext getServletContext()
* HttpSessionEvent:其方法HttpSession getSession()
* ServletRequestEvent:兩個方法1.ServletRequest getServletRequest() 2.ServletContext getServletContext()
寫一個BListener實現ServletContextAttributeListener接口:
package com.xjs.web.listener; import javax.servlet.ServletContextAttributeEvent; import javax.servlet.ServletContextAttributeListener; import javax.servlet.annotation.WebListener; public class BListener implements ServletContextAttributeListener { public void attributeAdded(ServletContextAttributeEvent scab) { System.out.println("您向application中添加了一個名爲"+scab.getName()+",值爲:"+scab.getValue()+"的屬性" ); } public void attributeReplaced(ServletContextAttributeEvent scab) { //返回的是舊值 System.out.println(scab.getName()+"="+scab.getValue()); //返回的新值 System.out.println(scab.getServletContext().getAttribute("金泰妍")); } public void attributeRemoved(ServletContextAttributeEvent scab) { //最後一次相見 System.out.println(scab.getName()+"="+scab.getValue()); } }
index.jsp:向application域中保存----能夠在BListener這個屬性監聽器中獲取其鍵值。
<% application.setAttribute("金泰妍", "taeyeon"); %>
replace.jsp:替換原有屬性
<% application.setAttribute("金泰妍", "抽抽"); %>
remove.jsp:移除原有屬性
<% application.removeAttribute("金泰妍"); %>
* 它是用來添加到Javabean上,而不是添加到三大域上!
HttpSessionBindingListener:添加到JavaBean上,JavaBean就知道本身是否添加到session中了。
若是在程序中向session中保存了東西,在stop了Tomcat後,會在Tomcat的目錄下的work目錄下對應的項目中會生成一個SESSIONS.ser文件(是保存的session)。當再次run服務器時,會加載此文件,而後該項目下的SESSIONS.ser文件消失。-------這樣就會產生了session的死而復生。
好比:某些用戶在某網站上正在瀏覽信息,忽然該網站的服務器關閉,重啓。用戶短暫掉線,服務器端會把用戶的信息保存到session中,而後保存在該項目下的文件中,服務器正常工做後,加載這些文件,不至於登陸的用戶信息丟失。
注:在Tomcat的目錄下的conf目錄的context.xml文件中
加上這句話能夠廢掉session序列化
<!--
廢掉session序列化的
<Manager pathname="" />
-->
鈍化session:Tomcat會把長時間不被使用的session,鈍化session對象。就是把session經過序列化的方式保存到硬盤文件中。
活化session:當用戶在使用session時,Tomcat會把鈍化的對象在活化session。就是把硬盤文件中的session在反序列化回內存。
當session被Tomcat鈍化時,session中存儲的對象也被鈍化,當session被活化時,也會把session中存儲的對象活化。
好比:在網上,用戶過於太多,致使session個數猛增,客戶沒有下線,session增多,從而致使內存壓力,服務器會把長時間沒人訪問的session放在硬盤上,當你在訪問該session時,在從硬盤上讀取到內存中,而後使用。
配置:
1. 把這個寫到Tomcat的web.xml中,全部的項目都生效。2.把它寫到具體的項目中,只對該項目生效。
<!-- PersistentManager:持久的管理
maxIdleSwap:最大的空閒時間(分鐘)
-->
<Context>
<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
<Store className="org.apache.catalina.session.FileStore" directory="mysession"/>
</Manager>
</Context>
已鈍化的session
訪問該session時,該session活化,加載到內存,該文件也不會消失,它會一直保存在硬盤上。
已經設置了session的最大不活動時間爲1分鐘。
建立User類實現這兩個接口:
package com.xjs; import java.io.Serializable; import javax.servlet.http.HttpSessionActivationListener; import javax.servlet.http.HttpSessionEvent; public class User implements HttpSessionActivationListener,Serializable{ /** * 鈍化時調用 */ @Override public void sessionWillPassivate(HttpSessionEvent arg0) { System.out.println("我同session鈍化了,從內存到硬盤"); } /** * 活化時調用 */ @Override public void sessionDidActivate(HttpSessionEvent arg0) { System.out.println("我同session活化了,從硬盤到內存"); } }
a.jsp:向session中保存一個User對象
<body> <% session.setAttribute("xxx", new User()); %> </body>
b.jsp:從session中取出User對象
<body> <% out.print(session.getAttribute("xxx")); %> </body>
先訪問a.jsp後,向session保存User;等一分鐘,User對象同session一同鈍化。再訪問b.jsp,能夠獲得User對象。
網頁的國際化