Servlet 中的监听器:
1.监听ServletContext,HttpSession,ServletRequest状态
2事件源和监听绑定的方式:配置
3提供了8种监听器:监听3个域对象的创建和销毁(3种),监听3个域对象的属性变更的监听器(3种), 监听HttpSession中JavaBean的状态的变化(绑定,解绑,钝化,活化 2种)
钝化:session序列化到磁盘
活化:session从磁盘序列化到内存
1 ServletContextListener(接口):监听ServletContext对象的创建和销毁.
关于ServletContext创建:服务器启动的时候,为每个Web应用创建一个单独的ServletContext
销毁:服务器关闭的时候,或者项目移除的时候
案例:
public class MyServletContextListener implements ServletContextListener{
@Override
/**
* 监听ServletContext对象的创建的方法:
*/
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext对象被创建了...");
}
@Override
/**
* 监听ServletContext对象的销毁的方法:
*/
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext对象被销毁了...");
}
}
通过配置:将事件源和监听器绑定(在web.xml中)<!-- 配置监听器-->
<listener>
<listener-class>MyServletContextListener的全限定名</listener-class>
</listener>
HttpSessionListener(和上面的步骤一致):监听HttpSession对象的创建和销毁的监听器.
关于HttpSession创建:服务器第一次调用getSession()方法的时候
销毁:非正常关闭服务器(正常关闭序列化到磁盘)
session过期(默认30分钟)
session.invalidate()//手动过期
注意:
1.访问html是否创建session对象?:不会
2.访问一个Servlet是否创建session对象?:不会
3.访问一个jsp是否创建session对象?:会,jsp的内置对象
ServletRequestListener:监听ServletRequest对象的创建和销毁的监听器(步骤同上)
每次请求服务器都会创建request对象和做出响应后respond后都会销毁2.ServletContextAttributeListener:监听ServletContext对象中的属性变更的监听器
HttpSessionAttributeListener:监听HttpSession对象中的属性变更的监听器
ServletRequestAttributeListener:监听ServletRequest对象中的属性变更的监听器
3监听HttpSession中的JavaBean的状态改变的监听器.(绑定,解决绑定,钝化,活化)
HttpSessionBindingListener:监听HttpSession中的JavaBean的绑定和解除绑定的状态.(setAttribute())
HttpSessionActivationListener:监听HttpSession中的JavaBean的钝化和活化的状态.()
监听器接口中的方法
sessionDidActivate(HttpSessionEvent se); --活化
SessionWillPassivate(HttpSessionEvent se); --钝化
通过配置序列化session:
context.xml
* tomcat/conf/context.xml:对tomcat中的所有虚拟主机和虚拟路径生效.
* tomcat/conf/Catalina/localhost/context.xml:对tomcat下的localhost虚拟主机中的所有路径生效.
* 工程的META-INF/context.xml:对当前的工程生效.
<?xml version="1.0" encoding="UTF-8"?>
<!--
maxIdleSwap:1分钟 如果session不使用就会序列化到硬盘.
directory:itheima序列化到硬盘的文件存放的位置.
-->
<Context>
<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
<Store className="org.apache.catalina.session.FileStore" directory="itheima"/>
</Manager>
</Context>
含义和作用:实现特殊接口的java类,实现对请求资源的过滤功能(自动登录,进行页面的静态化,进行响应压缩)
编写一个过滤器案例:
public class FilterDemo1 implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("FilterDemo1...");
//放行
chain.doFilter(request, response);
}
@Override
public void destroy() {
}
}
1.对过滤器进行配置.(在web.xml中进行配置)
<filter>
<filter-name>FilterDemo1</filter-name>
<filter-class>FilterDemo1的全限定名</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterDemo1</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
方法参数:FilterConfig的作用
Filter生命周期:服务器启动的时候,服务器就会创建过滤器的对象,每次访问被拦截目标资源,过滤器中的doFilter的方法就会执行.当服务器关闭的时候,服务器就会销毁Filter对象.
FilterChain过滤器链:链中的过滤器的执行的顺序跟<filter-mapping>的配置顺序有关.
配置中注意事项:url-pattern的配置与servlet中的配置一样:
* 三种配置:
* 完全路径匹配:以/ 开始 /aaa /aaa/bbb
* 目录匹配: 以/ 开始 /* /aaa/*
* 扩展名匹配: 不能以/ 开始 *.do *.jsp *.action
【servlet-name的配置】通过url-pattern拦截一个Servlet的资源.也可以通过servlet-name标签进行拦截.
【dispatcher的配置】
* REQUEST:默认值.
* FORWARD:拦截转发
* ERROR:拦截跳转到错误页面.全局错误页面.
* INCLUDE:拦截在一个页面中包含另一个页面.