工程结构

上下文参数示例

示例程序展示了如何从上下文读取参数,并在上下文监听器中生成属性对象和在上下文中设置属性。

  • 建立一个简单的JavaBean对象作为属性:Dog.java
  1. package com.example.entities;
  2. /**
  3. * Created by LTN on 2016/11/2.
  4. */
  5. public class Dog {
  6. private String breed;
  7. public Dog(String breed) {
  8. this.breed = breed;
  9. }
  10. public String getBreed() {
  11. return breed;
  12. }
  13. }
  • 建立一个servlet上下文监听器DogServletContextListener.java
  1. package com.example.listener;
  2. import com.example.entities.Dog;
  3. import javax.servlet.ServletContext;
  4. import javax.servlet.ServletContextEvent;
  5. /**
  6. * Created by LTN on 2016/11/2.
  7. */
  8. public class DogServletContextListener implements javax.servlet.ServletContextListener {
  9. public void contextInitialized(ServletContextEvent event) {
  10. ServletContext sc = event.getServletContext();
  11. String dogBreed = sc.getInitParameter("breed");
  12. Dog d = new Dog(dogBreed);
  13. sc.setAttribute("dog", d);
  14. }
  15. public void contextDestroyed(ServletContextEvent event) {
  16. //do nothing.
  17. }
  18. }
  • 建立Servlet进行测试ContextListenerTester.java
  1. package com.example.servlet;
  2. import com.example.entities.Dog;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import java.io.IOException;
  8. import java.io.PrintWriter;
  9. /**
  10. * Created by LTN on 2016/11/2.
  11. */
  12. public class ContextListenerTester extends HttpServlet {
  13. public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
  14. response.setContentType("text/html");
  15. PrintWriter out = response.getWriter();
  16. out.println("test context attributes set by listener<br>");
  17. out.println("<br>");
  18. Dog dog = (Dog) getServletContext().getAttribute("dog");
  19. out.println("Dog's breed is: " + dog.getBreed());
  20. }
  21. }
  • 在DD(web.xml)中配置上下文参数、监听器和servlet映射关系
  1. <web-app>
  2. <display-name>Archetype Created Web Application</display-name>
  3. <context-param>
  4. <param-name>breed</param-name>
  5. <param-value>Great Dane</param-value>
  6. </context-param>
  7. <servlet>
  8. <servlet-name>ListenerTester</servlet-name>
  9. <servlet-class>com.example.servlet.ContextListenerTester</servlet-class>
  10. </servlet>
  11. <servlet-mapping>
  12. <servlet-name>ListenerTester</servlet-name>
  13. <url-pattern>/ListenTest.do</url-pattern>
  14. </servlet-mapping>
  15. <listener>
  16. <listener-class>com.example.listener.DogServletContextListener</listener-class>
  17. </listener>
  18. </web-app>
  1. test context attributes set by listener
  2. Dog's breed is: Great Dane

Session属性监听器

使用Session属性监听器对Session中属性进行监听,当Session属性发生增加、删除或改变时,会被该监听器捕捉。

  • 创建一个Session属性监听类DogSessionAttributeListener.java
  1. package com.example.listener;
  2. import javax.servlet.http.HttpSessionAttributeListener;
  3. import javax.servlet.http.HttpSessionBindingEvent;
  4. /**
  5. * Created by LTN on 2016/11/2.
  6. */
  7. public class DogSessionAttributeListener implements HttpSessionAttributeListener {
  8. public void attributeAdded(HttpSessionBindingEvent event) {
  9. String name = event.getName();
  10. Object value = event.getValue();
  11. System.out.println("Attribute added: " + name + ": " + value);
  12. }
  13. public void attributeRemoved(HttpSessionBindingEvent event) {
  14. String name = event.getName();
  15. Object value = event.getValue();
  16. System.out.println("Attribute removed: " + name + ": " + value);
  17. }
  18. public void attributeReplaced(HttpSessionBindingEvent event) {
  19. String name = event.getName();
  20. Object value = event.getValue();
  21. System.out.println("Attribute replaced: " + name + ": " + value);
  22. }
  23. }
  • 建立一个Servlet测试类AttributeListenerTester.java
  1. package com.example.servlet;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.http.HttpServlet;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. import javax.servlet.http.HttpSession;
  7. import java.io.IOException;
  8. /**
  9. * Created by LTN on 2016/11/2.
  10. */
  11. public class AttributeListenerTester extends HttpServlet {
  12. private static int labelCounter = 0;
  13. public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
  14. HttpSession session = request.getSession();
  15. session.setAttribute("label", "label" + labelCounter++);
  16. }
  17. }
  • 在DD中配置servlet和listener
  1. <servlet>
  2. <servlet-name>AttributeListenTester</servlet-name>
  3. <servlet-class>com.example.servlet.AttributeListenerTester</servlet-class>
  4. </servlet>
  5. <servlet-mapping>
  6. <servlet-name>AttributeListenTester</servlet-name>
  7. <url-pattern>/AttributeListenerTest.do</url-pattern>
  8. </servlet-mapping>
  9. <listener>
  10. <listener-class>com.example.listener.DogSessionAttributeListener</listener-class>
  11. </listener>
  1. Attribute added: label: label0

