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