jsp&servlet笔记(四)

一、八种监听器

上一节笔记简单介绍了上下文属性监听器(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来设置最大存活时间,单位是秒。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值