javaweb回顾第十二篇监听器
?前言:在web應用中,有時候你想在web應用程序啟動或關閉的時候執行一些任務,或者你想見他Session的創建和關閉等你就可以通過監聽器來實現。那么Servlet來8個監視器接口,下面一一講解一下。
1:ServletContextListener和ServletContextAttributeListener
1.1:ServletContextListener主要用于容器的啟動和關閉時候進行監聽。有2個方法分別用于監聽容器啟動和關閉。比喻我們在容器啟動的時候做數據庫連接的初始化。容器關閉時候可以通知從來啟動另一個容器保證應用程序的穩定運行
代碼如下
public class MyServletContextListener implements ServletContextListener{public void contextInitialized(ServletContextEvent sce) {System.out.println("Servlet上下文對象開始進行初始化"); }public void contextDestroyed(ServletContextEvent sce) {System.out.println("Servlet上下文對象開始銷毀");} }web.xml配置(下同)
<listener><listener-class>com.lp.listensrs.MyServletContextListener</listener-class></listener>1.2:ServletContextAttributeListener主要用來監聽上下文對象屬性變化的主要有3個方法分別來監聽添加屬性,刪除屬性,以及屬性值得替代。
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("屬性值進行替代");} }然后我們在jsp文件上加上
application.setAttribute("sqlName", "admin");application.setAttribute("sqlName", "replaceadmin");application.removeAttribute("sqlName");運行可以看到結果為
2:ServletRequestListener和ServletRequestAttributeListener
2.1:ServletRequestListener主要用來監聽httpRequest對象請求和響應的。通過這個監聽器可以監聽應用程序中每個HTTP請求的數量。代碼如下
public class MyServletRequestListener implements ServletRequestListener{public void requestDestroyed(ServletRequestEvent sre) {System.out.println("對請求進行響應");}public void requestInitialized(ServletRequestEvent sre) {HttpServletRequest request=(HttpServletRequest)sre.getServletRequest();String url=request.getRequestURL().toString();System.out.println("收到Request請求"+url);} }然后我們可以看結果
2.1:ServletRequestAttributeListener這個是監聽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域對象中替換了屬性:{0}的值",srae.getName());System.out.println(str);} }3:HttpSessionListener、HttpSessionAttributeListener、HttpSessionBindingListener
3.1:HttpSessionListener主要目的是監聽Session的創建和消耗的。這里只寫一個簡單的例子
public class MyHttpSessionListener implements HttpSessionListener{public void sessionCreated(HttpSessionEvent se) {System.out.println("Session創建,Session的Id為"+se.getSession().getId()); }public void sessionDestroyed(HttpSessionEvent se) {System.out.println("Session銷毀");} }3.2:HttpSessionAttributeListener、HttpSessionBindingListener這兩個我重點說下,前者主要是監聽整個應用程序Session屬性的變化,而后者主要是自身屬性來實現的,以便屬性知道他何時添加到一個Session中,或者這個屬性從Session刪除,(HttpSessionBindingListener并不需要在xml中進行配置)現在來演示這個HttpSessionBindingListener。
我們現在做個簡單的在線人數統計。
首先做個userList來存儲上線的人數,采用單例模式,同時使用vector來避免線程安全問題。代碼如下
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();} }然后在定義一個UserBean來實現HttpSessionBindingListener從而達到當UserBean對象加入Session時調用valueBound方法刪除UserBean對象時候調用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("被調用");}public void valueUnbound(HttpSessionBindingEvent event) {ul.removeUser(userName);System.out.println("移除被調用");}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}}?然后我們在來定義一個Servlet來用戶登錄并且把UserBean對象加入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>當前在線用戶列表</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>當前在線人數:"+i);out.println("<p><a href='logout'>退出登錄</>");out.close();}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}然后在寫一個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()+"你已經退出登錄");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);} }最后寫一個index.html登錄頁面
<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>先用火狐瀏覽器登錄結婚
然后我在用谷歌瀏覽器登錄
?
轉載于:https://www.cnblogs.com/LipeiNet/p/5795186.html
總結
以上是生活随笔為你收集整理的javaweb回顾第十二篇监听器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: qt-5.6.0 移植之纯净的linux
- 下一篇: VBS基础篇 - 内置函数