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> ServletContext
ServletContextListener:两个方法(分别是在创建当前域对象和当前域对象死亡时调用)
contextDestroyed(ServletContextEvent sce) ServletContext对象销毁前调用该方法
contextInitialized(ServletContextEvent sce) ServletContext对象创建后调用该方法
ServletContextAttributeListener:三个方法(分别在添加属性,替换属性,移除属性时调用)
attributeAdded(ServletContextAttributeEvent event) 添加属性时调用
attributeRemoved(ServletContextAttributeEvent event) 移除属性时调用
attributeReplaced(ServletContextAttributeEvent event) 替换属性时调用
</dd> <dd> HttpSession
HttpSessionListener:两个方法(分别是在创建当前域对象和当前域对象死亡时调用)
sessionCreated(HttpSessionEvent se) HttpSession对象创建后调用
sessionDestroyed(HttpSessionEvent se) HttpSession对象销毁前调用
HttpSessionAttributeListener:三个方法(分别在添加属性,替换属性,移除属性时调用)
attributeAdded(HttpSessionBindingEvent event) 添加属性时调用
attributeRemoved(HttpSessionBindingEvent event) 替换属性时调用
attributeReplaced(HttpSessionBindingEvent event) 移除属性时调用
</dd> <dd> ServletRequest
ServletRequestListener:两个方法(分别是在创建当前域对象和当前域对象死亡时调用)
requestInitialized(ServletRequestEvent sre) ServletRequest对象创建后调用
requestDestroyed(ServletRequestEvent sre) ServletRequest对象销毁前调用
ServletRequestAttributeListener:三个方法(分别在添加属性,替换属性,移除属性时调用)
attributeAdded(ServletRequestAttributeEvent srae) 添加属性时调用
attributeRemoved(ServletRequestAttributeEvent srae) 移除属性时调用
attributeReplaced(ServletRequestAttributeEvent srae) 替换属性时调用
</dd> <dt> 生命周期方法中的事件(Event)方法 </dt> <dd> ServletContextEvent </dd> <dd> HttpSessionEvent </dd> <dd> ServletRequestEvent </dd> </dl>
事件 方法
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> </dt> <dt> HttpSessionActivitionListener </dt> <dd> JavaBean中实现HttpSessionActivitionListener接口 </dd> <dd> 重写以下方法 </dd> </dl>
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("即将被钝化");
    }
}