jsp中監聽器的使用__js

來源:互聯網
上載者:User
本內容是 Servlet監聽器是給Web應用增加事件處理機制,以便更好地監視和控制Web應用的狀態變化,從而在後台調用相應處理常式。 

監聽對象

監聽介面

監聽事件

ServletRequest

ServletRequestListener

ServletRequestEvent

ServletRequestAttributeListener

ServletRequestAttributeEvent

HttpSession

HttpSessionListener

HttpSessionEvent

HttpSessionActivationListener

HttpSessionAttributeListener

HttpSessionBindingEvent

HttpSessionBindingListener

ServletContext

ServletContextListener

ServletContextEvent

ServletContextAttributeListener

ServletContextAttributeEvent

l可以監聽Http會話活動情況、Http會話中屬性設定情況,也可以監聽Http會話的active、passivate情況等。該監聽器需要使用到如下多個介面類: ØHttpSessionListener Ø HttpSessionActivationListener ØHttpSessionAttributeListener ØHttpSessionBindingListener lHttpSessionListener:監聽HttpSession的操作。 lHttpSessionActivationListener:監聽Http會話active、passivate的情況。使用這個介面可以在JVM之間長久儲存沒有進行序列化的資料,或者是在移動session前後對序列化的對象執行一些附加的操作。 lHttpSessionAttributeListener:監聽HttpSession中屬性的操作。 lHttpSessionBindingListener:這個介面用於監聽Http會話中對象的綁定資訊。

Listener介面

Event類

HttpSessionListener

HttpSessionEvent

HttpSessionActivationListener

HttpSessionAttributeListener

HttpSessionBindingEvent

HttpSessionBindingListener

lHttpSessionAttributeListener介面方法有: ØattributeAdded(HttpSessionBindingEvent se):當在Session增加一個屬性時,調用此方法; ØattributeRemoved(HttpSessionBindingEvent se):當在Session刪除一個屬性時,調用此方法; ØattributeReplaced(HttpSessionBindingEvent se):在Session屬性被重新設定時,調用此方法。
lHttpSessionBindingEvent當中的方法: ØHttpSession getSession():可以擷取Session對象 Øjava.lang.String getName:返回Session增加、刪除或者替換的屬性名稱 Øjava.lang.Object getValue():返回Session增加、刪除或者替換的屬性的值
lHttpSessionListener介面方法有: ØsessionCreated(HttpSessionEvent e):當建立一個Session時,調用該方法 ØsessionDestroyed(HttpSessionEvent e):當銷毀一個Session時,調用該方法
lapplication是ServletContext的執行個體。 lServlet中調用getServletContext()方法得到ServletContext的執行個體。 l當容器啟動時,會建立一個Application範圍的對象。 lApplication參數可由<context-param>元素設定變數。設定如下: 

<context-param>

<param-name>Name</param-name>

<param-value>Jack</param-value>

</context-param> l當容器啟動時,會建立一個Application範圍的對象,可通過如下方式擷取此變數。 

String name = (String)application.getInitParameter("Name");

${initPara.name}

String name = (String)ServletContext.getInitParameter("Name"); 