然后连续三次刷新,后台依次打印:

  1. Attribute replaced: label: label0
  2. Attribute replaced: label: label1
  3. Attribute replaced: label: label2

注意,event.getName()和event.getValue()都是获取该事件之前的session属性的值。

统计全局活动的对话

使用HttpSessionListener进行全局活动会话的统计,类似统计在线人数功能。

  • 建立全局活动会话监听器
  1. package com.example.listener;
  2. import javax.servlet.http.HttpSessionEvent;
  3. import javax.servlet.http.HttpSessionListener;
  4. /**
  5. * Created by LTN on 2016/11/2.
  6. */
  7. public class GlobalCounterListener implements HttpSessionListener {
  8. static private int activeSessions;
  9. public static int getActiveSessions() {
  10. return activeSessions;
  11. }
  12. public void sessionCreated(HttpSessionEvent event) {
  13. activeSessions++;
  14. }
  15. public void sessionDestroyed(HttpSessionEvent event) {
  16. activeSessions--;
  17. }
  18. }
  • 建立servlet测试类GlobalCounterTester.java
  1. package com.example.servlet;
  2. import com.example.listener.GlobalCounterListener;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import javax.servlet.http.HttpSession;
  8. import java.io.IOException;
  9. import java.io.PrintWriter;
  10. /**
  11. * Created by LTN on 2016/11/2.
  12. */
  13. public class GlobalCounterTester extends HttpServlet {
  14. public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
  15. PrintWriter out = response.getWriter();
  16. HttpSession session = request.getSession();
  17. session.setAttribute("name","counter");
  18. String name=(String)session.getAttribute("name");
  19. int activeSessions= GlobalCounterListener.getActiveSessions();
  20. out.println("name: "+name);
  21. out.println("activeSessions: "+activeSessions);
  22. }
  23. }
  • 在DD中配置servlet和listener
  1. <servlet>
  2. <servlet-name>SessionCounterTester</servlet-name>
  3. <servlet-class>com.example.servlet.GlobalCounterTester</servlet-class>
  4. </servlet>
  5. <servlet-mapping>
  6. <servlet-name>SessionCounterTester</servlet-name>
  7. <url-pattern>/CounterTest.do</url-pattern>
  8. </servlet-mapping>
  9. <listener>
  10. <listener-class>com.example.listener.GlobalCounterListener</listener-class>
  11. </listener>
  1. name: counter
  2. activeSessions: 1

换一个浏览器,输入地址,会显示activeSessions数值递增。

注意,同一个浏览器开新标签不能使得session个数增加;关闭当前浏览器再接着启动,也不能。

属性绑定监听器

当属性对象被加入session或从session删除使,对象本身可以知道。

  • 建立Session binding监听器Dog.java,该类继承了HttpSessionBindingListener,并实现valueBound和valueUnbound方法。
  1. package com.example.entities;
  2. import javax.servlet.http.HttpSessionBindingEvent;
  3. import javax.servlet.http.HttpSessionBindingListener;
  4. /**
  5. * Created by LTN on 2016/11/2.
  6. */
  7. public class Dog implements HttpSessionBindingListener {
  8. private String breed;
  9. public Dog(String breed) {
  10. this.breed = breed;
  11. }
  12. public String getBreed() {
  13. return breed;
  14. }
  15. public void valueBound(HttpSessionBindingEvent event) {
  16. System.out.println("I am a dog, i know i am in a conversation now.");
  17. }
  18. public void valueUnbound(HttpSessionBindingEvent event) {
  19. System.out.println("I am a dog, i know i am leaving a conversation now.");
  20. }
  21. }
  • 建立servlet测试类EntityBindingTester.java
  1. package com.example.servlet;
  2. import com.example.entities.Dog;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import javax.servlet.http.HttpSession;
  8. import java.io.IOException;
  9. /**
  10. * Created by LTN on 2016/11/2.
  11. */
  12. public class EntityBindingTester extends HttpServlet {
  13. public void doGet(HttpServletRequest request, HttpServletResponse response)throws IOException,ServletException {
  14. Dog dog = (Dog) getServletContext().getAttribute("dog");
  15. HttpSession session = request.getSession();
  16. session.setAttribute("dog-binding",dog);
  17. session.invalidate();
  18. }
  19. }
  • 在DD中配置servlet,注意,属性Dog不用/能在DD中配置
  1. <servlet>
  2. <servlet-name>ObjectBindingTester</servlet-name>
  3. <servlet-class>com.example.servlet.EntityBindingTester</servlet-class>
  4. </servlet>
  5. <servlet-mapping>
  6. <servlet-name>ObjectBindingTester</servlet-name>
  7. <url-pattern>/ObjectBindingTest.do</url-pattern>
  8. </servlet-mapping>
  1. I am a dog, i know i am in a conversation now.
  2. Attribute added: dog-binding: com.example.entities.Dog@6dbba86e
  3. I am a dog, i know i am leaving a conversation now.
  4. Attribute removed: dog-binding: com.example.entities.Dog@6dbba86e

附件列表

