Web容器管理Servlet/JSP相关的生命周期,若对HttpServletRequest对象、HttpSession对象、ServletContxt对象在生成、销毁或相关属性设置发生的时机点有兴趣,可以实现对应的监听器(Listener)。

一、ServletContext事件、监听器

与ServletContext相关的监听器有两个,ServletContextListener、ServletContextAttributeListener

1、ServletContextListener

它是生命周期监听器,如果想要知道何时web应用程序已经初始化或者即将结束销毁,可以实现该监听器。

例如,可以实现ServletContextListener,在此应用程序初始过程中,准备好数据库连接线对象、读取应用程序设置等动作,如放置使用头像的目录信息,就不适合将目录名称写死,这时候可以这么做:

  1. package cc.openhome;
  2. import javax.servlet.*;
  3. @WebListener //使用@weblistener标注
  4. public class ContextParameterReader implements ServletContextListener{
  5. public void contextInitialized(ServletContextEvent e){
  6. ServletContext context = sce.getServletContext();//取得ServletContext
  7. String avatars = context.getInitParameter("AVATAR");//取得初始参数
  8. context.setAttribute("avatars",avatars);//设置ServletContext属性
  9. }
  10. public void contextDestroyed(ServletContextEvent sce){}
  11. }

  整个web应用程序生命周期,Servlet共享的资料可以设置为ServletContext属性。这些属性数据会一直存在于web应用程序中。可以通过setAttribute()方法设置对象为ServletContext属性,之后可通过ServletContext的getAttribute()方法取出该属性。如果移除属性,用removeAttribute()。

  1. package ServletAPI;
  2.  
  3. import java.io.IOException;
  4. import java.io.PrintWriter;
  5.  
  6. import javax.servlet.ServletException;
  7. import javax.servlet.annotation.WebInitParam;
  8. import javax.servlet.annotation.WebServlet;
  9. import javax.servlet.http.HttpServlet;
  10. import javax.servlet.http.HttpServletRequest;
  11. import javax.servlet.http.HttpServletResponse;
  12.  
  13. /**
  14. * Servlet implementation class Avatar
  15. */
  16. @WebServlet(
  17. urlPatterns = { "/avatar.view" },
  18. initParams = {
  19. @WebInitParam(name = "AVATAR_DIR", value = "/image")//根目录WebContent内部
  20. })
  21. public class Avatar extends HttpServlet {
  22. private static final long serialVersionUID = 1L;
  23. private String AVATAR_DIR;
  24. /**
  25. * @see HttpServlet#HttpServlet()
  26. */
  27. public Avatar() {
  28. super();
  29. // TODO Auto-generated constructor stub
  30. }
  31. public void init() throws ServletException{
  32. //AVATAR_DIR=getInitParameter("AVATAR_DIR");
  33. AVATAR_DIR=(String) getServletContext().getAttribute("avatars");
  34. }
  35.  
  36. /**
  37. * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
  38. */
  39. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  40. // TODO Auto-generated method stub
  41. response.setContentType("text/html;charset=UTF-8");
  42. PrintWriter out=response.getWriter();
  43. out.println("<!DOCTYPE html>");
  44. out.println("<html>");
  45. out.println("<head>");
  46. out.println("<meta content='text/html; charset=UTF-8' http-equiv='content-type'>");
  47. out.println("<title>头像显示</title>");
  48. out.println("</head>");
  49. out.println("<body>");
  50. for(String avatar:getServletContext().getResourcePaths(AVATAR_DIR)){//取得头像路径
  51. avatar=avatar.replaceFirst("/", "");
  52. out.println("<img src='"+avatar+"'>");
  53. }
  54. out.println("</body>");
  55. out.println("</html>");
  56. out.close();
  57. }
  58.  
  59. /**
  60. * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
  61. */
  62. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  63. // TODO Auto-generated method stub
  64. }
  65.  
  66. }

avatar.java

2、ServletContextAttributeListener

它是监听属性改变的监听器,如果想要对象被设置、移除或替换ServletContext属性,也可以收到通知以进行一些操作,可以实现该监听器。

当在ServletContext中添加属性、移除或者替换属性时,对应的attributeAdded()、attributeRemoved()、attributeReplaced()方法就会被调用。

二、HttpSession事件、监听器

与HttpSession相关的有四个监听器:HttpSessionListener、HttpSessionAttributeListener、HttpSessionBindingListener与HttpSessionActivationListener.

1、HttpSessionListener

它是生命周期监听器,如果想要在HttpSession对象创建或者结束时,做些相对应动作,可以实现该监听。

在HttpSession对象初始化或结束之前,会分别调用sessionCreated()、sessionDestroyed()方法,

可以通过传入的HttpSessionEvent,使用getSession()取得HttpSession,以针对会话对象做出相应操作。例如:除非用户注销,否则登录后的用户在另个浏览器上登录会显示登录失败。

