监听器:
监听域对象的创建与销毁 3个
监听域对象中值状态的改变 3个
监听对象与session的关系2个
监听对象是否在session中存在
活化与钝化
过滤器:
Filter接口
过滤器的作用
过滤器如何使用
@WebFilter urlPatterns ==> String[] dispatcherTypes ==> Dispatcher[]
过滤器的生命周期
init() 初始化
doFilter() 执行过滤,切记放行!
destroy() 销毁
监听器(接口)
8个监听接口
第一组:用来监听域对象(ServletContext、HttpSession、HttpServletRequest)的创建与销毁 3个
第二组:用来监听域对象(ServletContext、HttpSession、HttpServletRequest)中值状态的改变 3个
第三组:用来监听对象与Session的关系,实现活化与钝化 2个
过滤器(只有一个接口,Filter)
统一编码
登录控制
一、什么是监听器?
监听器是接口,一个类实现了监听接口之后,就具备了监听某些内容的功能!
当监听的对象,比如域对象创建、销毁时,就可以捕捉到这个行为,进而在方法中完成操作!
监听的内容及监听器的分类:
第一组:负责监听域对象(ServletContext、HttpSession、HttpServletRequest)的创建与销毁 3个
第二组:负责监听域对象中值状态(添加、修改、删除)的改变 3个
第三组:监听对象与Session的关系1个,活化与钝化1个
监听器机制主要服务于底层框架、servlet机制等代码中,在自定义书写的代码中有关于监听器的使用并不是特别多。
1、监听域对象的创建与销毁
(1)、ServletContextListener,监听ServletContext的创建与销毁
示例代码:
为了保证类具备监听的功能,实现接口后,要进行注册
以上两种方式同一时间只能存在一种!!!
a、在web.xml文件中实现注册
b、在监听器类上添加监听注解(推荐使用!)
(2)、HttpSessionListener,监听Session域对象的创建与销毁
示例代码:
session对象执行了invalidate()方法,那么监听销毁的方法就会自动执行!
(3)、ServletRequestListener,监听request域对象的创建与销毁
示例代码:
在监听的方法中,参数可以用来获取监听的域对象,进而执行操作!
切记,HttpServletRequest接口 继承了 ServletRequest接口,但是我们之前学习的有关于请求的方法都是HttpServletRequest接口中的,如果需要使用,则需要类型转换!
2、监听域对象中值状态的改变(添加、修改、删除)
(1)、ServletContextAttributeListener,监听ServletContext域对象中值状态的改变
示例代码:
jsp页面操作值的代码:
打印的结果:
(2)、HttpSessionAttributeListener,监听session域对象中值状态的改变
示例代码:
页面操作数据的方法:
打印的结果:
(3)、ServletRequestAttributeListener,监听request域对象中值状态的改变
示例代码:
页面中操作数据的方法:
打印数据的结果:
3、监听对象与Session关系
(1) HttpSessionBindingListener,监听对象是否在session中是否存在
之前学的六个监听器,创建类实现接口,那么此类就具有了监听域对象的功能。但此时我们需要去监听对象,所以说我们应该让我们监听的对象的类来实现监听接口!
示例:监听学生对象是否在session中存在
创建学生类,并且让学生类实现HttpSessionBindingListener
jsp中操作对象的方法:
控制打印结果:
(2)、HttpSessionActivationListener,实现session的活化与钝化
钝化
当服务器正常关闭时,还存活着的session(在设置时间内没有销毁) 会随着服务器的关闭被以文件(“SESSIONS.ser”)的形式存储在tomcat 的work 目录下,这个过程叫做Session 的钝化。
活化
当服务器再次正常开启时,服务器会找到之前的“SESSIONS.ser” 文件,从中恢复之前保存起来的Session 对象,这个过程叫做Session的活化。
应用场景:
打开浏览器窗口正常访问的过程中,我们可以获取到当前会话session中的数据,比如说登录状态。由于服务器维护导致服务器正常关闭,我们的访问不能正常进行了,但我需要的是在服务器开启之后依旧可以拿到之前会话session中的数据,此时就可以使用HttpSessionActivationListener来实现session的活化与钝化。
测试:
先将一个对象存储在session中,然后钝化,活化之后恢复此对象的数据,查看过程。
此时我们应该让这个对象对应的类实现活化与钝化的接口。为了保证活化与钝化的成功,除了要实现HttpSessionActivationListener接口之外,还需要实现序列化接口,Serializable
public class Car implements HttpSessionActivationListener, Serializable {
private static final long serialVersionUID = 1L;
private String brand;
private String color;
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public Car() {
// TODO Auto-generated constructor stub
}
public Car(String brand, String color) {
super();
this.brand = brand;
this.color = color;
}
@Override
public String toString() {
return "Car [brand=" + brand + ", color=" + color + "]";
}
//session钝化的方法
@Override
public void sessionWillPassivate(HttpSessionEvent se) {
System.out.println("钝化");
System.out.println(se.getSession());
System.out.println(se.getSession().getAttribute("car"));
}
//session活化的方法
@Override
public void sessionDidActivate(HttpSessionEvent se) {
System.out.println("活化");
System.out.println(se.getSession());
System.out.println(se.getSession().getAttribute("car"));
}
}
先访问active.jsp页面,将车存入到会话session中:
再直接访问test.jsp,可以拿到车的品牌
此时正常关闭tomcat服务器,执行了钝化操作,session被以文件的形式存储在本地tomcat目录下,钝化的数据以及当前的session对象
重新启动服务器,执行活化操作,从钝化的文件中恢复之前会话中的数据,文件销毁,直接在浏览器中访问test.jsp依旧可以拿到数据。此时活化打印的数据以及session
活化与钝化时,因为tomcat服务器关闭了,就会导致会话对象的销毁,重启服务器开启了新会话,虽然会话对象发生了变化,但是数据一致即可!
二、过滤器
什么是过滤器???
一个类实现了过滤的接口,具有了过滤、筛选(请求、请求路径)的功能!Filter
过滤器场景:
1、设置统一编码,就是请求到达servlet与jsp之前,已经为请求对象、响应对象设置了编码格式,那么在jsp或者servlet中直接获取参数以及响应数据就可以了。
request.setCharacterEncoding(“utf-8”)
response.setContentType(“text/html;charset=utf-8”)
2、登录控制,我们要做到极致的话,如果没有登录,连访问页面的能力都没有!
过滤器的作用???
在请求到达jsp或者servlet之前,针对请求或者请求的路径进行处理,简化代码操作,更加方便。我们从一定角度出发考虑过滤器的话,可以将过滤器理解为一个工具类!
过滤器如何使用???
创建一个类实现过滤器的接口Filter
public class HahaFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("过滤器初始化");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("过滤器过滤到请求");
/*
执行完过滤的功能代码之后,一定要将请求放行!!!
如果哪一天,访问页面死活出不来,在排除了500及404的错误后,百分之99.9的情况就是过滤器中没有放行请求
*/
chain.doFilter(request, response);
}
@Override
public void destroy() {
System.out.println("过滤器销毁");
}
}
对创建的过滤器完成注册:
方式1,web.xml文件:
方式2,注解:
urlPatterns属性表示的是过滤器过滤的路径集合,是字符串数组,可以在数组中指定哪些路径需要过滤,哪些不需要过滤就不写在数组中!
但是要注意一个问题,web.xml文件中的注册与注解同一时间只能存在一个!!!
过滤器有个小bug:
过滤器默认只能过滤直接请求,过滤不了请求转发~~~
只需要在注解中添加过滤方式的属性即可:
过滤器的生命周期:
init(),当项目被tomcat加载启动服务器时,就会创建过滤器对象
doFilter(),当请求路径满足了过滤器过滤的路径条件时,就会执行过滤方法
destroy(),服务器正常关闭时会执行销毁方法