一、八种监听器
上一节笔记简单介绍了上下文属性监听器(ServletContextAttributeListener),下面依次介绍另外七种监听器。
1、HttpSessionListener是会话监听器,当一个会话被创建(sessionCreated)或者被撤销(sessionDestroyed)都可以触发这个监听器。用来跟踪并发的用户。
2、ServletRequestListener是请求监听器,当一个请求被创建或者撤销时触发。
3、ServletRequestAttributeListener是请求属性监听器。这个作用大致相当于上下文属性监听器,只不过监听对象时请求(HttpRequest)。
4、HttpSessionBindingListener是会话绑定监听器,不同于第1个监听器,这个监听器监听的是“属性”,假设一个普通的java类实现了这个接口,那么当它作为属性加入到一个会话时,将会触发valueBound方法,反之将会触发valueUnbound方法。
5、HttpSessionAttributeListener是对会话的属性监听。(注意与1,4的区别)
6,、ServletContextListener上下文监听器,是否创建/撤销了一个上下文。
7、HttpSessionActivationListener对会话的动作进行监听,当会话对象迁移到另一个jvm时触发。
二、上下文作用域不是线程安全的。
我们知道,对上下文的属性是这样使用的:
getServletContext().setAttribute("six","666");
或者
getServletContext().getAttribute("six");
能够像一个哈希表一样使用这些键值对。
但是因为上下文的作用域是整个webapp,所以任何一个servlet都有权利对这些值进行修改,所以,并不是线程安全的。
一般需要做的是对上下文加锁,什么意思呢?就是synchronize!
synchronized (getServletContext()){ //... }
其实使用的是java多线程里面的对象锁原理,这样在大括号里面操作上下文就是线程安全的了。
同样地,HttpSession也不是线程安全的,同步方法是和上下文一样的对象锁。
但是一个请求的属性就是线程安全的了,毕竟一个线程只能操作唯一的一个request对象。
三、请求分派器的两种获得方法
可以从request和context两个地方获得请求分派器。
req.getRequestDispatcher("result.jsp").forward(req,resp); getServletContext().getRequestDispatcher("/result.jsp").forward(req,resp);
以上两种方法的区别就是“从哪里寻找requst.jsp这个页面”。
从请求是从请求的相对位置查找,但是上下文基本上会从目录的根开始查找。
四、使用cookie标记客户
我们都知道在一些web时,登录都是有时效的,比如登录一次,过了半小时后就不可以继续使用登录权限了,需要再次登录。
在Servlet中是借助cookie来完成的,编写的基本步骤是:
1、实现一个servlet类处理这个用户的登录。
2、当用户填写完毕注册表单(post)时,如果检查用户名/密码正确就addCookie给response。这样用户就持有一个有通行证一样的coolie了。
3、当用户要访问需要权限的页面时,就在servlet中用一个循环来检查cookie。
ps:cookie利用setMaxAge来设置最大存活时间,单位是秒。