zoukankan      html  css  js  c++  java
  • javaWeb中servlet开发——监听器

    监听的定义

    对application的监听

    application是servletContext接口的对象,表示的是整个上下文环境,如果要想实现对application监听则可以使用如下两个接口:

    servletContextListener:是对整个上下文环境的监听

    servletContextAttrubiteListener:是对属性的监听。

    import javax.servlet.* ;
    public class ServletContextListenerDemo implements ServletContextListener {
        public void contextInitialized(ServletContextEvent event){
            System.out.println("** 容器初始化 --> " + event.getServletContext().getContextPath()) ;
        }
        public void contextDestroyed(ServletContextEvent event){
            System.out.println("** 容器销毁 --> " + event.getServletContext().getContextPath()) ;
            try{
                Thread.sleep(300) ;
            }catch(Exception e){}
        }
    }

    在web.xml中配置<listener>

    如果在web.xml中有servlet、filter、listener,则配置顺序如下

    <filter>

    <filter-mapping>

    <listener>

    <servlet>

    <servlet-mapping>

    使用servletContextAttributeListener操作属性

    import javax.servlet.* ;
    public class ServletContextAttributeListenerDemo implements ServletContextAttributeListener {
        public void attributeAdded(ServletContextAttributeEvent scab){
            System.out.println("** 增加属性 --> 属性名称:" + scab.getName() + ",属性内容:" + scab.getValue()) ;
        }
        public void attributeRemoved(ServletContextAttributeEvent scab){
            System.out.println("** 删除属性 --> 属性名称:" + scab.getName() + ",属性内容:" + scab.getValue()) ;
        }
        public void attributeReplaced(ServletContextAttributeEvent scab){
            System.out.println("** 替换属性 --> 属性名称:" + scab.getName() + ",属性内容:" + scab.getValue()) ;
        }
    }

    web.xml中配置

    <listener>
    		<listener-class>
    			org.lxh.listenerdemo.ServletContextAttributeListenerDemo
    		</listener-class>
    	</listener>
    

      jsp中显示:

    <%
    	request.setAttribute("info","www.MLDNJAVA.cn") ;
    %>
    

      对session的监听

    注意:session是属于http协议范畴,所以这些接口是在javax.servlet.http中定义的。

    在servlet中,要想取得session依靠的是httpServletRequest接口中的getSession()方法。

    import javax.servlet.http.* ;
    public class HttpSessionListenerDemo 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销毁,SESSION ID = " +se.getSession().getId() ) ;
        }
    }

    之后进行web.xml配置,启动服务器

    当客户端第一次连接到服务器时,服务器会自动为用户创建一个session,同时分配一个sessionId。

    session已经被创建,在第一次访问时触发事件,但什么时候被注销?

    如果要想session被注销,有两种方法,但这两种方法都不是关闭页面可以实现的。

    方法1:session注销---invaldate();

    方法2:超时时间设置——在tomcat中一般时间设置为30min,也可以自己在web.xml中修改

    <%    // 手工注销
        session.invalidate() ;
    %>

    当调用invalidate()方法时session就被销毁了。

    当然,时间越长,占用内存越大。

    web.xml中设置

    <session-config>
       <session-timeout>1</session-timeout>
    </session-config>

    对session中的属性进行监听

    import javax.servlet.http.* ;
    public class HttpSessionAttributeListenerDemo implements HttpSessionAttributeListener {
        public void attributeAdded(HttpSessionBindingEvent se){
            System.out.println(se.getSession().getId() + ",增加属性 --> 属性名称" + se.getName() + ",属性内容:" + se.getValue()) ;
        }
        public void attributeRemoved(HttpSessionBindingEvent se){
            System.out.println(se.getSession().getId() + ",删除属性 --> 属性名称" + se.getName() + ",属性内容:" + se.getValue()) ;
        }
        public void attributeReplaced(HttpSessionBindingEvent se){
            System.out.println(se.getSession().getId() + ",替换属性 --> 属性名称" + se.getName() + ",属性内容:" + se.getValue()) ;
        }
    }
    <%
        session.setAttribute("info","www.MLDNJAVA.cn") ;
    %>

    到此为止,都与servletContext非常相似,之前所有的的监听都要在web.xml中进行配置,但是在session中有一个HttpSessionBindingListener也是实现监听的接口,但是这个接口不需要配置,可以直接使用。

    import javax.servlet.http.* ;
    public class LoginUser implements HttpSessionBindingListener {
        private String name ;
        public LoginUser(String name){
            this.setName(name) ;
        }
        public void valueBound(HttpSessionBindingEvent event){
            System.out.println("** 在session中保存LoginUser对象(name = " + this.getName() + "),session id = " + event.getSession().getId()) ;
        }
        public void valueUnbound(HttpSessionBindingEvent event){
            System.out.println("** 从session中移出LoginUser对象(name = " + this.getName() + "),session id = " + event.getSession().getId()) ;
        }
        public String getName(){
            return this.name ;
        }
        public void setName(String name){
            this.name = name ;
        }
    }

    此时不需要配置web.xml,但是jsp中就比较麻烦。

    <%
        LoginUser user = new LoginUser("MLDN") ;
        session.setAttribute("info",user) ;    // 直接保存LoginUser对象
    %>

    对request监听

    import javax.servlet.* ;
    public class ServletRequestListenerDemo implements ServletRequestListener {
        public void requestInitialized(ServletRequestEvent sre){
            System.out.println("** request初始化。http://" + 
                sre.getServletRequest().getRemoteAddr() + 
                sre.getServletContext().getContextPath()) ;
        }
        public void requestDestroyed(ServletRequestEvent sre){
            System.out.println("** request销毁。http://" + 
                sre.getServletRequest().getRemoteAddr() + 
                sre.getServletContext().getContextPath()) ;
        }
    }

    在web.xml中进行配置

    <listener>
            <listener-class>
                org.lxh.listenerdemo.ServletRequestListenerDemo
            </listen

    对request中属性操作

    import javax.servlet.* ;
    public class ServletRequestAttributeListenerDemo implements ServletRequestAttributeListener {
        public void attributeAdded(ServletRequestAttributeEvent srae){
            System.out.println("** 增加request属性 --> 属性名称:" + srae.getName() + ",属性内容:" + srae.getValue()) ;
        }
        public void attributeRemoved(ServletRequestAttributeEvent srae){
            System.out.println("** 删除request属性 --> 属性名称:" + srae.getName() + ",属性内容:" + srae.getValue()) ;
        }
        public void attributeReplaced(ServletRequestAttributeEvent srae){
            System.out.println("** 替换request属性 --> 属性名称:" + srae.getName() + ",属性内容:" + srae.getValue()) ;
        }
    }

    从实际来说,对request监听用的不多,用的最多的是对servletContext 和httpSession的监听。

    监听实例

    import java.util.* ;
    import javax.servlet.* ;
    import javax.servlet.http.* ;
    public class OnlineUserList implements ServletContextListener,HttpSessionAttributeListener,HttpSessionListener {
        private ServletContext app = null ;
        public void contextInitialized(ServletContextEvent sce){
            this.app = sce.getServletContext() ;
            this.app.setAttribute("online",new TreeSet()) ;    // 准备集合
        }
        public void contextDestroyed(ServletContextEvent sce){
        }
        public void attributeAdded(HttpSessionBindingEvent se){
            Set all = (Set) this.app.getAttribute("online") ;
            all.add(se.getValue()) ;
            this.app.setAttribute("online",all) ;
        }
        public void attributeRemoved(HttpSessionBindingEvent se){
            Set all = (Set) this.app.getAttribute("online") ;
            all.remove(se.getSession().getAttribute("userid")) ;
            this.app.setAttribute("online",all) ;
        }
        public void attributeReplaced(HttpSessionBindingEvent se){}
        public void sessionCreated(HttpSessionEvent se){}
        public void sessionDestroyed(HttpSessionEvent se){
            Set all = (Set) this.app.getAttribute("online") ;
            all.remove(se.getSession().getAttribute("userid")) ;
            this.app.setAttribute("online",all) ;
        }
        
    }
    <form action="login.jsp" method="post">
        用户ID:<input type="text" name="userid">
        <input type="submit" value="登陆">
    </form>
    <%
        String userid = request.getParameter("userid") ;
        if(!(userid==null || "".equals(userid))){
            session.setAttribute("userid",userid) ;
            response.sendRedirect("list.jsp") ;
        }
    %>



    <%
        Set all = (Set) this.getServletContext().getAttribute("online") ;
        Iterator iter = all.iterator() ;
        while(iter.hasNext()){
    %>
            <h3><%=iter.next()%></h3>
    <%
        }
    %>
  • 相关阅读:
    面向对象的设计原则
    在VC中Debug下是运行结果正确的,但是在Release下却有错,总算找到原因
    聚合和组合
    痛苦呀,代码
    MSDN和VS98
    阅读代码的难度
    好香,方便面
    人的重要性
    FIT For .NET(1)
    ASP.NET Microsoft .NET Pet Shop 3.x(二)
  • 原文地址:https://www.cnblogs.com/snowwang/p/6014179.html
Copyright © 2011-2022 走看看