如果用户不小心再注销前关闭了浏览器,那么数据库中代表登录与否的字段就不会被重置。为此,可是实现HttpSessionListener,由于HttpSession有存活期限,当容器销毁某个HttpSession时,就会调用sessionDestroyed(),就可以再当中判断要重置哪个用户的数据库中代表登录与否的字段。

例1:显示目前已经在线人数的统计。

  1. package ServletAPI;
  2.  
  3. import java.io.IOException;
  4. import java.io.PrintWriter;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.annotation.WebServlet;
  7. import javax.servlet.http.HttpServlet;
  8. import javax.servlet.http.HttpServletRequest;
  9. import javax.servlet.http.HttpServletResponse;
  10. import javax.servlet.http.HttpSession;
  11.  
  12. /**
  13. * Servlet implementation class Welcome
  14. */
  15. @WebServlet("/welcome.view")
  16. public class Welcome extends HttpServlet {
  17. private static final long serialVersionUID = 1L;
  18.  
  19. /**
  20. * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
  21. */
  22. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  23. // TODO Auto-generated method stub
  24. response.setContentType("text/html;charset=UTF-8");
  25. PrintWriter out=response.getWriter();
  26. HttpSession session=request.getSession(true);
  27. out.println("<html>");
  28. out.println("<head>");
  29. out.println("<title>欢迎</title>");
  30. out.println("</head>");
  31. out.println("<body>");
  32. out.println("<h1>目前在线人数"+OnlineUserCounter.getCounter()+"人</h1>");//获取在线人数
  33. if(session!=null){
  34. String user=(String) session.getAttribute("user");
  35. out.println("<h1>欢迎:"+user+"</h1>");
  36. out.println("<a href='logout.do'>注销</a>");
  37. }
  38. out.println("</body>");
  39. out.println("</html>");
  40. }
  41.  
  42. }

Welcome.java

  1. package ServletAPI;
  2.  
  3. import javax.servlet.annotation.WebListener;
  4.  
  5. import javax.servlet.http.HttpSessionEvent;
  6. import javax.servlet.http.HttpSessionListener;
  7.  
  8. /**
  9. * Application Lifecycle Listener implementation class OnlineUserCounter
  10. *
  11. */
  12. @WebListener()
  13. public class OnlineUserCounter implements HttpSessionListener {
  14. private static int counter;
  15.  
  16. public static int getCounter(){
  17. return counter;
  18. }
  19.  
  20. /**
  21. * @see HttpSessionListener#sessionCreated(HttpSessionEvent)
  22. */
  23. public void sessionCreated(HttpSessionEvent se) {
  24. // TODO Auto-generated method stub
  25. OnlineUserCounter.counter++;
  26. }
  27.  
  28. /**
  29. * @see HttpSessionListener#sessionDestroyed(HttpSessionEvent)
  30. */
  31. public void sessionDestroyed(HttpSessionEvent se) {
  32. // TODO Auto-generated method stub
  33. OnlineUserCounter.counter--;
  34. }
  35.  
  36. }

OnlineUserCounter.java

  1. package ServletAPI;
  2.  
  3. import java.io.IOException;
  4. import java.util.HashMap;
  5. import java.util.Map;
  6.  
  7. import javax.print.attribute.standard.PagesPerMinute;
  8. import javax.servlet.ServletException;
  9. import javax.servlet.annotation.WebServlet;
  10. import javax.servlet.http.HttpServlet;
  11. import javax.servlet.http.HttpServletRequest;
  12. import javax.servlet.http.HttpServletResponse;
  13.  
  14. import org.apache.catalina.User;
  15.  
  16. /**
  17. * Servlet implementation class loginlistener
  18. */
  19. @WebServlet("/listener.view")
  20. public class loginlistener extends HttpServlet {
  21. private static final long serialVersionUID = 1L;
  22. private Map<String, String> users;
  23. /**
  24. * @see HttpServlet#HttpServlet()
  25. */
  26. public loginlistener() {
  27. //super();
  28. users=new HashMap<String, String>();
  29. users.put("nihao", "nihaonihao");
  30. users.put("momor", "123456789");
  31. users.put("hamimi", "123456789");
  32. // TODO Auto-generated constructor stub
  33. }
  34.  
  35. /**
  36. * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
  37. */
  38. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  39. // TODO Auto-generated method stub
  40. String name=request.getParameter("user");
  41. String passwd=request.getParameter("passwd");
  42. String page="listenerlogin.html";
  43. if(users.containsKey(name) && users.get(name).equals(passwd)){
  44. User user=(User) new ServletAPI.User(name);
  45. request.getSession().setAttribute("user", user);
  46. page="welcome.view";
  47. }
  48. response.sendRedirect(page);
  49. }
  50.  
  51. }

login.java

  运行结果

2、HttpSessionAttributeListener

    它是属性改变监听器,用法同ServletContextAttributeListener一样。

3、HttpSessionBindingListener

它是对象绑定监听器,如果有个即将加HttpSessionBindingListener入HttpSession的属性对象,希望在设置给HttpSession成为属性或从HttpSession中删除时,可以收到HttpSession的通知,可以让该对象实现该监听器。

