版权声明:转载请联系作者本人!!! https://blog.csdn.net/weixin_42061805/article/details/82466132
JavaWeb组件
- 三大组件
- Servlet
- Listener
- Filter
JavaWeb监听器
- 三大域
- ServletContext
- HttpSession
- ServletRequest
- 监听器
- 生命周期监听 (两个方法)
- 属性监听 (三个方法)
- 具体监听器接口
-
ServletContext
ServletContextListener:两个方法(分别是在创建当前域对象和当前域对象死亡时调用)
contextDestroyed(ServletContextEvent sce) ServletContext对象销毁前调用该方法
ServletContextAttributeListener:三个方法(分别在添加属性,替换属性,移除属性时调用)
contextInitialized(ServletContextEvent sce) ServletContext对象创建后调用该方法attributeAdded(ServletContextAttributeEvent event) 添加属性时调用
attributeRemoved(ServletContextAttributeEvent event) 移除属性时调用
attributeReplaced(ServletContextAttributeEvent event) 替换属性时调用 -
HttpSession
HttpSessionListener:两个方法(分别是在创建当前域对象和当前域对象死亡时调用)
sessionCreated(HttpSessionEvent se) HttpSession对象创建后调用
HttpSessionAttributeListener:三个方法(分别在添加属性,替换属性,移除属性时调用)
sessionDestroyed(HttpSessionEvent se) HttpSession对象销毁前调用attributeAdded(HttpSessionBindingEvent event) 添加属性时调用
attributeRemoved(HttpSessionBindingEvent event) 替换属性时调用
attributeReplaced(HttpSessionBindingEvent event) 移除属性时调用 -
ServletRequest
ServletRequestListener:两个方法(分别是在创建当前域对象和当前域对象死亡时调用)
requestInitialized(ServletRequestEvent sre) ServletRequest对象创建后调用
ServletRequestAttributeListener:三个方法(分别在添加属性,替换属性,移除属性时调用)
requestDestroyed(ServletRequestEvent sre) ServletRequest对象销毁前调用attributeAdded(ServletRequestAttributeEvent srae) 添加属性时调用
attributeRemoved(ServletRequestAttributeEvent srae) 移除属性时调用
attributeReplaced(ServletRequestAttributeEvent srae) 替换属性时调用 - 生命周期方法中的事件(Event)方法
- ServletContextEvent
- HttpSessionEvent
- ServletRequestEvent
事件 | 方法 |
---|---|
ServletContextEvent | ServletContext getServletContext()获取当前ServletContext域对象 |
HttpSessionEvent | HttpSession getSession()获取当前HttpSession域对象 |
ServletRequestEvent | ServletContext getServletContext()获取当前ServletContext对象;ServletRequest getServletRequest();获取当前ServletRequest对象 |
如何新建监听器
定义一个监听器类,实现具体的监听器接口(此处实现生命周期方法)
package tqb.listener.web.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/**
*
* 可以在这里设置一些Tomcat(服务器)开启时需要初始化等的一些内容
* 此处代码仅显示ServletContextListener的实现
* 其余自行练习
* @author tqb
*
*/
public class AListener implements ServletContextListener {
@Override
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("ServletContext对象销毁");
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("ServletContext对象创建");
}
}
定义一个监听器类,实现具体的监听器接口(此处实现属性方法)
package tqb.listener.web.listener;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.annotation.WebListener;
/**
*
* 此处代码仅显示ServletContextAttributeListener的实现
* 其余自行练习
* @author tqb
*
*/
@WebListener
public class BListener implements ServletContextAttributeListener {
/**
* 提前在application中设置属性 application.setAttribute("nameDemo","valueDemo");
*/
public void attributeAdded(ServletContextAttributeEvent event) {
// 显示设置的键和值
System.out.println(event.getName() + "+" + event.getValue());
}
/**
* application.replaceAttribute("nameDemo","valueReplaceDemo");
*/
public void attributeRemoved(ServletContextAttributeEvent event) {
// 显示改之前的键和值以及修改过的值
System.out.println(event.getName() + "+" + event.getValue() + "+"
+ event.getServletContext().getAttribute(event.getName()));
}
/**
* application.removeAttribute("nameDemo");
*/
public void attributeReplaced(ServletContextAttributeEvent event) {
// 显示移除前的键和值
System.out.println(event.getName() + "+" + event.getValue());
}
}
在web.xml中配置完成注册
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>listener</display-name>
<!-- 这里对监听器进行注册 -->
<listener>
<listener-class>tqb.listener.web.listener.AListener</listener-class>
</listener>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
感知监听器
与HttpSession相关
添加到JavaBean中,而不是添加到三大域中
不需要在配置文件中注册
- HttpSessionBindingListener
- 在JavaBean中实现HttpSessionBindingListener接口
- 重写以下两个方法
@Override
public void valueBound(HttpSessionBindingEvent arg0) {
System.out.println("session中添加了我");
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("session移除了我");
}
session的序列化
在设置session并使用后,若服务器突然关闭(或出现故障),那么原本的session则会保留下来,在服务器重新启动时可以继续使用而不会死亡。注:在服务器突然关闭之后,会在服务器端的项目路径下保存当前正在操作的session文件,我们称之为session的序列化,如下图。
session的反序列化
在Tomcat的配置文件cof下的context.xml文件中添加如下内容。注:添加如下内容后,就不会出现上图的序列化文件,服务器重启后也无法使用之前的session
<!-- session的反序列化 -->
<Manager pathname="" />
session的钝化与活化
在服务器上的session若长时间无人使用时,服务器会采用一种session钝化的策略,就是先将这些长时间未使用的session保存到硬盘中去,当用户再次使用该session时,服务器会再次从硬盘中取出供用户使用,这个过程又叫做活化。注:一个session一个文件,名称为sessionID,拿出来使用时硬盘上保存的session文件不会删除。
首先需要在如下目录新建一个配置文件(文件名为当前项目名称)
文件内容为:
<?xml version='1.0' encoding='utf-8'?>
<Context>
<Manager className="org.apache.catalina.session.PersistentManager"
maxIdleSwap="1"><!-- 此处的1代表1分钟不使用的话钝化 -->
<Store className="org.apache.catalina.session.FileStore"
directory="mysession"/><!-- 在如下图片的路径下新建一个musession文件夹(存放钝化的文件) -->
</Manager>
</Context>
- HttpSessionActivitionListener
- JavaBean中实现HttpSessionActivitionListener接口
- 重写以下方法
package tqb.listener.web.listener;
import java.io.Serializable;
import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;
/**
* 要想让此JavaBean随session一起钝化活化,必须实现序列化接口Serializable
* @author tqb
*
*/
public class User implements HttpSessionActivationListener, Serializable {
@Override
public void sessionDidActivate(HttpSessionEvent arg0) {
System.out.println("即将被活化");
}
@Override
public void sessionWillPassivate(HttpSessionEvent se) {
System.out.println("即将被钝化");
}
}