JavaWeb Listener
Listener是Servlet的事件监听器,一共有8种。
使用xml注册Listener
<listener> <listener-class>listener.MyListener</listener-class> </listener>
监听的是整个web应用,不是某个Servlet。
使用注解注册Listener
@WebListener()
- ServletContextListener 监听ServletContext对象的创建、销毁
- HttpSessionListener 监听HTTPSession对象的创建、销毁
- ServletRequestListener 监听ServletRequest对象的创建、销毁
HttpSession对象销毁有2种情况
- Session超时
- 使用session.invalidate()强制销毁这个session。
用户直接关闭浏览器,服务器上这个session仍然在,没有被销毁,只是不能再使用这个Session了(作废),原session中数据全部丢失。
后面执行的request.getSession(),是新建一个session,再返回这个新的session,不是获取原session,。
使用Session+HttpSessionListener实现购物车
- 用一个Map来存储购物车中的商品,key存储商品id,value存储购买数量。
- 将Map放到session中,用户修改购物车中的商品时(加入商品、移出商品、修改购买数量),从session中使用getAttribute()取出Map,对Map进行修改,然后setAttribute()放回session中(同名覆盖)。
- 当会话结束销毁session时,把session中的这个Map取出来,从中读取数据,存到数据库中。这个功能可以用Listener来实现。
@WebListener()
public class MyListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent se) {
}
public void sessionDestroyed(HttpSessionEvent se) {
HttpSession session = se.getSession();
//从session中取出Map,获取数据,存储到数据库中
//......
}
}
重写方法时,要把原来的default权限改为public。
- ServletContextAttributeListener 监听ServletContext(application域)中的属性变化,添加、修改——setattribute(),移出——removeAttribute()
- HttpSessionAttributeListener 监听session域中的属性变化
- ServletRequestAttributeListener 监听request域中的属性变化
ServletContext中(application域)放的是整个WebApp的共享数据,是所有用户的公共数据。
session是从request中通过SessionId这个Cookie来获取的,是根据用户浏览器上的SessionId这个Cookie来确定的。服务器上有很多session,一个用户(浏览器)对应一个session,我们从request获取的session是某个用户的,这个session域中存储的是某个用户的信息。
request是某个用户(浏览器)本次请求中添加、设置的数据,只在本次HTTP请求中有效。
JavaWeb中的8个监听器均为接口,自己新建Listener实现即可。
实现的时候需要注意,这8个接口只是声明为interface,里面的方法权限都是default,且都提供了空实现,并不是public abstract,所以IDEA不会自动重写里面的方法,需要我们Ctrl+B找到接口中的方法,复制过来,把default改为public,再写代码。
IDEA下新建Listener时,默认会实现 ServletContextListener,HttpSessionListener, HttpSessionAttributeListener 这三个最常用的监听器。