javaee学习之路(七)Servlet监听器

来源:互联网 发布:js注释快捷键 edit 编辑:程序博客网 时间:2024/06/06 19:37

例1、基本的监听实例。
第一步、编写监听类.

package cn.itcast.listener;import *;/** * servletContext对象上下文的监听 * @author Administrator * */public class MyServletContextListener implements ServletContextListener {    /**     * 当servletContext对象被创建时调用     */    public void contextInitialized(ServletContextEvent sce) {        System.out.println("servletContext对象被创建   contextInitialized()");        //map中放置系统共有的信息        Map map=new HashMap();        map.put("mary", "xxxxxxxxxxxx");        ServletContext sc=sce.getServletContext();        System.out.println("sc  "+sc);        sc.setAttribute("map", map);    }   /**    * 当servletContext对象销毁时调用    */    public void contextDestroyed(ServletContextEvent sce) {        System.out.println("servletContext对象销毁  contextDestroyed() ");    }}

第二步、在web.xml中注册监听器
……

 <listener>     <listener-class>cn.itcast.listener.MyServletContextListener</listener-class> </listener>

……
第三步、编写测试servlet. TestSrvlet.java

package cn.itcast.web;import *;public class TestServlet extends HttpServlet {    public void doGet(HttpServletRequest request, HttpServletResponse response) throws Exception {        request.setCharacterEncoding("UTF-8");        response.setCharacterEncoding("UTF-8");        response.setContentType("text/html;charset=UTF-8");        PrintWriter out = response.getWriter();        //获取上下文        ServletContext sc = this.getServletContext();        System.out.println("servlet中的sc   "+sc);        Map map = (Map)sc.getAttribute("map");        System.out.println(map.get("mary"));    }    public void doPost(HttpServletRequest request, HttpServletResponse response) throws  Exception {        doGet(request, response);    }}

第四步、运行,观察结果:启动tomcat并在IE中键入:
http://localhost:8080/day18ServletListener/servlet/TestServlet
……
servletContext对象被创建 contextInitialized()
sc org.apache.catalina.core.ApplicationContextFacade@1735f84
……
信息: Server startup in 1851 ms
servlet中的sc org.apache.catalina.core.ApplicationContextFacade@1735f84
xxxxxxxxxxxx

重启服务器,可以看到:
……
servletContext对象销毁 contextDestroyed()
……
2012-10-24 19:22:44 org.apache.catalina.core.StandardContext addApplicationListener
信息: The listener “com.sun.faces.application.WebappLifecycleListener” is already configured for this context. The duplicate definition has been ignored.
servletContext对象被创建 contextInitialized()
sc org.apache.catalina.core.ApplicationContextFacade@f7ce53

例2、ServletSessionListener监听
这里写图片描述
第一步、编写监听类 MyHttpSessionListener.java

package cn.itcast.listener;import *;/** * HttpSessionListener接口用于监听HttpSession对象的创建和销毁 */public class MyHttpSessionListener implements HttpSessionListener {   /**    * 创建一个Session时    */    public void sessionCreated(HttpSessionEvent se) {        System.out.println("创建一个Session时       sessionCreated ");        /*         *  Map map=new HashMap();            map.put("mary", "xxxxxxxxxxxx");            ServletContext sc=sce.getServletContext();            System.out.println("sc  "+sc);            sc.setAttribute("map", map);         */        //获取ServletContext对象        ServletContext sc = se.getSession().getServletContext();        Map map=(Map)sc.getAttribute("map");        System.out.println("HttpSessionListener     "+map.get("mary"));    }    /**     * 销毁一个Session时     */    public void sessionDestroyed(HttpSessionEvent se) {        System.out.println("销毁一个Session时     sessionDestroyed");    }}

第二步、在web.xml文件中注册监听器
……

<listener>     <listener-class>cn.itcast.listener.MyServletContextListener</listener-class> </listener>  <listener>    <listener-class>cn.itcast.listener.MyHttpSessionListener</listener-class> </listener>

……
第三步、session.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" contentType="text/html;charset=UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <title>My JSP 'session.jsp' starting page</title>   </head>  <%      //session.setMaxInactiveInterval(3);3秒后消亡      System.out.println("创建一个Session时       sessionCreated ");   %>  <body>    This is my JSP page. <br>  </body></html>

第四步、执行结果:
1、启动tomcat
……
servletContext对象被创建 contextInitialized()
sc org.apache.catalina.core.ApplicationContextFacade@10948cf
……
信息: Server startup in 1561 ms
2、在IE中键入:
http://localhost:8080/day18ServletListener/session.jsp 执行结果:
创建一个Session时       sessionCreated
HttpSessionListener      xxxxxxxxxxxx
创建一个Session时      sessionCreated
例3、ServletRequestListener监听器
第一步、编写监听器类MyServletRequestListener.java

package cn.itcast.listener;import *;public class MyServletRequestListener implements ServletRequestListener {    /**     * 销毁一个ServletRequest对象时     */    public void requestDestroyed(ServletRequestEvent sre) {        System.out.println("销毁一个ServletRequest对象时   requestDestroyed");        System.out.println("ServletRequestListener监听中的"+sre.getServletRequest());    }    /**     * 创建一个ServletRequest对象时     */    public void requestInitialized(ServletRequestEvent sre) {        System.out.println("创建一个ServletRequest对象时   requestInitialized ");    }}

第二步、在web.xml中注册(注释掉前面的监听器)

<listener>     <listener-class>cn.itcast.listener.MyServletRequestListener</listener-class> </listener>

第三步、request.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" contentType="text/html;charset=UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <title>My JSP 'session.jsp' starting page</title>   </head>  <%     System.out.println("jsp页面中的request:"+request);   %>  <body>    This is my JSP page. <br>  </body></html>

第四步、启动tomcat并在IE中键入:http://localhost:8080/day18ServletListener/request.jsp
得到如下结果:
这里写图片描述

例4、域对象中属性的变更的事件监听器之ServletContextAttributeListener
这里写图片描述
第一步、编写监听器类MyServletContextAttributeListener.java

package cn.itcast.listener;import *;public class MyServletContextAttributeListener implements        ServletContextAttributeListener {    /**     * web容器调用     * 在servletContext中增加属性时,调用     */    public void attributeAdded(ServletContextAttributeEvent scab) {        System.out.println("servletContext增加属性   attributeAdded*****************");        System.out.println("属性的key:"+scab.getName()+":属性的value:"+scab.getValue());    }     /**     * web容器调用     * 在servletContext中删除属性时,调用     */    public void attributeRemoved(ServletContextAttributeEvent scab) {        System.out.println("servletContext删除属性   attributeRemoved*****************");        System.out.println("属性的key:"+scab.getName()+":属性的value:"+scab.getValue());    }    /**     * web容器调用     * 在servletContext中替换属性时,调用     */    public void attributeReplaced(ServletContextAttributeEvent scab) {        System.out.println("servletContext替换属性   attributeReplaced******************");        System.out.println("属性的key:"+scab.getName()+":属性的value:"+scab.getValue());    }}

第二步、在web.xml中注册

<listener>   <listener-class>cn.itcast.listener.MyServletContextAttributeListener</listener-class> </listener>

第三步、applicationAttr.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" contentType="text/html;charset=UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>  </head>  <%      application.setAttribute("username","zhang");      application.setAttribute("username","zhang1");      application.removeAttribute("username");   %>  <body>    This is my JSP page. <br>  </body></html>

第四步、观察运行结果:
1、启动tomcat
这里写图片描述
例5、域对象中属性的变更的事件监听器之HttpSessionAttributeListener
第一步、编写监听器类MyHttpSessionAttributeListener.java

package cn.itcast.listener;import javax.servlet.http.HttpSessionAttributeListener;import javax.servlet.http.HttpSessionBindingEvent;public class MyHttpSessionAttributeListener implements        HttpSessionAttributeListener {    /**     * web容器调用     * 在session中增加属性时,调用     */    public void attributeAdded(HttpSessionBindingEvent se) {        System.out.println("httpSession增加属性   attributeAdded***********************");        System.out.println("属性的key:"+se.getName()+":属性的value:"+se.getValue());    }    /**     * web容器调用     * 在session中删除属性时,调用     */    public void attributeRemoved(HttpSessionBindingEvent se) {        System.out.println("httpSession删除属性   attributeAdded***********************");        System.out.println("属性的key:"+se.getName()+":属性的value:"+se.getValue());    }    /**     * web容器调用     * 在session中替换属性时,调用     */    public void attributeReplaced(HttpSessionBindingEvent se) {        System.out.println("httpSession替换属性   attributeAdded***********************");        System.out.println("属性的key:"+se.getName()+":属性的value:"+se.getValue());    }}

第二步、注册

<listener>   <listener-class>cn.itcast.listener.MyHttpSessionAttributeListener</listener-class> </listener>

第三步、session.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" contentType="text/html;charset=UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>  </head>  <%      session.setAttribute("username","zhang");      session.setAttribute("username","zhang1");      session.removeAttribute("username");   %>  <body>    This is my JSP page. <br>  </body></html>

第四步、运行,启动tomcat在IE中键入:
http://localhost:8080/day18Listener/sessionAttr.jsp得到结果:
httpSession增加属性 attributeAdded***********************
属性的key:username:属性的value:zhang
httpSession替换属性 attributeAdded***********************
属性的key:username:属性的value:zhang
httpSession删除属性 attributeAdded***********************
属性的key:username:属性的value:zhang1

例6、域对象中属性的变更的事件监听器之ServletRequestAttributeListener 同例5
例7、感知session绑定的事件监听器之HttpSessionBindingListener。
第一步、编写javabean User.java

package cn.itcast.listener;import javax.servlet.http.HttpSessionBindingEvent;import javax.servlet.http.HttpSessionBindingListener;public class User implements HttpSessionBindingListener{    private String name;    private String psw;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getPsw() {        return psw;    }    public void setPsw(String psw) {        this.psw = psw;    }    /**由web容器调用     * 在session中放置javabean     */    public void valueBound(HttpSessionBindingEvent event) {        System.out.println("valueBound************************");        System.out.println("HttpSessionBinding session"+event.getSession());        String name=event.getName();        User user = (User)event.getValue();        if(user!=null){            System.out.println("属性的key:"+name+"   属性的value:"+user.getName()+"     "+user.getPsw());        }    }    /**     * 在session中删除javabean     */    public void valueUnbound(HttpSessionBindingEvent event) {        System.out.println("valueUnbound***********************");        String name=event.getName();        User user = (User)event.getValue();        if(user!=null){            System.out.println("属性的key:"+name+"   属性的value:"+user.getName()+"     "+user.getPsw());        }else{            System.out.println("user==null");        }    }}

第二步、sessionBing.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" contentType="text/html;charset=UTF-8"%><%@ page import="cn.itcast.listener.*"%>……  <%       User user=new User();       user.setName("zhang");       session.setAttribute("user",user);     //上一行代码,web容器会调用valueBound方法,       System.out.println("jsp页面中的session:"+session);        User user1=new User();       user1.setName("zhangfeng");       session.setAttribute("user",user1);       session.removeAttribute("user");   %>  <body>    This is my JSP page. <br>  </body></html>

第三步、启动tomcat并在IE中键入:
这里写图片描述
例8、感知session绑定的事件监听器之HttpSessionBindingListener。
第一步、

package cn.itcast.listener;import *;public class User implements HttpSessionActivationListener,java.io.Serializable{    private String name;    private String psw;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getPsw() {        return psw;    }    public void setPsw(String psw) {        this.psw = psw;    }    /**     * 把session对象保存到硬盘上(要序列化)     */    public void sessionWillPassivate(HttpSessionEvent se) {        System.out.println("钝化******************************");    }    /**     * 把session对象从硬盘上读取(要序列化)     */    public void sessionDidActivate(HttpSessionEvent se) {        System.out.println("活化******************************");    }}

第二步、sessionBing.jsp

<%       User user=new User();       user.setName("zhang");       session.setAttribute("user",user);       //上一行代码,web容器会调用valueBound方法,       // System.out.println("jsp页面中的session:"+session);       // User user1=new User();       //user1.setName("zhangfeng");       //session.setAttribute("user",user1);       //session.removeAttribute("user");   %>

第三步、运行观察结果:
1. 启动tomcat,在IE中键入:http://localhost:8080/day18Listener1/sessionBing.jsp
2. 关闭tomcat可以看到:
……
钝化********************
……
此时打开C:\apache-tomcat-6.0.20\work\Catalina\localhost\day18Listener1
可以看到钝化的结果:将session写入到了硬盘上面!!!
3. 启动tomcat:
……
信息: Starting Servlet Engine: Apache Tomcat/6.0.20
活化********************
……
信息: Server startup in 2072 ms
C:\apache-tomcat-6.0.20\work\Catalina\localhost\day18Listener1中的session文件消失:读入到了文件中了!(活化的结果)

注意:sessionBing.jsp中注释部分一定要注释,否则出错!!!
实例:网站的在线人数统计
这里写图片描述
这里写图片描述
这里写图片描述
1、User.java

package cn.itcast.bean;/** * 用户类 * @author Administrator * */public class User {    private String username;    private String psw;    ……}

2、SessionUser.java

package cn.itcast.bean;import *;public class SessionUser extends User implements HttpSessionBindingListener{    private String ip;//登录用户和游客的IP    public String getIp() {        return ip;    }    public void setIp(String ip) {        this.ip = ip;    }    public void valueBound(HttpSessionBindingEvent event) {        //System.out.println("valueBound******************");        //这里的this(SessionUser对象)与login.jsp中新建的SessionUser一样        //1.获取session        HttpSession session=event.getSession();        //2.获取sessionid        String sessionid=session.getId();        //3.获取上下文对象        ServletContext sc=session.getServletContext();        //4.从上下文对象中获取onlinemap(Map)        Map<String,SessionUser> map = (Map)sc.getAttribute("onlinemap");        //5.放置sessionUser对象到Map中        map.put(sessionid, this);    }    public void valueUnbound(HttpSessionBindingEvent event) {}}

3、MyServletContextListener.java

package cn.itcast.listener;import *;/* * 上下文监听 */public class MyServletContextListener implements ServletContextListener {    /**     * 服务器启动时调用,执行顺序最先执行     */    public void contextInitialized(ServletContextEvent sce) {        //System.out.println("contextInitialized");        //初始化集合        Map<String,SessionUser> map=new HashMap<String,SessionUser>();        //获取servletContext        ServletContext sc=sce.getServletContext();        if(sc!=null){            //System.out.println("map***********************");            sc.setAttribute("onlinemap", map);        }    }    public void contextDestroyed(ServletContextEvent sce) {    }}

4、login.jsp

<%     //获取客户端IP     String ip=request.getRemoteAddr();     System.out.println(ip);     //创建SessionUser对象     SessionUser sessionUser=new SessionUser();     sessionUser.setIp(ip);     //用户名为空null     //放置到Session中     session.setAttribute("userInfo",sessionUser);  %>  <body>    <h2>登陆页面游客可以访问login.jsp</h2>       <form action="${pageContext.request.contextPath}/servlet/LoginServlet" method="post">           用户名:<input type="text" name="username"/>           密码:<input type="password" name="psw"/>           <input type="submit" value="登录"/>     </form>     <hr>     <a href="">中俄建交十周年</a>  </body></html>

5、onlinenum.jsp
……

 <body>  显示注册用户信息:<br/>    <c:forEach items="${applicationScope.onlinemap}" var="sessionUser">       <c:if test="${sessionUser.value.username!=null}">         ${sessionUser.value.ip}~~~~~~~${sessionUser.value.username}~~~~~~         <a href="${pageContext.request.contextPath}/servlet/RemoveServlet?sessionid=${sessionUser.key}">转为游客</a><br/>       </c:if>    </c:forEach>      <br/> <br/> 显示游客信息:<br/>    <c:forEach items="${applicationScope.onlinemap}" var="sessionUser">       <c:if test="${sessionUser.value.username==null}">       ${sessionUser.value.ip}~~~~~~~${sessionUser.value.username}<br/>       </c:if>    </c:forEach>

……
6、LoginServlet.java

package cn.itcast.web;import *;public class LoginServlet extends HttpServlet {    public void doGet(HttpServletRequest request, HttpServletResponse response) throws Exception {        request.setCharacterEncoding("UTF-8");        response.setCharacterEncoding("UTF-8");        response.setContentType("text/html;charset=UTF-8");        PrintWriter out = response.getWriter();        String path="";        HttpSession session=request.getSession(false);        //<input type="text" name="username"/>        String username=request.getParameter("username");        if(session!=null){            //session.setAttribute("userInfo",sessionUser);            User user=(User)session.getAttribute("userInfo");            user.setUsername(username);            path="/WEB-INF/jsp/title.jsp";        }        request.getRequestDispatcher(path).forward(request, response);    }    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        doGet(request, response);    }}

7、title.jsp
……

<body>    <h2>只有登录用户才能看到此页面</h2>    <hr>    <a href="">中俄反恐演习顺利结束!</a>

……
8、RemoveServlet.java

package cn.itcast.web;import *;public class RemoveServlet extends HttpServlet {    public void doGet(HttpServletRequest request, HttpServletResponse response) throws Exception {        request.setCharacterEncoding("UTF-8");        response.setCharacterEncoding("UTF-8");        response.setContentType("text/html;charset=UTF-8");        PrintWriter out = response.getWriter();        //获取Sessionid        String sessionid=request.getParameter("sessionid");        //获取ServletContext对象        ServletContext sc=this.getServletContext();        //从ServletContext中获取集合        Map<String,SessionUser> onlinemap=(Map<String,SessionUser>)sc.getAttribute("onlinemap");        //从集合中找出sessionUser对象        SessionUser sessionUser=onlinemap.get(sessionid);        //更改用户名为null        sessionUser.setUsername(null);    }    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        doGet(request, response);    }}

9、MyHttpSessionListener.java

package cn.itcast.listener;import *;public class MyHttpSessionListener implements HttpSessionListener {    public void sessionCreated(HttpSessionEvent se) {    }    /**web容器自动调用     * 当session过期后或消亡的时候,才能执行该方法     */    public void sessionDestroyed(HttpSessionEvent se) {        //1.获取session        HttpSession session=se.getSession();        //2.获取sessionid        String sessionid=session.getId();        //3.获取上下文        ServletContext sc=session.getServletContext();        //4.获取集合        Map<String,SessionUser> onlinemap=(Map<String,SessionUser>)sc.getAttribute("onlinemap");        //5.从集合中清除        onlinemap.remove(sessionid);        //6.session中userInfo也 删除        session.removeAttribute("userInfo");    }}

10、web.xml
……

<listener>   <listener-class>cn.itcast.listener.MyHttpSessionListener</listener-class></listener> <listener>  <listener-class>cn.itcast.listener.MyServletContextListener</listener-class></listener>

……
11.观察效果:
在浏览器中开多个窗口,访问:http://localhost:8080/day18onlineCount/login.jsp
然后在浏览器中键入:http://localhost:8080/day18onlineCount/onlinenum.jsp 即可进行后台管理

0 0
原创粉丝点击