JavaWeb组件
<dl> <dt> 三大组件 </dt> <dd> Servlet </dd> <dd> Listener </dd> <dd> Filter </dd> </dl>JavaWeb***
<dl> <dt> 三大域 </dt> <dd> ServletContext </dd> <dd> HttpSession </dd> <dd> ServletRequest </dd> <dt> *** </dt> <dd> 生命周期监听 (两个方法) </dd> <dd> 属性监听 (三个方法) </dd> <dt> 具体***接口 </dt> <dd> ServletContextServletContextListener:两个方法(分别是在创建当前域对象和当前域对象死亡时调用)</dd> <dd> HttpSessioncontextDestroyed(ServletContextEvent sce) ServletContext对象销毁前调用该方法ServletContextAttributeListener:三个方法(分别在添加属性,替换属性,移除属性时调用)
contextInitialized(ServletContextEvent sce) ServletContext对象创建后调用该方法attributeAdded(ServletContextAttributeEvent event) 添加属性时调用
attributeRemoved(ServletContextAttributeEvent event) 移除属性时调用
attributeReplaced(ServletContextAttributeEvent event) 替换属性时调用
HttpSessionListener:两个方法(分别是在创建当前域对象和当前域对象死亡时调用)</dd> <dd> ServletRequestsessionCreated(HttpSessionEvent se) HttpSession对象创建后调用HttpSessionAttributeListener:三个方法(分别在添加属性,替换属性,移除属性时调用)
sessionDestroyed(HttpSessionEvent se) HttpSession对象销毁前调用attributeAdded(HttpSessionBindingEvent event) 添加属性时调用
attributeRemoved(HttpSessionBindingEvent event) 替换属性时调用
attributeReplaced(HttpSessionBindingEvent event) 移除属性时调用
ServletRequestListener:两个方法(分别是在创建当前域对象和当前域对象死亡时调用)</dd> <dt> 生命周期方法中的事件(Event)方法 </dt> <dd> ServletContextEvent </dd> <dd> HttpSessionEvent </dd> <dd> ServletRequestEvent </dd> </dl>requestInitialized(ServletRequestEvent sre) ServletRequest对象创建后调用ServletRequestAttributeListener:三个方法(分别在添加属性,替换属性,移除属性时调用)
requestDestroyed(ServletRequestEvent sre) ServletRequest对象销毁前调用attributeAdded(ServletRequestAttributeEvent srae) 添加属性时调用
attributeRemoved(ServletRequestAttributeEvent srae) 移除属性时调用
attributeReplaced(ServletRequestAttributeEvent srae) 替换属性时调用
事件 | 方法 |
---|---|
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中,而不是添加到三大域中
不需要在配置文件中注册
<dl> <dt> HttpSessionBindingListener </dt> <dd> 在JavaBean中实现HttpSessionBindingListener接口 </dd> <dd> 重写以下两个方法 </dd> </dl>@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>
<dl> <dt> 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("即将被钝化");
}
}