JAVA WEB从入门到精通 day19 Listener监听器

JAVA监听器

    监听器是一个接口,具体方法由我们实现。属于javaweb三大组件。

JAVAWEB监听器

三大域中,每个域都有两个监听器。
分别是生命周期监听器和属性监听器
**ServletContext域
            -生命周期监听期:ServletContextListener,它有两个方法。
                    *void contextInitialized(ServletContextEvent sce ):出生时调用
                    *void contextDestroyed(ServletContextEvent sce):销毁时调用 
                    事件对象:ServletContextEvent
                        主要方法:
                        ServletContext getServletContext()  


            -属性监听器:ServletContextAttributeListener:它有三个方法,一个在添加属性时调用,一个在替换属性时调用,还有一个在移除属性时调用。
                    * void attributeAdded(ServletContextAttributeEvent event) :添加属性时调用
                    * void attributeRemoved(ServletContextAttributeEvent event) :移除属性时调用
                    * void attributeReplaced(ServletContextAttributeEvent event) :替换属性时调用 

                    事件对象:ServletContextAttributeEvent
                        主要方法:
                        String getName();获取属性名称
                        Object getValue():获取属性值
                        ServletContext getServletContext() ; 

**HttpSession域
                -生命周期监听器:HttpSessionListener,它有两个方法。
                    *void sessionCreated(HttpSessionEvent se) :创建session时调用
                    *void sessionDestroyed(HttpSessionEvent se) :销毁session时调用
                        事件对象:HttpSessionEvent
                        主要方法:
                             HttpSession getSession() ; 

                -属性监听器:HttpSessionAttributeListener:它有三个方法,一个在添加属性时调用,一个在替换属性时调用,还有一个在移除属性时调用。
                    * void attributeAdded(HttpSessionBindingEvent event):添加属性时调用
                    * void attributeRemoved(HttpSessionBindingEvent event)  :移除属性时调用
                    * void attributeReplaced(HttpSessionBindingEvent event):替换属性时调用
                        事件对象:HttpSessionBindingEvent
                        主要方法:
                            String getName() ;获取属性名称
                            Object getValue() ;获取属性值
                            HttpSession getSession() ;获取session对象  


**ServletRequest域
                -生命周期监听器:ServletRequestListener,它有两个方法。
                    *void requestInitialized(ServletRequestEvent sre ):创建request时调用
                    *void requestDestroyed(ServletRequestEvent sre) :销毁request时调用 
                    事件对象:ServletRequestEvent
                        主要方法:
                        ServletContext getServletContext ();
                        ServletRequest getServletRequest()  ; 


                -属性监听器:ServletRequestAttributeListener:它有三个方法,一个在添加属性时调用,一个在替换属性时调用,还有一个在移除属性时调用。
                    *void attributeAdded(ServletRequestAttributeEvent srae) :添加属性时调用
                    *void attributeRemoved(ServletRequestAttributeEvent srae ):移除属性时调用
                    *void attributeReplaced(ServletRequestAttributeEvent srae) :替换属性时调用
                    事件对象:ServletRequestAttributeEvent 
                    主要方法:
                    String getName();  获取属性名称
                    Object getValue() ;获取属性值
                    ServletContext getServletContext ();
                    ServletRequest getServletRequest()  ;



案例:javaweb使用生命周期监听器

    1.创建一个类实现Servletontext域生命周期监听器接口,方法内容由自己实现。
            public class AListener implements ServletContextListener {

                @Override
                public void contextDestroyed(ServletContextEvent arg0) {
                    System.out.println("死亡");

                }

                @Override
                public void contextInitialized(ServletContextEvent arg0) {
                    System.out.println("出生");

                }

            }
    2.在web.xml中注册监听器
          <listener>
            <listener-class>cn.cad.web.listener.AListener</listener-class>
          </listener>
   3.ServletContext对象在服务器开启时就创建,服务器关闭销毁。所以我们开启服务器和关闭服务器时就会看到效果。
   出生
   死亡

案例:javaweb使用属性监听器