当实现此接口的属性对象被加入HttpSession或冲中移除,就会调用valueBound()与valueUnbound()方法,并传入HttpSessionBindingEvent对象,可以通过该对象的getSession()取得HttpSession对象。

4、HttpSessionActivationListener

对象迁移监听器,几乎不会用到。

三、HttpServletRequest事件、监听器

有三个相关的监听器:ServletRequestListener、ServletRequestAttributeListener、AsyncListener(这个在异步处理时会介绍到)。

Servlet 应用程序事件、监听器的更多相关文章

  1. 第六章 对象作用域与servlet事件监听器

          作用域对象 Servlet上下文监听器 Servlet会话监听器 Servlet请求监听器     一:对象作用域 作用域对象 属性操作方法 作用域范围说明 ServletContext( ...

  2. Servlet事件监听器

    监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行. 面试题:请描述一下java事件监听机 ...

  3. [原创]java WEB学习笔记48:其他的Servlet 监听器:域对象中属性的变更的事件监听器 (3 个),感知 Session 绑定的事件监听器(2个)

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  4. Java事件监听器的四种实现方式

    自身类作为事件监听器 外部类作为事件监听器 匿名内部类作为事件监听器 内部类作为事件监听器 自身类作为事件监听器: import javax.swing.*; import java.awt.*; i ...

  5. Java精选笔记_Servlet事件监听器

    Servlet事件监听器 概述 在程序开发中,经常需要对某些事件进行监听,如监听鼠标点击事件.监听键盘按下事件等,此时就需要使用事件监听器. 事件监听器用于对程序中发生的事件进行监听,在监听的过程中会 ...

  6. 域对象中属性变更及感知session绑定的事件监听器

    域对象中属性的变更的时间监听器就是用来监听ServletContext,HttpSession,HttpServletRequest这三个对象中的属性变更信息事件的监听器.这三个监听器接口分别是Ser ...

  7. Servlet,过滤器和监听器的配置和使用

    一.什么是Servlet Servlet使用Java语言实现的程序,运行于支持Java语言的Web服务器或者应用服务器中.Servlet先于JSP出现,提供和客户端动态交互的功能.Servlet可以处 ...

  8. EL&Filter&Listener:EL表达式和JSTL,Servlet规范中的过滤器,Servlet规范中的监听器,观察着设计模式,监听器的使用,综合案例学生管理系统

    EL&Filter&Listener-授课 1 EL表达式和JSTL 1.1 EL表达式 1.1.1 EL表达式介绍 *** EL(Expression Language):表达式语言 ...

  9. 面试之servlet、过滤器、监听器

    servlet.过滤器.监听器servlet是Java中WEB请求和响应的容器servlet的运行需要在类似tomcat容器中,一个 Web 应用对应一个 Context 容器,也就是 Servlet ...

随机推荐

  1. Permission denied: user=xxj, access=WRITE, inode="user":hadoop:supergroup:rwxr-xr-x

    在windows中运行eclipse时报错Permission denied: user=xxj, access=WRITE, inode="user":hadoop:superg ...

  2. 一道js题

    <script> var a = 5; function test(){ this.a = 10; a = 15 this.func = function(){ var a = 20 ; ...

  3. mrql初级教程-概念、使用(一)

    以下是本人原创,如若转载和使用请注明转载地址.本博客信息切勿用于商业,可以个人使用,若喜欢我的博客,请关注我,谢谢!博客地址 感谢您支持我的博客,我的动力是您的支持和关注!如若转载和使用请注明转载地址 ...

  4. [iOS]C语言知识点系列视频

    C语言知识点系列视频 目录 C语言技术视频-01-变量的定义 C语言技术视频-02-程序分支结构(if...else) C语言技术视频-03-程序分支结构(switch) C语言技术视频-04-程序循 ...

  5. WAV音频格式分析

    wav是windows下无损的声音文件,该文件保存了音频的PCM信息和播放器播放该音乐的时候的大多数信息,他有两个块组成,第一个块是格式块,第二个块是数据块 先说格式块,格式块用一张图可以解释,如下 ...

  6. iOS 旋转

    实现一张图片的旋转部分角度显示: [cpp] view plaincopy UIImageView image = [[UIImageView alloc]init]; image.frame = C ...

  7. tableView滑动到底部

    - (void)scrollToBottom { NSInteger sectionCount = [self.dataSource numberOfSectionsInTableView:self] ...

  8. 分析$.isPlainObject

    作者:zccst 本次学习$.isPlainObject,是不是一个普通对象.测试对象是否是纯粹的对象(通过 "{}" 或者 "new Object" 创建的) ...

  9. IOS开发中UITableView(表视图)的滚动优化及自定义Cell

    IOS开发中UITableView(表视图)的滚动优化及自定义Cell IOS 开发中UITableView是非常常用的一个控件,我们平时在手机上看到的联系人列表,微信好友列表等都是通过UITable ...

  10. limesurvey设置短调查问卷url

    If you want to use fancy URLs and so not have /index.php in every URL please edit /application/confi ...