JavaWeb监听器

Posted xjs1874704478

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaWeb监听器相关的知识,希望对你有一定的参考价值。

三大组件:

  Servlet

  Listener

  Filter

Listener:监听器

  * 它是一个接口,内容由我们来实现;

  * 它需要注册,例如注册在按钮上!

  * 监听器中的方法,会在特殊事件发生时被调用!

观察者:

  * 事件源

    >小偷

  * 事件

    >偷东西

  * 监听器

    >警察

    >监听器中的方法:抓捕


 

JavaWeb中的监听器

  * 事件源:三大域!

    >ServletContext

      <生命周期监听:ServletContextListener,它有两个方法,一个在出生时调用,一个在死亡时调用;

        <>void contextInitialized(ServletContextEvent sce):创建ServletContext时

        <>void contextDestroyed(ServletContextEvent sce):销毁ServletContext时

      <属性监听:ServletContextAttributeListener,它有三个方法,一个在添加属性时调用,一个在替换属性时调用,最后一个是在移除属性时调用;

        <> void  attributeAdded(ServletContextAttributeEvent event):添加属性时

        <> void  attributeReplaced(ServletContextAttributeEvent event):替换属性时

        <> void  attributeRemoved(ServletContextAttributeEvent event):移除属性时

    >HttpSession

      <生命周期监听:HttpSessionListener,它有两个方法,一个在出生时调用,一个在死亡时调用;    

        <>void sessionCreated(HttpSessionEvent se):创建session时

        <>void sessionDestroyed(HttpSessionEvent se):销毁session时

      <属性监听:HttpSessionAttributeListener,它有三个方法,一个在添加属性时调用,一个在替换属性时调用,最后一个是在移除属性时调用;

        <> void attributeAdded(HttpSessionBindingEvent event):添加属性时

         <> void attributeReplaced(HttpSessionBindingEvent event):替换属性时

        <> void attributeRemoved(HttpSessionBindingEvent event):移除属性时

    >ServletRequest

      <生命周期监听:ServletRequestListener,它有两个方法,一个在出生时调用,一个在死亡时调用;

        <>void requestInitialized(ServletRequestEvent sre):创建request时

        <>void requesDestroyed(ServletRequestEvent sre):销毁request时

      <属性监听:ServletRequestAttributeListener,它有三个方法,一个在添加属性时调用,一个在替换属性时调用,最后一个是在移除属性时调用;

        <> void attributeAdded(ServletRequestAttributeEvent srae):添加属性时

        <> void attributeReplaced(ServletRequestAttributeEvent srae):替换属性时

        <> void attributeRemoved(ServletRequestAttributeEvent srae):移除属性时

JavaWeb中完成编写监听器:

  * 写一个监听器类:要求必须实现某个监听器接口;

package com.xjs.web.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

/**
 * ServletContext生死监听
 * @author hp
 *
 *可以在这个监听器存放一些在Tomcat启动时就要完成的代码!
 */
public class AListener implements ServletContextListener 

    @Override
    public void contextDestroyed(ServletContextEvent arg0) 
        System.out.println("哇,我要挂也!");
    

    @Override
    public void contextInitialized(ServletContextEvent arg0) 
        System.out.println("哇,我来也!");
    

  * 注册,是在web.xml中配置来完成注册!

  <listener>
      <listener-class>com.xjs.web.listener.AListener</listener-class>
  </listener>

事件对象:

  * ServletContextEvent:其方法ServletContext  getServletContext()

  *  HttpSessionEvent:其方法HttpSession  getSession()

  *  ServletRequestEvent:两个方法1.ServletRequest  getServletRequest()  2.ServletContext  getServletContext()

技术图片

 

 监听器之属性监听器示例:

写一个BListener实现ServletContextAttributeListener接口:

package com.xjs.web.listener;

import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.annotation.WebListener;

public class BListener implements ServletContextAttributeListener 

    public void attributeAdded(ServletContextAttributeEvent scab) 
        System.out.println("您向application中添加了一个名为"+scab.getName()+",值为:"+scab.getValue()+"的属性" );
    

    public void attributeReplaced(ServletContextAttributeEvent scab) 
        //返回的是旧值
        System.out.println(scab.getName()+"="+scab.getValue());
        //返回的新值
        System.out.println(scab.getServletContext().getAttribute("金泰妍"));
    

    public void attributeRemoved(ServletContextAttributeEvent scab) 
        //最后一次相见
        System.out.println(scab.getName()+"="+scab.getValue());
    

 

 index.jsp:向application域中保存----可以在BListener这个属性监听器中获取其键值。

    <%
        application.setAttribute("金泰妍", "taeyeon");
     %>

 

 replace.jsp:替换原有属性

    <%
        application.setAttribute("金泰妍", "抽抽");
     %>

 