《Head First Servlets & JSP》-6-会话管理-listener etc. demo的更多相关文章

  1. [Servlet&amp;JSP] HttpSession会话管理

    我们能够将会话期间必须共享的资料保存在HttpSession中,使之成为属性.假设用户关掉浏览器接受Cookie的功能.HttpSession也能够改用URL重写的方式继续其会话管理功能. HttpS ...

  2. HeadFirst Jsp 06 (会话管理)

    现在我们希望能够跨多个请求保留客户特定的状态. 现在, 模型中的业务只是检查请求中的参数, 并返回一个响应(建议), 应用中没有谁记得在当前请求之前与这个客户之间发生过什么. 与一个客户的整个会话期间 ...

  3. 我的Java之旅 第七课 JAVA WEB 会话管理

    1.隐藏域       隐藏域其实不是Servlet/JSP的会话管理机制的内容,但它能实现简单的页面状态记录的效果. 2.Cookie    Cookie类    setMaxAge() 设置有效期 ...

  4. 10、会话管理/编程实战分析/Jsp

    1 会话管理回顾 会话管理 1)会话管理: 管理浏览器和服务器之间的会话过程中产生的会话数据 2)Cookie技术: 会话数据保存在浏览器客户端. Cookie核心的API: 2.1 在服务器端创建C ...

  5. 【JSP&Servlet学习笔记】4.会话管理

    Http本身是无状态通信协议,要进行会话管理的基本原理,就是将需要维护的状态回应给浏览器,由浏览器在下次请求时主动发送状态信息,让Web应用程序“得知”请求之间的关联. 隐藏字段是将状态信息以窗体中看 ...

  6. jsp/servlet学习三之会话管理初解

    由于http的无状态性,使得会话管理或会话跟踪成为web应用开发一个无可避免的主题.默认下,一个web服务器无法区分一个http请求是否为第一次访问.例如,一个web邮件应用要求用户登陆后才能查看邮件 ...

  7. shiro会话管理

    Shiro提供了完整的企业级会话管理功能,不依赖于底层容器(如web容器tomcat),不管JavaSE还是JavaEE环境都可以使用,提供了会话管理.会话事件监听.会话存储/持久化.容器无关的集群. ...

  8. 第十章 会话管理——《跟我学Shiro》

    转发地址:https://www.iteye.com/blog/jinnianshilongnian-2028675 目录贴:跟我学Shiro目录贴 Shiro提供了完整的企业级会话管理功能,不依赖于 ...

  9. Java中的会话管理——HttpServlet,Cookies,URL Rewriting(译)

    参考谷歌翻译,关键字直接使用英文,原文地址:http://www.journaldev.com/1907/java-session-management-servlet-httpsession-url ...

随机推荐

  1. swing之复杂登陆界面的实现

    package jiemian; import gonggong.message; import gonggong.messageType; import gonggong.user; import ...

  2. 《Orange’s 一个操作系统的实现》1.搭建操作系统开发环境

    书中给出了两种环境:windows和linux,平台选择根据自己喜好.本人这里选择ubuntu10.04+virtualbox作为开发平台. 1.下载.安装VirtualBox     http:// ...

  3. Sqoop--Free-form Query Imports 自由查询模式下$CONDITIONS关键字的作用

    Scoop是用来实现HDFS文件系统和关系型数据库如MySQL之间数据传输和转换的工具. 从MySQL导出到HDFS可以通过--table, --columns and --where等设置数据抽出的 ...

  4. tyvj 2054 [Nescafé29]四叶草魔杖——最小生成树+状压dp

    题目:http://www.joyoi.cn/problem/tyvj-2054 枚举点集,如果其和为0,则作为一个独立的块求一下最小生成树.因为它可以不和别的块连边. 然后状压dp即可. 别忘了判断 ...

  5. VirtualBox为虚拟OS硬盘扩容

    1.关闭虚拟OS. 2.进入到在VirtualBox的安装路径,执行命令例子如: VBoxManage.exe modifyhd F:\VM\Debian7.2.vdi --resize 40000 ...

  6. 【转】 Pro Android学习笔记(八六):了解Package(5):使用lib

    目录(?)[-] 在项目中使用lib 源代码 了解一些机制 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowin ...

  7. PostgreSQL 9.5 高可用、负载均衡和复制

    高可用.负载均衡和复制 1. 不同方案的比较 共享磁盘故障转移 共享磁盘故障转移避免了只使用一份数据库拷贝带来的同步开销. 它使用一个由多个服务器共享的单一磁盘阵列.文件系统(块设备)复制 DRBD是 ...

  8. 如何将DevExpress的Gridcontrol导出到Excel

    private void simpleButton1_Click(object sender, EventArgs e) { SaveFileDialog saveFileDialog = new S ...

  9. CentOS 配置XWIN/VNC

    Xwin服务器 CentOS上运维Xwin,在这之前需要理清一些关系: 一,  X window 包括xserver 和x client.linux下的xserver 主要有xorg.xfree86, ...

  10. Oracle Management Packs

    http://kerryosborne.oracle-guy.com/2008/10/oracle-management-packs/ There has been quite a bit of co ...