1.编写一个类实现ServletContext域的属性监听器
public class BListener implements ServletContextAttributeListener {
            //添加属性时被调用
            public void attributeAdded(ServletContextAttributeEvent arg0)  { 
                 System.out.println("你添加了"+arg0.getName()+"属性,值为"+arg0.getValue());
            } 

            //移除属性时被调用
            public void attributeRemoved(ServletContextAttributeEvent arg0)  { 
                 System.out.println("你删除"+arg0.getName()+"属性,值为"+arg0.getValue());
            } 

            //替换属性时被调用
            public void attributeReplaced(ServletContextAttributeEvent arg0)  { 
 //替换属性时的getValue方法获取的是替换之前的值,获得更改后的值可以通过getServletContext.getAttribute()获取 

                 System.out.println("你更改了"+arg0.getName()+"属性,原值为"+arg0.getValue()+",更改后的值"+arg0.getServletContext().getAttribute("name"));
             }
        }
2.在web.xml注册监听器
3.我们在jsp页面中添加,替换,删除属性,即可看到效果
        <body>
            <%
                application.setAttribute("name", "zhangsan");
            %>
            <%
                application.setAttribute("name", "lisi");
            %>
            <%
                application.removeAttribute("name");
            %> 
        </body>

感知监听器

        有两个感知监听器。
        特性
        -与session相关
        -用来添加到javaBean上
        -不需要在web.xml中注册

HttpSessionBindingListener监听器

用来添加到javaBean上。比如我们有一个User类,实现这个接口,这样当我们user对象放入session中时,user对象就能知道自己被放入session,移除时对象自己也能知道被session移除。
    1.我们创建一个javaBean实现这个接口,并实现他的两个方法
        public class User implements HttpSessionBindingListener{
                private String name;
                private int age;
                public String getName() {
                    return name;
                }
                public void setName(String name) {
                    this.name = name;
                }
                public int getAge() {
                    return age;
                }
                public void setAge(int age) {
                    this.age = age;
                }
                @Override
                public String toString() {
                    return "User [name=" + name + ", age=" + age + "]";
                }
                @Override
                public void valueBound(HttpSessionBindingEvent arg0) {     //与session绑定时调用
                    System.out.println("被放入session");

                }
                @Override
                public void valueUnbound(HttpSessionBindingEvent arg0) { //从session移除时被调用
                    // TODO Auto-generated method stub
                    System.out.println("从session移除");

                }

            }
    2.我们在jsp测试我们的监听器
        <body>
            <%
                //创建javaBean对象,并将其放入session域
                cn.cad.web.listener.User user=new cn.cad.web.listener.User();
                session.setAttribute("user", user);
            %>
            <%
                //将javaBean对象从session域中移除
                session.removeAttribute("user");
            %>
        </body>
    3.输出结果
        被放入session
        从session移除

HttpSessionActivationListener监听器

    HttpSessionActivationListener也是感知监听器,添加在javabean上。
    可以让javaBean对象知道自己是否跟随session被序列化或者钝化到了硬盘上。但是javaBean对象必须实现该监听器接口和序列化接口,要不然保存不到硬盘上。

Session的序列化和反序列化

应用场景: 

        一般来说,网站服务器启动后,就不会再关闭了,但是如果服务器出现问题需要重启,而用户session还在进行相应的操作,例如购物车里添加了很多东西,必须保存session这时就需要使用序列化将session信息保存起来放在硬盘,服务器重启后,又重新加载。这样就保证了用户信息不会丢失,实现永久化保存

        序列化就是将信息永久保存,例如保存到硬盘上等。

        我们发现我们向session里面设置一个属性,关闭服务器,项目目录会多出一个session.ser的文件,这就是将session序列化了。
        这时当我们重新开启服务器,依然可以获取session值。

        怎么关闭序列化?
        在tomcat的conf目录下的context.xml中添加一句
        <Manager pathname="" /> 即可。  

session的钝化和活化

应用场景:
    当很多用户访问网站时,服务器会产生大量session,内存可能会承受不了,这时候我们将长时间不活动的session先保存在客户的硬盘上,这叫做钝化。
        当用户使用session时,再从硬盘中读取session,这叫做活化。
        具体的配置可以参考百度。

你可能感兴趣的:(java,Web)