三大組件:
Servlet
Listener
Filter
Listener:監聽器
* 它是一個接口,內容由我們來實現;
* 它需要注冊,例如注冊在按鈕上!
* 監聽器中的方法,會在特殊事件發生時被調用!
觀察者:
* 事件源
>小偷
* 事件
>偷東西
* 監聽器
>警察
>監聽器中的方法:抓捕
JavaWeb中的監聽器
* 事件源:三大域!
>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):移除屬性時
JavaWeb中完成編寫監聽器:
* 寫一個監聽器類:要求必須實現某個監聽器接口;
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("金泰妍"); %>
感知監聽(都與HttpSession相關)
* 它是用來添加到Javabean上,而不是添加到三大域上!
HttpSessionBindingListener:添加到JavaBean上,JavaBean就知道自己是否添加到session中了。
session的序列化(關閉服務器后,再次開啟,還有獲取到session中的值)
如果在程序中向session中保存了東西,在stop了Tomcat后,會在Tomcat的目錄下的work目錄下對應的項目中會生成一個SESSIONS.ser文件(是保存的session)。當再次run服務器時,會加載此文件,然后該項目下的SESSIONS.ser文件消失。-------這樣就會產生了session的死而復生。
比如:某些用戶在某網站上正在瀏覽信息,突然該網站的服務器關閉,重啟。用戶短暫掉線,服務器端會把用戶的信息保存到session中,然后保存在該項目下的文件中,服務器正常工作后,加載這些文件,不至於登錄的用戶信息丟失。
注:在Tomcat的目錄下的conf目錄的context.xml文件中
加上這句話可以廢掉session序列化
<!--
廢掉session序列化的
<Manager pathname="" />
-->
session的鈍化和活化
鈍化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活化,加載到內存,該文件也不會消失,它會一直保存在硬盤上。
HttpSessionActivationListener(監聽器)和Serializable接口
已經設置了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對象。
網頁的國際化