这两天郁闷啊,u盘中毒,笔记文件损坏。害的总结都没法做,刚开始就这么不顺,不管了。先发了今天的总结。
Servlet线程安全问题
1. 问题分析
2. 解决方法
l 实现SinglThreadModel接口,servlet不再以多线程的方式运行,而是已多实例的方式运行。但此接口在Servlet2.4规范中已经过时了
l 同步对共享数据的操作---使用synchronized关键字修饰同步代码块
*效率低
*但也有使用的时候
*再次提醒,尽量少用
l 改变变量位置
*准备实验环境itcast1130servletThread,在LogingServlet.java中模拟网络延迟
*在开发中定义一个servlet,尽量不要使用全局变量,要使用局部变量。因为全局变量对所有线程来说都是共有的,会产生并发问题;而局部变量对每个线程是私有的,就不会产生这个问题。
监听器
1. 什么是监听器
对整个web环境进行监听,当其监听的对象发生情况时候,立即调用相应的方法进行处理
2. 监听器的分类
l 按监听的事件类项划分
*用于监听域对象自身的创建和销毁的事件监听器
*用于监听域对象中的属性的增加和删除的事件监听器
*用于监听绑定到HttpSession域中的某个对象的状态的事件监听器
l 按对象分
*用于监听应用程序环境对象(ServletContext)的事件监听器
*用于监听用户会话对象(HttpSession)的事件监听器
*用于监听请求消息对象(ServletRequest)的事件监听器
3. 编写监听器大致步骤
4. 域对象创建和销毁itcast1130listener01
l 概念
l 动手实验ServletContext
*查询API,实现接口javax.ServletContextListenre中的contextDestroyed和contextInitalized方法,这些方法由servlet容器自动完成。
Catalina什么意思?web服务器的引擎
*在web.xml中注册监听
*对ServletContextEvent的解析
sce.getSource();
l HttpSession
*实现HttpSessionListener中的 sessionCreated和sessionDestroyed方法
*注册
*应用:在线人数统计。就是计算sesionDestroyed的调用。
l ServletRequest
*在MyHttpServletRequest实现ServletRequestListener中的是requestInitalized和requestDestroyed方法
*注册
注:以上三个域对象的监听接口中的方法均由web容器自动调用。
5. 域对象中属性的变更的事件监听器itcast1130Listener02
l 在servletContext中增,删,换属性的监听
*实现ServletContextAttributeListener接口中的方法
*注册
*创建一个application.jsp。 Application和servletContext之间的关系?Application是jsp的内置对象,代表的就是servletContext
*为什么attributeAdded方法执行了两遍?有一遍是服务器自己在添加属性。
*在attributeReplaced方法中输出的是替换前的值(在以后编程中要注意这特点)
*在attributeRemove方法中输出的是替换后的值(在以后编程中要注意这特点)
l 在session中增,删,换属性的监听
*实现ServletContextAttributeListener接口中的方法
*注册
*创建sessionAttr.jsp
l 在request中增,删,换属性的监听
*实现ServletContextAttributeListener接口中的方法
*注册
*创建requestAttr.jsp
*attributeAdded方法只执行一次????
为什么它不用重启服务器??
6.两个帮组JAVABEAN对象感知自己在Session域中状态的监听器接口itcast1130Listener03
l 感知Session绑定的事件监听器
*javaBean实现接口HttpSessionBindingListener
*不需要注册
*创建sessionAttr.jsp
l 服务器停后,再启动,获取上次session中的内容
*实现HttpSessionActivationListener接口
*保存一个对象必须序列化就是让User实现java.io.Serilizble接口
*钝化发生在停止服务器的时候,内存中的session被放到本地硬盘中,在下图路径下出现SESSIONS.ser文件
*活化发生在服务器开启的时候,SESSIONS.ser被读取到内存总,文件消失
7.统计在线人数itcast1130onlineCount
l 工程概述
l 游客流程
*直接由index.jsp转到login.jsp页面
*创建com..itcast.bean.User ,为了不破坏User类,另外定义一个SessionUser继承User, 然后再实现HttpSessionBindingEvent接口。
*为了能在后台列出用户和游客。创建MyServletContextListener.java,创建一个用于存放游客和用户信息的集合(在servletContext中创建,作用域最大,且在服务器启动时候就可以创建集合)要用map,不能用list(不好删除,当session消亡的时候,服务器要收回session对象,但对象在list中存在就不好收回) 。记得注册
*在index.jsp页面获取远程登录用户的ip,并放到sessionUser中。
*SessionUser中的valueBound方法自动被服务器调用,向集合中添加sessionid(key),sessionUser(value)
*创建onlinenum.jsp页面,在页面中显示游客信息
l 用户流程
*创建LoginServlet.java,要考虑session过期的情况
*让title.jsp页面只能被登录用户访问
把其放在web-inf目录下,然后再LoginServlet里利用转发方法到这个页面即可
*让chapter.jsp页面只能被登录用户访问,在该页面判断用户名是不是为空。
l 将用户转为游客
*在onlinenum.jsp中添加到RemoveServlet的超链接,并传参数sessionid
*通过sessionid去集合中找对应的sessionUser,并在RemoveServlet中,将该user的username设置为null
l 当session过期失效时候,要在其消亡时候,清除map集合中存放的sessionUser对象。
*创建MyHttpServletListener实现HttpServletListener接口,并在destroyed方法中
清除map集合中的sessionUser对象。
l 总结
*这个练习围绕一个Session对应着一个用户这一特点实现各个功能
*还要注意的与我们平时所调用方法的习惯不同,监听器的方法都是有web容器自动调用,我们只是指定了在什么时候调用它们而已。
*练习中用到的三个监听器接口HttpSessionBindingListener, HttpSessionListener, ServletContextListener都是开发中非常常用的。这个练习在开发中的应用价值也很高,需要熟练掌握。