Listener的概述:
什么是监听器:
* 监听器就是一个Java类用来监听其他的JavaBean的变化.
监听器和过滤器属于Servlet中的高级技术.
监听器的应用:
* 主要在Swing编程.
* 在Android大量应用.
* 监听器的术语:
* 事件源 :被监听的对象.汽车
* 监听器对象 :监听的对象.汽车上报警器
* 事件源与监听器绑定:
* 事件 :指的是事件源的改变.
* 获得事件源对象.
Servlet的监听器:
Servlet的监听器:
* 监听ServletContext,HttpSession,ServletRequest
* 事件源和监听器绑定的过程:通过配置完成.
Servlet中的监听器:提供了8个监听器.
一类:监听三个域对象的创建和销毁的监听器.3个
二类:监听三个域对象的属性变更的监听器.(属性添加,属性移除,属性替换)3个.
三类:监听HttpSession对象中的JavaBean的状态的改变.(绑定,解除绑定,钝化和活化)2个
一类监听器:监听三个域对象的创建和销毁的监听器:
ServletContextListener:监听ServletContext对象的创建和销毁.
【方法】
【问题】
* ServletContext对象何时创建和销毁:
* 创建:服务器启动时候,服务器可以为每个WEB应用创建一个单独的ServletContext.
* 销毁:服务器关闭的时候,或者项目从服务器中移除.
【入门案例】
1.编写一个类实现监听器的接口.
public class MyServletContextListener implementsServletContextListener{
@Override
/**
* 监听ServletContext对象的创建的方法:
* @param sce
*/
publicvoid contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext对象被创建了...");
}
@Override
/**
* 监听ServletContext对象的销毁的方法:
* @param sce
*/
publicvoid contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext对象被销毁了...");
}
}
2.通过配置完成监听器和事件源的绑定.
<!-- 配置监听器 -->
<listener>
<listener-class>com.itheima.weblistener.MyServletContextListener</listener-class>
</listener>
【企业中应用】
* 初始化工作.
* 加载配置文件:Spring框架.
* ContextLoaderListener:
* 定时任务调度:
* Timer,TimerTask.
HttpSessionListener:监听HttpSession对象的创建和销毁的监听器.
【方法】
【问题】
* HttpSession对象何时创建和销毁的?
* 创建:服务器第一次调用getSession()方法的时候.
* 销毁:
* 非正常关闭服务器(正常关闭序列化到硬盘)
*session过期了(默认30分钟)
*session.invalidate()
【入门】
1.编写监听器:
public class MyHttpSessionListener implementsHttpSessionListener {
@Override
publicvoid sessionCreated(HttpSessionEvent se) {
System.out.println("HttpSession对象被创建了...");
}
@Override
publicvoid sessionDestroyed(HttpSessionEvent se) {
System.out.println("HttpSession对象被销毁了...");
}
}
2.配置监听器:
<listener>
<listener-class>com.itheima.weblistener.MyHttpSessionListener</listener-class>
</listener>
【问题】
1.访问html是否创建session对象? :不会
2.访问一个Servlet是否创建session对象? :不会
3.访问一个jsp是否创建session对象? :会
ServletRequestListener:监听ServletRequest对象的创建和销毁的监听器:
【方法】
【问题】
ServletRequest对象何时创建和销毁?
* 创建:客户端向服务器发送请求的时候.
* 销毁:服务器为这次请求作出了响应时候.
【入门】
1.编写一个监听器
public class MyServletRequestListener implementsServletRequestListener {
publicvoid requestInitialized(ServletRequestEvent sre) {
System.out.println("ServletRequest被创建了...");
}
publicvoid requestDestroyed(ServletRequestEvent sre) {
System.out.println("ServletRequest被销毁了...");
}
}
2.配置监听器
<listener>
<listener-class>com.itheima.weblistener.MyServletRequestListener</listener-class>
</listener>
【问题】
1.访问html是否创建request对象? :会
2.访问一个Servlet是否创建request对象? :会
3.访问一个jsp是否创建request对象? :会
二类监听三个域对象属性变更的监听器:
ServletContextAttributeListener:监听ServletContext对象中的属性变更的监听器
【方法】
HttpSessionAttributeListener:监听HttpSession对象中的属性变更的监听器
【方法】
ServletRequestAttributeListener:监听ServletRequest对象中的属性变更的监听器
【方法】
三类:监听HttpSession中的JavaBean的状态改变的监听器.(绑定,解决绑定,钝化,活化)
三类监听器非常特殊:
* 监听器作用在JavaBean上.JavaBean可以自己感知在session中状态.
* 这类监听器不用配置.
HttpSessionBindingListener:监听HttpSession中的JavaBean的绑定和解除绑定的状态.
【方法】
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>
<ManagerclassName="org.apache.catalina.session.PersistentManager"maxIdleSwap="1">
<StoreclassName="org.apache.catalina.session.FileStore"directory="itheima"/>
</Manager>
</Context>
监听器的总结:
Servlet的监听器分成三类8个:
* 一类:监听三个域对象的创建和销毁的监听器.
* 二类:监听三个域对象的属性的变更.
* 三类:监听HttpSession中JavaBean的状态的改变.
Filter的概述
什么是过滤器Filter:
Filter:一个实现了特殊接口的Java类.实现对请求资源的过滤的功能.
* 过滤器是Servlet技术中最为实用的技术.
过滤器的作用:
对目标资源进行过滤.
* 自动登录,解决网站乱码,进行页面静态化,进行响应压缩...
使用过滤器:
1.编写一个类实现过滤器的接口.
public class FilterDemo1 implements Filter{
@Override
publicvoid init(FilterConfig filterConfig) throws ServletException {
}
@Override
publicvoid doFilter(ServletRequest request, ServletResponse response, FilterChainchain)
throwsIOException, ServletException {
System.out.println("FilterDemo1执行了...");
// 放行
chain.doFilter(request,response);
}
@Override
publicvoid destroy() {
}
}
2.对过滤器进行配置.
<filter>
<filter-name>FilterDemo1</filter-name>
<filter-class>com.itheima.filter.FilterDemo1</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterDemo1</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
【过滤器的生命周期】(了解)
* Servlet的生命周期(*****)
* Filter生命周期:过滤器从创建到销毁的过程.
* 服务器启动的时候,服务器就会创建过滤器的对象,每次访问被拦截目标资源,过滤器中的doFilter的方法就会执行.当服务器关闭的时候,服务器就会销毁Filter对象.
【FilterConfig的作用】
【方法】
//获得初始化参数:过滤器的初始化参数.
Stringusername = fConfig.getInitParameter("username");
Stringpassword = fConfig.getInitParameter("password");
System.out.println("初始化参数"+username+" "+password);
// 获得所有的初始化参数的名称:
Enumeration<String>names = fConfig.getInitParameterNames();
while(names.hasMoreElements()){
Stringname = names.nextElement();
Stringvalue = fConfig.getInitParameter(name);
System.out.println(name+" "+value);
}
// 获得过滤器的配置的名称:
StringfilterName = fConfig.getFilterName();
System.out.println("过滤器名称"+filterName);
【FilterChain:过滤器链】
过滤器链中的过滤器的执行的顺序跟<filter-mapping>的配置顺序有关.
【方法】
【Filter的配置】
【url-pattern的配置】与servlet中的配置一样:
* 三种配置:
* 完全路径匹配:以 / 开始 /aaa /aaa/bbb
* 目录匹配: 以 / 开始 /* /aaa/*
* 扩展名匹配: 不能以 / 开始 *.do *.jsp *.action
【servlet-name的配置】通过url-pattern拦截一个Servlet的资源.也可以通过servlet-name标签进行拦截.
【dispatcher的配置】
* REQUEST :默认值.
* FORWARD :拦截转发
* ERROR :拦截跳转到错误页面.全局错误页面.
* INCLUDE :拦截在一个页面中包含另一个页面.
【Filter的使用】
在到达目标资源之前对request中的getParameter方法进行增强.
【增强一个类中的某个方法】
1.继承 :能够控制这个类的构造.
2.装饰者 :被增强的对象和增强的对象实现相同的接口,在增强对象中获得到被增强对象的引用.
3.动态代理 :这个类实现了接口即可.