l用於監聽WEB應用啟動和銷毀的事件,監聽器類需要實現javax.servlet.ServletContextListener介面 lServletContextListener是ServletContext的監聽者,當ServletContext發生變化時,都會觸發該監聽 lServletContextListener介面的主要方法: Øvoid contextInitialized(ServletContextEvent sce):通知正在接受的對象,應用程式已經被載入及初始化 Øvoid contextDestroyed(ServletContextEvent sce):通知正在接受的對象,應用程式已經被銷毀 lServletContextListener介面的一個Event類 lServletContextEvent中的主要方法: ØServletContext getServletContext()用於取得當前的ServletContext對象 lServletContextAttributeListener:用於監聽WEB應用屬性改變的事件,包括:增加屬性、刪除屬性、修改屬性,監聽器類需要實現javax.servlet.ServletContextAttributeListener介面  lServletContextAttributeListener介面主要方法 : ØvoidattributeAdded(ServletContextAttributeEvent scae):若有對象加入Application的範圍,通知正在收聽的對象。 ØvoidattributeRemoved(ServletContextAttributeEvent scae):若有對象從Application的範圍移除,通知正在收聽的對象。 ØvoidattributeReplaced(ServletContextAttributeEvent scae):若在Application的範圍中,有對象取代另一個對象時,通知正在收聽的對象  lServletContextAttributeEvent類中的方法: Øjava.lang.String getName():返回屬性的名稱 Øjava.lang.Object getValue():返回屬性的值  
lServletRequest監聽是Servlet2.4規範中加入的新技術。可以監聽用戶端的請求 。使用到如下兩個介面類: ØServletRequestListener介面:用於監聽用戶端的請求初始化和銷毀的事件,需要實現javax.servlet.ServletRequestListener介面 ØServletRequestAttributeListener:用於監聽WEB應用屬性改變的事件,包括:增加屬性、刪除屬性、修改屬性,監聽器類需要實現javax.servlet.ServletRequestAttributeListener介面 
lServletRequestListener介面有兩個方法: ØrequestInitialized (ServletRequestEvent):通知當前對象,請求已經被載入及初始化 ØrequestDestroyed (ServletRequestEvent):通知當前對象,請求已經被消除。 lServletRequestEvent類中的方法: ØServletRequest getServletRequest():擷取ServletRequest對象; ØServletContext getServletContext():擷取ServletContext對象。 lServletRequestAttributeListener介面方法: Øvoid attributeAdded

  (ServletRequestAttributeEvent e):向Request對象添加新屬性。 Øvoid attributeRemoved

  (ServletRequestAttributeEvent e):從Request對象中刪除屬性。 Øvoid attributeReplaced

  (ServletRequestAttributeEvent e):替換對象中現有屬性值  lServletRequestAttributeEvent中的方法有: Øjava.lang.String getName():返回Request增加、刪除或者替換的屬性名稱 Øjava.lang.Object getValue():返回Request增加、刪除或者替換的屬性的值 l在web模組中的web.xml檔案中進行聲明,代碼如下:

<?xml version="1.0"encoding="UTF-8"?>

<web-app>

......

  <listener>

  <listener-class>pageage.listenerclass</listener-class>

  </listener>

......

</web-app>   
下面使用一執行個體來說明監聽器的使用 l程式要求 Ø通過監聽器實現一個線上使用者的顯示和個數統計。 Ø使用者登入時將使用者名稱添加為HttpSession會話屬性。 Ø登入後跳轉到線上首頁面,顯示當前登入的使用者名稱稱、所有線上人的名稱和個數。 Ø監聽器能夠監聽ServletContext對象的建立和銷毀,監聽HttpSession對象相關的操作,包括建立、銷毀以及屬性的增加、刪除、修改。 Ø把所有監聽的事件記錄寫入txt檔案。 l實現流程 Ø1.OnlineListener.java ü實現對Http會話中的屬性和ServletContext對象的操作 Ø2.OnlineUserList.java ü儲存目前使用者資訊,提供對使用者資訊的相應操作 Ø3.LoginDo.java ü使用者登入Servlet類,擷取輸入的使用者名稱並添加到Http會話屬性中 Ø4. ExitDo.jsp ü使用者退出Servlet類,把Http會話中的使用者名稱屬性銷毀 Ø5. login.jsp ü使用者登入頁面。表單包括一個輸入使用者名稱的文字框和一個提交按鈕,表單Form提交到LoginDo這個Servlet進行登入 Ø6. index.jsp ü判斷是否登入,未登入跳轉到登入頁面。輸出會話變數userName(當前登入使用者)。通過靜態類UserList.java的getUserCount()方法擷取當前線上人數,通過靜態方法getVector()擷取儲存線上使用者的Vector對象,然後遍曆輸出所有線上使用者名稱稱。 l建立“Listener”工程。 l建立“handson.register”包。 l在包下建立OnlineListener.java監聽器類,並在編輯區輸入以下代碼:


package handson.register;import javax.servlet.ServletContextEvent;import javax.servlet.http.HttpSessionAttributeListener;import javax.servlet.http.HttpSessionBindingEvent;import javax.servlet.http.HttpSessionEvent;import java.io.FileOutputStream;import java.io.PrintWriter;import java.util.Date;import java.text.SimpleDateFormat;public class OnlineListener implements HttpSessionAttributeListener{//編寫添加和刪除屬性方法public void attributeAdded(HttpSessionBindingEvent e) {UserList.addUser(String.valueOf(e.getValue())); System.out.println("session(" + e.getSession().getId() + ")增加屬性"+ e.getName() + ",值為" + e.getValue());}public void attributeRemoved(HttpSessionBindingEvent e) {UserList.removeUser(String.valueOf(e.getValue()));System.out.println("session(" + e.getSession().getId() + ")移除屬性"+ e.getName() + ",值為" + e.getValue());}//編寫更改屬性方法public void attributeReplaced(HttpSessionBindingEvent e) {String oldValue=String.valueOf(e.getValue());String newValue=String.valueOf(e.getSession().getAttribute(e.getName()));UserList.removeUser(oldValue); UserList.addUser(newValue);System.out.println("session(" + e.getSession().getId() + ")屬性"+ e.getName() + "的值,由"+oldValue+"更改為" + newValue);}//編寫操作監聽方法,Http會話的建立監聽 ,public void sessionCreated(HttpSessionEvent e) {System.out.println("建立新會話session("+e.getSession().getId()+")");}//Http會話的銷毀監聽 public void sessionDestroyed(HttpSessionEvent e) {System.out.println("銷毀會話session("+e.getSession().getId()+")");}//編寫操作上下文方法,監聽ServletContext建立public void contextInitialized(ServletContextEvent e) {System.out.println("ServletContext初始化......");}//監聽ServletContext銷毀public void contextDestroyed(ServletContextEvent e) {System.out.println("ServletContext被銷毀......"); }//編寫輸出資訊方法private void print(String message) {PrintWriter out = null;try {out = new PrintWriter(new FileOutputStream("d:\\log.txt", true)); out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+ " " + message);out.close();}catch (Exception e){e.printStackTrace();}}}

編寫UserList類主要代碼如下
package handson.register;import java.util.Vector;public class UserList {private static Vector onlineUsers=new Vector();public static void addUser(String userName){onlineUsers.addElement(userName);}public static void removeUser(String userName){onlineUsers.removeElement(userName);}//擷取線上使用者數量public static int getUserCount(){return onlineUsers.size();}public static Vector getVector(){return onlineUsers;} }

LoginDo類中編寫使用者登入代碼如下
package handson.register;import java.io.IOException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;public class LoginDo extends HttpServlet {private static final long serialVersionUID = 1L;protected  void doPost(HttpServletRequest req, HttpServletResponse resp)throws IOException{String userName=req.getParameter("userName"); HttpSession session=req.getSession();session.setAttribute("userName", userName); resp.sendRedirect("index.jsp");}} 

ExitDo類編寫退出登入主要代碼如下
package handson.register;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class ExitDo extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.getSession().removeAttribute("userName");resp.sendRedirect("login.jsp");}} 

配置登入和退出Servlet :
<listener><listener-class>handson.register.OnlineListener</listener-class></listener>    <servlet><servlet-name>loginDo</servlet-name><servlet-class>handson.register.LoginDo</servlet-class></servlet><servlet><servlet-name>exitDo</servlet-name><servlet-class>handson.register.ExitDo</servlet-class></servlet><servlet-mapping><servlet-name>loginDo</servlet-name><url-pattern>/loginDo</url-pattern></servlet-mapping><servlet-mapping><servlet-name>exitDo</servlet-name><url-pattern>/exitDo</url-pattern></servlet-mapping>

建立login.jsp頁面
<form method="post" action="loginDo"><center><h2>使用者登入</h2><hr/><br/>使用者名稱:<input type="text" name="userName"/><br/><input type="submit" value="登入" /></center></form>

編寫index.jsp頁面中獲得登入資訊代碼
 
<body>    <%//如果未登入,轉向登入頁面if(session.getAttribute("userName")==null){response.sendRedirect("login.jsp");}Vector onlineUsers=UserList.getVector(); %><h2>登入成功</h2>歡迎你 <span style="color:red;"><%=session.getAttribute("userName") %></span>     <a href="exitDo">退出登入</a>當前線上人數:<span style="color:red;"><%=UserList.getUserCount() %>人</span><br/><br>線上使用者名稱單 :<br/><select multiple="multiple" name="list"style="width:200px;height:250px"><%for(int i=0;i<onlineUsers.size();i++){out.write("<option>"+onlineUsers.get(i)+"</option>");}%></select>   </body>

運行顯示結果:






相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.