JavaWeb监听器

Java三大组件

  • Servlet
  • Listener(监听器)
  • Filter

什么是监听器

三个特点

  • 监听器是一个接口,内容由我们来实现
  • 需要注册,例如注册到按钮上
  • 监听器中的方法,会在特殊的事件发生时被调用

观察者模式

  • 事件源:小偷
  • 事件:偷东西
  • 监听器:警察;方法:抓捕

 

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时

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

  • void attributeAdded(HttpSessionBindingEvent event):添加属性时;
  • void attributeReplaced(HttpSessionBindingEvent event):替换属性时
  •  void attributeRemoved(HttpSessionBindingEvent event):移除属性时

ServletRequest

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

  • void requestInitialized(ServletRequestEvent sre):创建request时
  •  void requestDestroyed(ServletRequestEvent sre):销毁request时

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

  • void attributeAdded(ServletRequestAttributeEvent srae):添加属性时
  • void attributeReplaced(ServletRequestAttributeEvent srae):替换属性时
  • void attributeRemoved(ServletRequestAttributeEvent srae):移除属性时

 

代码实例

建立一个AListener.java

public class AListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("哈,我被创建了!");
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("呜,我被杀了!");

    }
}

在web.xml中注册

<listener>
        <listener-class>cn.edu.stu.AListener</listener-class>
</listener>

启动tomcat服务器,就会运行 AListener的contextInitialized()方法,关闭运行contextDestroyed()方法

 

添加BListener.java

@WebListener()
public class BListener implements ServletContextAttributeListener{


    @Override
    public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
        //添加属性
        System.out.println("添加了属性"+servletContextAttributeEvent.getName());
    }

    @Override
    public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
        //移除属性
        System.out.println("移除了属性"+servletContextAttributeEvent.getName());
    }

    @Override
    public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
        //修改属性
        System.out.println("修改了属性"+servletContextAttributeEvent.getName()
        +" 原址:"+servletContextAttributeEvent.getValue()
        +" 新值:"+servletContextAttributeEvent.getServletContext().getAttribute(servletContextAttributeEvent.getName()));
    }
}

 BListener监听器使用idea自动生成,可以不用在web.xml中注册

addAttr.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    //向servletContext域中添加属性
    application.setAttribute("xxx","XXX");
%>
</body>
</html>

replaceAttr.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

<%
    //替换servletcontext域中的属性
    application.setAttribute("xxx","YYY");
%>
</body>
</html>

removeAttr.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

<%
    //移除servletContext域中的属性
    application.removeAttribute("xxx");
%>

</body>
</html>

 访问对应页面,就可以启动对应的监听方法。

 

HttpSession相关监听(感知监听器)

HttpSessionBindingListener

添加到javabean上,javabean就知道自己是否添加到session中了。不需要在web.xml中注册。

代码实例:

创建User.java

public class User implements HttpSessionBindingListener {

    private String username;
    private String password;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {
        //session中添加该类实例
        System.out.println("哈,session添加了我!");
    }

    @Override
    public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {
        //session中移除该类实例
        System.out.println("呜,session移除了我!");
    }
}

addUser.jap

<%@ page import="cn.edu.stu.User" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>


<%
    //创建user实例,添加到session域中
    User user=new User();
    session.setAttribute("user",user);
%>
</body>
</html>

removeUser.jsp

<%@ page import="cn.edu.stu.User" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

<%
    //移除user对象
    session.removeAttribute("user");
%>

</body>
</html>

运行tomcat后,访问连个jsp页面,就可以启动对应的添加和移除监听方法

 

session复活

当一个服务关闭后,session的内容回保存到对应项目的

work\Catalina\localhost\项目名 下

当服务器重新启动,复活session,可以得到其中的内容。

 

session的钝化与活化

所谓钝化session,就是把session通过序列化的方式保存到硬盘文件中。当用户再使用session时,Tomcat还会把钝化的对象再活化session,所谓活化就是把硬盘文件中的session在反序列化回内存。当session被Tomcat钝化时,session中存储的对象也被纯化,当session被活化时,也会把session中存储的对象活化。

对于回话量很大的应用(例如淘宝)会产生大量的session,为了提高服务器性能,采用session钝化与活化技术,可以让哪些长时间没有通信的session暂时保存到硬盘,用户再使用时再活化。

在tomcat安装目录下的conf下的Context.xml中配置

<Context>
	    <!--maxIdleSwap:设置空闲时间,单位是分钟
            directory:钝化文件存放目录,在tomcat项目下的项目名目录下-->
        <Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
           <Store className="org.apache.catalina.session.FileStore" directory="mysession"/>
        </Manager>
</Context>

启动项目后,一分钟就会在tomcat下的项目名下的mysession目录下生成sessionId.session文件

钝化活化监听接口:HttpSessionActivationListener:添加到javaBean中,不需要在web.xml中注册

这里需要注意,如果希望session钝化后把添加的属性值保存需要保证添加的属性对象实现序列化接口:Serializable

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值