javaweb回顾第十二篇监听器
?前言:在web應(yīng)用中,有時(shí)候你想在web應(yīng)用程序啟動(dòng)或關(guān)閉的時(shí)候執(zhí)行一些任務(wù),或者你想見(jiàn)他Session的創(chuàng)建和關(guān)閉等你就可以通過(guò)監(jiān)聽(tīng)器來(lái)實(shí)現(xiàn)。那么Servlet來(lái)8個(gè)監(jiān)視器接口,下面一一講解一下。
1:ServletContextListener和ServletContextAttributeListener
1.1:ServletContextListener主要用于容器的啟動(dòng)和關(guān)閉時(shí)候進(jìn)行監(jiān)聽(tīng)。有2個(gè)方法分別用于監(jiān)聽(tīng)容器啟動(dòng)和關(guān)閉。比喻我們?cè)谌萜鲉?dòng)的時(shí)候做數(shù)據(jù)庫(kù)連接的初始化。容器關(guān)閉時(shí)候可以通知從來(lái)啟動(dòng)另一個(gè)容器保證應(yīng)用程序的穩(wěn)定運(yùn)行
代碼如下
public class MyServletContextListener implements ServletContextListener{public void contextInitialized(ServletContextEvent sce) {System.out.println("Servlet上下文對(duì)象開(kāi)始進(jìn)行初始化"); }public void contextDestroyed(ServletContextEvent sce) {System.out.println("Servlet上下文對(duì)象開(kāi)始銷(xiāo)毀");} }web.xml配置(下同)
<listener><listener-class>com.lp.listensrs.MyServletContextListener</listener-class></listener>1.2:ServletContextAttributeListener主要用來(lái)監(jiān)聽(tīng)上下文對(duì)象屬性變化的主要有3個(gè)方法分別來(lái)監(jiān)聽(tīng)添加屬性,刪除屬性,以及屬性值得替代。
public class MyServletContextAttributeListener implements ServletContextAttributeListener{public void attributeAdded(ServletContextAttributeEvent scab) { System.out.println("添加的ServletContext屬性是"+scab.getName());}public void attributeRemoved(ServletContextAttributeEvent scab) {System.out.println("刪除的ServletContext屬性是"+scab.getName());}public void attributeReplaced(ServletContextAttributeEvent scab) {System.out.println("屬性值進(jìn)行替代");} }然后我們?cè)趈sp文件上加上
application.setAttribute("sqlName", "admin");application.setAttribute("sqlName", "replaceadmin");application.removeAttribute("sqlName");運(yùn)行可以看到結(jié)果為
2:ServletRequestListener和ServletRequestAttributeListener
2.1:ServletRequestListener主要用來(lái)監(jiān)聽(tīng)httpRequest對(duì)象請(qǐng)求和響應(yīng)的。通過(guò)這個(gè)監(jiān)聽(tīng)器可以監(jiān)聽(tīng)?wèi)?yīng)用程序中每個(gè)HTTP請(qǐng)求的數(shù)量。代碼如下
public class MyServletRequestListener implements ServletRequestListener{public void requestDestroyed(ServletRequestEvent sre) {System.out.println("對(duì)請(qǐng)求進(jìn)行響應(yīng)");}public void requestInitialized(ServletRequestEvent sre) {HttpServletRequest request=(HttpServletRequest)sre.getServletRequest();String url=request.getRequestURL().toString();System.out.println("收到Request請(qǐng)求"+url);} }然后我們可以看結(jié)果
2.1:ServletRequestAttributeListener這個(gè)是監(jiān)聽(tīng)Request屬性的變化和ServletContent基本一樣。代碼如下
public class MyServletRequestAttributeListener implements ServletRequestAttributeListener {public void attributeAdded(ServletRequestAttributeEvent srae) {System.out.println("添加的屬性:"+srae.getName());}public void attributeRemoved(ServletRequestAttributeEvent srae) {System.out.println("刪除的屬性:"+srae.getName());}public void attributeReplaced(ServletRequestAttributeEvent srae) {String str =MessageFormat.format("ServletRequest域?qū)ο笾刑鎿Q了屬性:{0}的值",srae.getName());System.out.println(str);} }3:HttpSessionListener、HttpSessionAttributeListener、HttpSessionBindingListener
3.1:HttpSessionListener主要目的是監(jiān)聽(tīng)Session的創(chuàng)建和消耗的。這里只寫(xiě)一個(gè)簡(jiǎn)單的例子
public class MyHttpSessionListener implements HttpSessionListener{public void sessionCreated(HttpSessionEvent se) {System.out.println("Session創(chuàng)建,Session的Id為"+se.getSession().getId()); }public void sessionDestroyed(HttpSessionEvent se) {System.out.println("Session銷(xiāo)毀");} }3.2:HttpSessionAttributeListener、HttpSessionBindingListener這兩個(gè)我重點(diǎn)說(shuō)下,前者主要是監(jiān)聽(tīng)整個(gè)應(yīng)用程序Session屬性的變化,而后者主要是自身屬性來(lái)實(shí)現(xiàn)的,以便屬性知道他何時(shí)添加到一個(gè)Session中,或者這個(gè)屬性從Session刪除,(HttpSessionBindingListener并不需要在xml中進(jìn)行配置)現(xiàn)在來(lái)演示這個(gè)HttpSessionBindingListener。
我們現(xiàn)在做個(gè)簡(jiǎn)單的在線人數(shù)統(tǒng)計(jì)。
首先做個(gè)userList來(lái)存儲(chǔ)上線的人數(shù),采用單例模式,同時(shí)使用vector來(lái)避免線程安全問(wèn)題。代碼如下
public class UserList {private static final UserList userList=new UserList();private Vector<String> vector;public UserList(){vector=new Vector<String>();}public static UserList getInstance(){return userList;}public void addUser(String name){if(name!=null&&name!=""){vector.addElement(name);}}public void removeUser(String name){if (name!=null&name!="") {vector.remove(name);}}public Enumeration<String> getUserList(){return vector.elements();}public int getUserCount(){return vector.size();} }然后在定義一個(gè)UserBean來(lái)實(shí)現(xiàn)HttpSessionBindingListener從而達(dá)到當(dāng)UserBean對(duì)象加入Session時(shí)調(diào)用valueBound方法刪除UserBean對(duì)象時(shí)候調(diào)用valueUnbound方法。
public class UserBean implements HttpSessionBindingListener{private String userName;private UserList ul=UserList.getInstance();public UserBean(){};public UserBean(String name){this.userName=name;}public void valueBound(HttpSessionBindingEvent event) {ul.addUser(userName);System.out.println("被調(diào)用");}public void valueUnbound(HttpSessionBindingEvent event) {ul.removeUser(userName);System.out.println("移除被調(diào)用");}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}}?然后我們?cè)趤?lái)定義一個(gè)Servlet來(lái)用戶登錄并且把UserBean對(duì)象加入Session中如下
public class OnlineUserServlet extends HttpServlet {private static final long serialVersionUID = 1L;public OnlineUserServlet() {super();}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");String userName=request.getParameter("userName");String pwd=request.getParameter("password");if (userName==null||userName==""||pwd==null||pwd=="") {response.sendRedirect("login.html");return;}HttpSession session=request.getSession();UserBean userBean=(UserBean)session.getAttribute("user");UserList ul=UserList.getInstance();if (userBean==null||!userName.equals(userBean.getUserName())) {userBean=new UserBean(userName);session.setAttribute("user", userBean);}response.setContentType("text/html;charset=gb2312");PrintWriter out=response.getWriter();out.println("歡迎用戶<b>"+userName+"</b>登錄");out.println("<br>當(dāng)前在線用戶列表</br>");Enumeration<String> enums=ul.getUserList();int i=0;while (enums.hasMoreElements()) {out.println(enums.nextElement());out.println(" ");if(i++==10){out.println("<br>");}}out.println("<br>當(dāng)前在線人數(shù):"+i);out.println("<p><a href='logout'>退出登錄</>");out.close();}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}然后在寫(xiě)一個(gè)Servlet退出,把UserBean從Session中刪除
public class LogOutServlet extends HttpServlet{private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=gb2312");HttpSession session=request.getSession();UserBean userBean=(UserBean)session.getAttribute("user");session.removeAttribute("user");PrintWriter out=response.getWriter();out.println("<html><head><title>退出登錄</title></head><body>");out.println(userBean.getUserName()+"你已經(jīng)退出登錄");out.println("<a href='index.html'>重新登錄</a>");out.println("</body></html>");out.close();}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);} }最后寫(xiě)一個(gè)index.html登錄頁(yè)面
<form action="online" method="post"><table><tr><td>用戶名:<input type="text" name="userName" /></td><td>密碼:<input type="password" name="password" /></td><td><input type="submit" value="提交" /></td></tr></table> </form>先用火狐瀏覽器登錄結(jié)婚
然后我在用谷歌瀏覽器登錄
?
轉(zhuǎn)載于:https://www.cnblogs.com/LipeiNet/p/5795186.html
總結(jié)
以上是生活随笔為你收集整理的javaweb回顾第十二篇监听器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: qt-5.6.0 移植之纯净的linux
- 下一篇: VBS基础篇 - 内置函数