《Head First Servlets & JSP》-6-会话管理-listener etc. demo
工程结构

上下文参数示例
示例程序展示了如何从上下文读取参数,并在上下文监听器中生成属性对象和在上下文中设置属性。
- 建立一个简单的JavaBean对象作为属性:Dog.java
package com.example.entities;/*** Created by LTN on 2016/11/2.*/public class Dog {private String breed;public Dog(String breed) {this.breed = breed;}public String getBreed() {return breed;}}
- 建立一个servlet上下文监听器DogServletContextListener.java
package com.example.listener;import com.example.entities.Dog;import javax.servlet.ServletContext;import javax.servlet.ServletContextEvent;/*** Created by LTN on 2016/11/2.*/public class DogServletContextListener implements javax.servlet.ServletContextListener {public void contextInitialized(ServletContextEvent event) {ServletContext sc = event.getServletContext();String dogBreed = sc.getInitParameter("breed");Dog d = new Dog(dogBreed);sc.setAttribute("dog", d);}public void contextDestroyed(ServletContextEvent event) {//do nothing.}}
- 建立Servlet进行测试ContextListenerTester.java
package com.example.servlet;import com.example.entities.Dog;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.PrintWriter;/*** Created by LTN on 2016/11/2.*/public class ContextListenerTester extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {response.setContentType("text/html");PrintWriter out = response.getWriter();out.println("test context attributes set by listener<br>");out.println("<br>");Dog dog = (Dog) getServletContext().getAttribute("dog");out.println("Dog's breed is: " + dog.getBreed());}}
- 在DD(web.xml)中配置上下文参数、监听器和servlet映射关系
<web-app><display-name>Archetype Created Web Application</display-name><context-param><param-name>breed</param-name><param-value>Great Dane</param-value></context-param><servlet><servlet-name>ListenerTester</servlet-name><servlet-class>com.example.servlet.ContextListenerTester</servlet-class></servlet><servlet-mapping><servlet-name>ListenerTester</servlet-name><url-pattern>/ListenTest.do</url-pattern></servlet-mapping><listener><listener-class>com.example.listener.DogServletContextListener</listener-class></listener></web-app>
- 效果
启动项目,在浏览器输入http://localhost:8080/servlet-listener/ListenTest.do
显示:
test context attributes set by listenerDog's breed is: Great Dane
Session属性监听器
使用Session属性监听器对Session中属性进行监听,当Session属性发生增加、删除或改变时,会被该监听器捕捉。
- 创建一个Session属性监听类DogSessionAttributeListener.java
package com.example.listener;import javax.servlet.http.HttpSessionAttributeListener;import javax.servlet.http.HttpSessionBindingEvent;/*** Created by LTN on 2016/11/2.*/public class DogSessionAttributeListener implements HttpSessionAttributeListener {public void attributeAdded(HttpSessionBindingEvent event) {String name = event.getName();Object value = event.getValue();System.out.println("Attribute added: " + name + ": " + value);}public void attributeRemoved(HttpSessionBindingEvent event) {String name = event.getName();Object value = event.getValue();System.out.println("Attribute removed: " + name + ": " + value);}public void attributeReplaced(HttpSessionBindingEvent event) {String name = event.getName();Object value = event.getValue();System.out.println("Attribute replaced: " + name + ": " + value);}}
- 建立一个Servlet测试类AttributeListenerTester.java
package com.example.servlet;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import java.io.IOException;/*** Created by LTN on 2016/11/2.*/public class AttributeListenerTester extends HttpServlet {private static int labelCounter = 0;public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {HttpSession session = request.getSession();session.setAttribute("label", "label" + labelCounter++);}}
- 在DD中配置servlet和listener
<servlet><servlet-name>AttributeListenTester</servlet-name><servlet-class>com.example.servlet.AttributeListenerTester</servlet-class></servlet><servlet-mapping><servlet-name>AttributeListenTester</servlet-name><url-pattern>/AttributeListenerTest.do</url-pattern></servlet-mapping><listener><listener-class>com.example.listener.DogSessionAttributeListener</listener-class></listener>
- 测试效果
启动tomcat,在浏览器中输入URL:http://localhost:8080/servlet-listener/AttributeListenerTest.do
第一次回车后,后台打印
Attribute added: label: label0
然后连续三次刷新,后台依次打印:
Attribute replaced: label: label0Attribute replaced: label: label1Attribute replaced: label: label2
注意,event.getName()和event.getValue()都是获取该事件之前的session属性的值。
统计全局活动的对话
使用HttpSessionListener进行全局活动会话的统计,类似统计在线人数功能。
- 建立全局活动会话监听器
package com.example.listener;import javax.servlet.http.HttpSessionEvent;import javax.servlet.http.HttpSessionListener;/*** Created by LTN on 2016/11/2.*/public class GlobalCounterListener implements HttpSessionListener {static private int activeSessions;public static int getActiveSessions() {return activeSessions;}public void sessionCreated(HttpSessionEvent event) {activeSessions++;}public void sessionDestroyed(HttpSessionEvent event) {activeSessions--;}}
- 建立servlet测试类GlobalCounterTester.java
package com.example.servlet;import com.example.listener.GlobalCounterListener;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import java.io.IOException;import java.io.PrintWriter;/*** Created by LTN on 2016/11/2.*/public class GlobalCounterTester extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {PrintWriter out = response.getWriter();HttpSession session = request.getSession();session.setAttribute("name","counter");String name=(String)session.getAttribute("name");int activeSessions= GlobalCounterListener.getActiveSessions();out.println("name: "+name);out.println("activeSessions: "+activeSessions);}}
- 在DD中配置servlet和listener
<servlet><servlet-name>SessionCounterTester</servlet-name><servlet-class>com.example.servlet.GlobalCounterTester</servlet-class></servlet><servlet-mapping><servlet-name>SessionCounterTester</servlet-name><url-pattern>/CounterTest.do</url-pattern></servlet-mapping><listener><listener-class>com.example.listener.GlobalCounterListener</listener-class></listener>
- 测试效果
在浏览器输入URL:http://localhost:8080/servlet-listener/CounterTest.do
页面显示:
name: counteractiveSessions: 1
换一个浏览器,输入地址,会显示activeSessions数值递增。
注意,同一个浏览器开新标签不能使得session个数增加;关闭当前浏览器再接着启动,也不能。
属性绑定监听器
当属性对象被加入session或从session删除使,对象本身可以知道。
- 建立Session binding监听器Dog.java,该类继承了HttpSessionBindingListener,并实现valueBound和valueUnbound方法。
package com.example.entities;import javax.servlet.http.HttpSessionBindingEvent;import javax.servlet.http.HttpSessionBindingListener;/*** Created by LTN on 2016/11/2.*/public class Dog implements HttpSessionBindingListener {private String breed;public Dog(String breed) {this.breed = breed;}public String getBreed() {return breed;}public void valueBound(HttpSessionBindingEvent event) {System.out.println("I am a dog, i know i am in a conversation now.");}public void valueUnbound(HttpSessionBindingEvent event) {System.out.println("I am a dog, i know i am leaving a conversation now.");}}
- 建立servlet测试类EntityBindingTester.java
package com.example.servlet;import com.example.entities.Dog;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import java.io.IOException;/*** Created by LTN on 2016/11/2.*/public class EntityBindingTester extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws IOException,ServletException {Dog dog = (Dog) getServletContext().getAttribute("dog");HttpSession session = request.getSession();session.setAttribute("dog-binding",dog);session.invalidate();}}
- 在DD中配置servlet,注意,属性Dog不用/能在DD中配置
<servlet><servlet-name>ObjectBindingTester</servlet-name><servlet-class>com.example.servlet.EntityBindingTester</servlet-class></servlet><servlet-mapping><servlet-name>ObjectBindingTester</servlet-name><url-pattern>/ObjectBindingTest.do</url-pattern></servlet-mapping>
- 效果测试
启动tomcat,输入URL:http://localhost:8080/servlet-listener/ObjectBindingTest.do
后台打印:
I am a dog, i know i am in a conversation now.Attribute added: dog-binding: com.example.entities.Dog@6dbba86eI am a dog, i know i am leaving a conversation now.Attribute removed: dog-binding: com.example.entities.Dog@6dbba86e
附件列表
《Head First Servlets & JSP》-6-会话管理-listener etc. demo的更多相关文章
- [Servlet&JSP] HttpSession会话管理
我们能够将会话期间必须共享的资料保存在HttpSession中,使之成为属性.假设用户关掉浏览器接受Cookie的功能.HttpSession也能够改用URL重写的方式继续其会话管理功能. HttpS ...
- HeadFirst Jsp 06 (会话管理)
现在我们希望能够跨多个请求保留客户特定的状态. 现在, 模型中的业务只是检查请求中的参数, 并返回一个响应(建议), 应用中没有谁记得在当前请求之前与这个客户之间发生过什么. 与一个客户的整个会话期间 ...
- 我的Java之旅 第七课 JAVA WEB 会话管理
1.隐藏域 隐藏域其实不是Servlet/JSP的会话管理机制的内容,但它能实现简单的页面状态记录的效果. 2.Cookie Cookie类 setMaxAge() 设置有效期 ...
- 10、会话管理/编程实战分析/Jsp
1 会话管理回顾 会话管理 1)会话管理: 管理浏览器和服务器之间的会话过程中产生的会话数据 2)Cookie技术: 会话数据保存在浏览器客户端. Cookie核心的API: 2.1 在服务器端创建C ...
- 【JSP&Servlet学习笔记】4.会话管理
Http本身是无状态通信协议,要进行会话管理的基本原理,就是将需要维护的状态回应给浏览器,由浏览器在下次请求时主动发送状态信息,让Web应用程序“得知”请求之间的关联. 隐藏字段是将状态信息以窗体中看 ...
- jsp/servlet学习三之会话管理初解
由于http的无状态性,使得会话管理或会话跟踪成为web应用开发一个无可避免的主题.默认下,一个web服务器无法区分一个http请求是否为第一次访问.例如,一个web邮件应用要求用户登陆后才能查看邮件 ...
- shiro会话管理
Shiro提供了完整的企业级会话管理功能,不依赖于底层容器(如web容器tomcat),不管JavaSE还是JavaEE环境都可以使用,提供了会话管理.会话事件监听.会话存储/持久化.容器无关的集群. ...
- 第十章 会话管理——《跟我学Shiro》
转发地址:https://www.iteye.com/blog/jinnianshilongnian-2028675 目录贴:跟我学Shiro目录贴 Shiro提供了完整的企业级会话管理功能,不依赖于 ...
- Java中的会话管理——HttpServlet,Cookies,URL Rewriting(译)
参考谷歌翻译,关键字直接使用英文,原文地址:http://www.journaldev.com/1907/java-session-management-servlet-httpsession-url ...
随机推荐
- Dilworth 定理
主要是做个笔记 DAG 最长反链 = 最小链覆盖 反链:反链上任意两个点 $(u,v)$ ,$u$ 不能到 $v$,$v$ 也不能到 $u$ 最小链覆盖:选出若干可以相交的链,覆盖整张图,注意与“最小 ...
- Unity3D研究院之Assetbundle的实战(六十三)
http://www.xuanyusong.com/archives/2405 上一篇文章中我们相惜讨论了Assetbundle的原理,如果对原理还不太了解的朋友可以看这一篇文章:Unity3D研究院 ...
- centos安装yum源
网易(163)yum源是国内最好的yum源之一 ,无论是速度还是软件版本,都非常的不错,将yum源设置为163yum,可以提升软件包安装和更新的速度,同时避免一些常见软件版本无法找到.具体设置方法如下 ...
- 异常:idea一直刷新索引:updating index
解决方案:File ->Invalidate Caches/restart -> Invalidate and Restart 即重新构建索引
- maven 历史版本下载
1.登录http://maven.apache.org/download.cgi 2.拉倒最下面,点击 archives 3.可以看到maven个版本,找自己需要的下载
- 蓝桥杯 算法训练 ALGO-118 连续正整数的和
算法训练 连续正整数的和 时间限制:1.0s 内存限制:256.0MB 问题描述 78这个数可以表示为连续正整数的和,1+2+3,18+19+20+21,25+26+27. 输入一个正整数 n ...
- [转载]get_fs()和set_fs()
其实内核里面也可以用系统调用的,直接用read/write是可以的.但要注意几个问题:一个是要记得编译的时候加上-D__KERNEL_SYSCALLS__另外源文件里面要#include如果报错,很可 ...
- 使用script转储终端命令输出,或者录制并播放session的内容
摘自:http://leohot.blog.163.com/blog/static/1348656022012729113658473/ 注意: 1. 启动script时没有指定文件名,它会自动记录到 ...
- Spring学习十一
一: 创建bean的方法: 1: 如果不采用构造注入:默认调用bean的无参构造函数,因此该类必须要提供无参构造函数,用无参构造函数用反射创建bean. : 如果采用构造 ...
- svn 撤销修改
1,更新到最新版本 不知道是哪个文件的问题时,可以svn log查看日志,基本上可以通过哪一次提交修改了哪一个文件推算出 是哪个文件的问题. 若知道是哪个文件的问题,直接svn log 文件名 大致确 ...