2010.1.7监听器

这两天郁闷啊,u盘中毒,笔记文件损坏。害的总结都没法做,刚开始就这么不顺,不管了。先发了今天的总结。

 

 

 

Servlet线程安全问题

1. 问题分析

   

2. 解决方法

SinglThreadModel接口,servlet不再以多线程的方式运行,而是已多实例的方式运行。但此接口在Servlet2.4规范中已经过时了

同步对共享数据的操作---使用synchronized关键字修饰同步代码块

*效率低

*但也有使用的时候

 

         *再次提醒,尽量少用

 

改变变量位置

*准备实验环境itcast1130servletThread,LogingServlet.java中模拟网络延迟

 

*在开发中定义一个servlet,尽量不要使用全局变量,要使用局部变量。因为全局变量对所有线程来说都是共有的,会产生并发问题;而局部变量对每个线程是私有的,就不会产生这个问题。

监听器

1. 什么是监听器

   对整个web环境进行监听,当其监听的对象发生情况时候,立即调用相应的方法进行处理

2. 监听器的分类

按监听的事件类项划分
   *用于监听域对象自身的创建和销毁的事件监听器
    *用于监听域对象中的属性的增加和删除的事件监听器
    *用于监听绑定到HttpSession域中的某个对象的状态的事件监听器

按对象分

  *用于监听应用程序环境对象(ServletContext)的事件监听器
  *用于监听用户会话对象(HttpSession)的事件监听器
  *用于监听请求消息对象(ServletRequest)的事件监听器 

3. 编写监听器大致步骤

   

     

4. 域对象创建和销毁itcast1130listener01

概念

   

动手实验ServletContext

*查询API,实现接口javax.ServletContextListenre中的contextDestroyedcontextInitalized方法,这些方法由servlet容器自动完成。

 

 Catalina什么意思?web服务器的引擎

*web.xml中注册监听

*ServletContextEvent的解析

  sce.getSource();

  

HttpSession

*实现HttpSessionListener中的 sessionCreatedsessionDestroyed方法

*注册

*应用:在线人数统计。就是计算sesionDestroyed的调用。

ServletRequest

*MyHttpServletRequest实现ServletRequestListener中的是requestInitalizedrequestDestroyed方法

*注册

注:以上三个域对象的监听接口中的方法均由web容器自动调用。

5. 域对象中属性的变更的事件监听器itcast1130Listener02

servletContext中增,删,换属性的监听

*实现ServletContextAttributeListener接口中的方法

*注册

*创建一个application.jsp。 ApplicationservletContext之间的关系?Applicationjsp的内置对象,代表的就是servletContext

*为什么attributeAdded方法执行了两遍?有一遍是服务器自己在添加属性。

*attributeReplaced方法中输出的是替换前的值(在以后编程中要注意这特点)  

*attributeRemove方法中输出的是替换后的值(在以后编程中要注意这特点)

session中增,删,换属性的监听

 *实现ServletContextAttributeListener接口中的方法

  

     *注册

     *创建sessionAttr.jsp

      

request中增,删,换属性的监听

  *实现ServletContextAttributeListener接口中的方法

  *注册

  *创建requestAttr.jsp

  *attributeAdded方法只执行一次????

  为什么它不用重启服务器??

6.两个帮组JAVABEAN对象感知自己在Session域中状态的监听器接口itcast1130Listener03

感知Session绑定的事件监听器 

*javaBean实现接口HttpSessionBindingListener

 

*不需要注册

*创建sessionAttr.jsp

服务器停后,再启动,获取上次session中的内容

   *实现HttpSessionActivationListener接口

*保存一个对象必须序列化就是让User实现java.io.Serilizble接口

*钝化发生在停止服务器的时候,内存中的session被放到本地硬盘中,在下图路径下出现SESSIONS.ser文件

  

*活化发生在服务器开启的时候,SESSIONS.ser被读取到内存总,文件消失

7.统计在线人数itcast1130onlineCount

工程概述

  

 

游客流程

  *直接由index.jsp转到login.jsp页面

  

  *创建com..itcast.bean.User ,为了不破坏User类,另外定义一个SessionUser继承User,       然后实现HttpSessionBindingEvent接口。

  *为了能在后台列出用户和游客。创建MyServletContextListener.java,创建一个用于存放游客和用户信息的集合(在servletContext中创建,作用域最大,且在服务器启动时候就可以创建集合)要用map,不能用list(不好删除,当session消亡的时候,服务器要收回session对象,但对象在list中存在就不好收回。记得注册

  *index.jsp页面获取远程登录用户的ip,并放到sessionUser

  

*SessionUservalueBound方法自动被服务器调用,向集合中添加sessionid(key),sessionUser(value)

  

*创建onlinenum.jsp页面,在页面中显示游客信息

  

用户流程

  *创建LoginServlet.java,要考虑session过期的情况

  

  *title.jsp页面只能被登录用户访问

    把其放在web-inf目录下,然后再LoginServlet里利用转发方法到这个页面即可

  *chapter.jsp页面只能被登录用户访问,在该页面判断用户名是不是为空。

 

将用户转为游客

   *onlinenum.jsp中添加到RemoveServlet的超链接,并传参数sessionid

    

   *通过sessionid去集合中找对应的sessionUser,并在RemoveServlet中,将该userusername设置为null

  

session过期失效时候,要在其消亡时候,清除map集合中存放的sessionUser对象。

*创建MyHttpServletListener实现HttpServletListener接口,并在destroyed方法中

清除map集合中的sessionUser对象。

 

总结

       *这个练习围绕一个Session对应着一个用户这一特点实现各个功能

       *还要注意的与我们平时所调用方法的习惯不同,监听器的方法都是有web容器自动调用,我们只是指定了在什么时候调用它们而已。

       *练习中用到的三个监听器接口HttpSessionBindingListener, HttpSessionListener, ServletContextListener都是开发中非常常用的。这个练习在开发中的应用价值也很高,需要熟练掌握。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值