1.什么是监听器?有什么用?
用于监听某一个事件的发生,监听器的原理就是接口回调。
2.监听器分为三类八种:
三个作用域
request—–HttpServletRequest
session—-HttpSession
application—–ServletContext
第一类:用于监听 三个域对象的创建销毁事件
ServletContextListener
监听ServletContext创建销毁
创建 : 服务器启动为每一个应用创建一个ServletContext实例
销毁: 关闭服务器,或者项目从服务器中移除
ServletRequestListener
监听ServletRequest创建销毁
创建: 只要有请求过来,不管请求什么东西, 服务器都会帮我们创建一个request实例
销毁:当服务器对这次请求作出了响应,那么就销毁了这个实例
HttpSessionListener
监听session的创建销毁
创建: 服务器调用getSession 或者 访问jsp 会创建 session实例
销毁: 会话超时 , 非正常关闭 服务器(正常关闭服务器 ,session会序列化。)
用法:创建监听器,注册监听器
三个用法都一样
1. 定义一个类, 实现对应的接口。
2. 在 web.xml 中 使用<listener> 元素来注册
<listener>
<listener-class>com.unistrong.servlet.Demoservlet</listener-class>
</listener>
第二类:监听ServletContextAttributeListener
监听ServletContext 域中的属性改变 , 添加 | 替换 | 移除
ServletRequestAttributeListener
监听ServletRequest 域中的属性改变 , 添加 | 替换 | 移除
HttpSessionAttributeListener
监听HttpSession 域中的属性改变 , 添加 | 替换 | 移除
用法一样:
1. 定义一个了类,实现对应的接口
2. 在web.xml中使用listener 注册
3. 对三个域分别作出 添加 | 替换 | 移除的动作。 即可看出变化
第三类:监听httpsession的值改变
这一类监听器与前两种监听器不太一样。这种监听器无需在web.xml中配置, 只需要让javaBean实现对应的接口即可。
HttpSessionBindingListener
public void valueBound(HttpSessionBindingEvent event) {
System.out.println("对象被绑定到了session上面去了");
}
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("对象从session中移除了。");
}
HttpSessionBindingListener 主要监听的是 对象与session域的绑定和解绑的事件
HttpSessionActivationListener
public void sessionWillPassivate(HttpSessionEvent se) {
System.out.println("对象被钝化了...");
}
public void sessionDidActivate(HttpSessionEvent se) {
System.out.println("对象被活化了...");
}
HttpSessionActivationListener 监听的是 对象被钝化 和 活化的事件 。
钝化:
正常关闭服务器或者超过了规定时间,那么对象将会被 钝化(序列化)到硬盘上 。
活化:
重新启动服务器, 那么之前钝化的数据将会被活化(反序列化。) ,那么我们在页面上亦可访问。
Session中通常可以存数据的,那么我们可以把一些长时间不使用的数据给序列化(钝化)到硬盘上 ,等再使用的时候,可以从硬盘反序列化(活化)回来。这样节省了不少内存空间。
1.什么是过滤器?有什么用?
过滤器的作用 : 主要是起到的是拦截作用 , 用于在客户端 请求服务器资源的时候,执行过滤(拦截) 。 如果过滤器放行,那么这个请求才能到达服务器 。 如果过滤器拒绝放行,那么服务器就不会收到这个请求。
2.生命周期?
创建: 服务器启动即创建过滤器实例
销毁:服务器关闭即销毁过滤器实例
3.配置说明?
过滤器要想生效还必须在web.xml中进行配置, 它的配置方式与 servlet的配置方式几乎一样。
<filter>
<filter-name>aa</filter-name>
<filter-class>xx.xx.xx.XXX</filter-class>
</filter>
<filter-mapping>
<filter-name>aa</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
过滤器拦截的是谁, 具体还是看 url-patter的设置。 此处的设置与servlet的设置是一样。
完全目录匹配 以/开始
/aa/bb /aa/xx
目录匹配 以/开始 , 以*结束
如:/* /aaa/* /aaa/bbb/*
扩展名匹配 :
如 : aa.jsp bb.do cc.action
除了以上的配置。还可以使用dispatch来对当前的请求类型进行过滤
REQUEST :默认值,默认过滤器只会拦截请求
FORWARD :过滤器拦截转发
INCLUDE :过滤器拦截包含
ERROR :过滤器拦截全局错误页面的跳转。
4.执行顺序?
1.客户端发送请求,先经过过滤器,如果过滤器放行才能到servlet.
2.如果有多个过滤器,按他们注册的映射顺序进行排队,如果前一个过滤器不放行,后面的过滤器以及servlet不会得到请求。