remove.jsp:移除原有属性

    <%
        application.removeAttribute("金泰妍");
     %>

 感知监听(都与HttpSession相关)

  * 它是用来添加到Javabean上,而不是添加到三大域上! 

  HttpSessionBindingListener:添加到JavaBean上,JavaBean就知道自己是否添加到session中了。

  

session的序列化(关闭服务器后,再次开启,还有获取到session中的值)

如果在程序中向session中保存了东西,在stop了Tomcat后,会在Tomcat的目录下的work目录下对应的项目中会生成一个SESSIONS.ser文件(是保存的session)。当再次run服务器时,会加载此文件,然后该项目下的SESSIONS.ser文件消失。-------这样就会产生了session的死而复生。

    比如:某些用户在某网站上正在浏览信息,突然该网站的服务器关闭,重启。用户短暂掉线,服务器端会把用户的信息保存到session中,然后保存在该项目下的文件中,服务器正常工作后,加载这些文件,不至于登录的用户信息丢失。

注:在Tomcat的目录下的conf目录的context.xml文件中

加上这句话可以废掉session序列化

    <!--
    废掉session序列化的
    <Manager pathname="" />
    -->

 

 session的钝化和活化

   钝化session:Tomcat会把长时间不被使用的session,钝化session对象。就是把session通过序列化的方式保存到硬盘文件中。

  活化session:当用户在使用session时,Tomcat会把钝化的对象在活化session。就是把硬盘文件中的session在反序列化回内存。

 当session被Tomcat钝化时,session中存储的对象也被钝化,当session被活化时,也会把session中存储的对象活化。

     比如:在网上,用户过于太多,导致session个数猛增,客户没有下线,session增多,从而导致内存压力,服务器会把长时间没人访问的session放在硬盘上,当你在访问该session时,在从硬盘上读取到内存中,然后使用。

配置:

1. 把这个写到Tomcat的web.xml中,所有的项目都生效。2.把它写到具体的项目中,只对该项目生效。

<!-- PersistentManager:持久的管理
maxIdleSwap:最大的空闲时间(分钟)
-->

<Context>    

  <Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
     <Store className="org.apache.catalina.session.FileStore" directory="mysession"/>
  </Manager>

</Context>

 已钝化的session

技术图片

访问该session时,该session活化,加载到内存,该文件也不会消失,它会一直保存在硬盘上。

 

 HttpSessionActivationListener(监听器)和Serializable接口

已经设置了session的最大不活动时间为1分钟。

创建User类实现这两个接口:

package com.xjs;

import java.io.Serializable;

import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;

public class User implements HttpSessionActivationListener,Serializable
    /**
     * 钝化时调用
     */
    @Override
    public void sessionWillPassivate(HttpSessionEvent arg0) 
        System.out.println("我同session钝化了,从内存到硬盘");
    
    
    /**
     * 活化时调用
     */
    @Override
    public void sessionDidActivate(HttpSessionEvent arg0) 
        System.out.println("我同session活化了,从硬盘到内存");
    

 

 a.jsp:向session中保存一个User对象

  <body>
    <%
        session.setAttribute("xxx", new User());
     %>
  </body>

 

b.jsp:从session中取出User对象

  <body>
    <%
        out.print(session.getAttribute("xxx"));
     %>
  </body>

 

 先访问a.jsp后,向session保存User;等一分钟,User对象同session一同钝化。再访问b.jsp,可以得到User对象。

技术图片

 


 

网页的国际化

技术图片

 

以上是关于JavaWeb监听器的主要内容,如果未能解决你的问题,请参考以下文章

过滤器与监听器 ----javaweb-10

动态SQL基础概念复习(Javaweb作业5)

05-JavaWeb的三大组件:小程序Servlet+过滤器Filter+监听器Listener

listview OnItemClick 侦听器在片段中不起作用

如何使用事件侦听器来加载动画片段的循环

JavaWeb监听器