Servlet 应用程序事件、监听器

  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     /**
38      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
39      */
40     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
41         // TODO Auto-generated method stub
42         response.setContentType("text/html;charset=UTF-8");
43         PrintWriter out=response.getWriter();
44         out.println("<!DOCTYPE html>");
45         out.println("<html>");
46         out.println("<head>");
47         out.println("<meta content='text/html; charset=UTF-8' http-equiv='content-type'>");
48         out.println("<title>头像显示</title>");
49         out.println("</head>");
50         out.println("<body>");
51         for(String avatar:getServletContext().getResourcePaths(AVATAR_DIR)){//取得头像路径
52             avatar=avatar.replaceFirst("/", "");
53             out.println("<img src='"+avatar+"'>");
54         }
55         out.println("</body>");
56         out.println("</html>");
57         out.close();
58     }
59 
60     /**
61      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
62      */
63     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
64         // TODO Auto-generated method stub
65     }
66 
67 }
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(这个在异步处理时会介绍到)。

 

转载于:https://www.cnblogs.com/liuzhongfeng/p/6107090.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/283353.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

巴川数据科学炼成记_智橡树智能英语好不好有哪些功能?提出的科学学习思想是什么?...

智橡树智能英语与真人老师英语教学的最大区别就是解决老师课堂上不擅长、学生课后难坚持的单词、听力、口语、阅读重复训练问题&#xff0c;是辅助老师课堂教学的最佳搭档&#xff01;智橡树智能英语基于人工智能及大数据技术&#xff0c;专注音标、单词、听力、阅读、语法、口…

vite解决警告: You are running the esm-bundler build of vue-i18n. It is recomme

(转载请删除括号里的内容) 解决方法&#xff1a;在vite.config.js加入以下代码 resolve: { alias: {vue-i18n: vue-i18n/dist/vue-i18n.cjs.js} }--------------------- 作者&#xff1a;BY_BC 来源&#xff1a;CSDN 原文&#xff1a;https://blog.csdn.net/BY_BC/article…

设计师要懂布局(一)

2019独角兽企业重金招聘Python工程师标准>>> 页面版式的好坏给了用户第一印象&#xff0c;好不好用&#xff0c;想不想看页面的内容&#xff0c;要不要收藏这个页面&#xff0c;在设计中都起到了决定性作用。 在互联网时代&#xff0c;我们接触最多的就是手机和电脑…

ES6入门之Symbol

ES5对象属性名都是字符串容易造成属性名的冲突。 eg:var a { name: lucy};a.name lili;这样就会重写属性 ES6引入了一种新的原始数据类型Symbol&#xff0c;表示独一无二的值。 重新复习下新知识&#xff1a;基本数据类型有6种&#xff1a;Undefined、Null、布尔值&#xff0…

mac safari无法连接服务器_宇航员乘坐SpaceX飞船返航中iPad上Safari出现“无法连接到网络”错误...

罗伯特贝恩肯(Robert Behnken)和道格拉斯赫尔利(Douglas Hurley)在完成轨道实验室任务后&#xff0c;于今天搭乘 SpaceX 公司的"Crew Dragon"飞船离开国际空间站&#xff0c;为他们历史性的国际空间站飞行画上句号。两名宇航员在位于美国德克萨斯州休斯顿和加利福尼亚…

Vue 大量数据展示卡顿解决方案(长列表优化)

需求分析&#xff08;长列表展示&#xff09; 页面某处需要渲染 1w 条数据&#xff0c;并需要滚动展示&#xff0c;这时如果直接把这些数据渲染到页面上&#xff0c;会导致系统内存大量被占用&#xff0c;导致页面卡顿或崩溃 我们都知道&#xff0c;每次 DOM 修改&#xff0c;浏…

Django-admin管理工具

admin组件使用 Django 提供了基于 web 的管理工具。 Django 自动管理工具是 django.contrib 的一部分。你可以在项目的 settings.py 中的 INSTALLED_APPS 看到它&#xff1a; # Application definitionINSTALLED_APPS [django.contrib.admin,django.contrib.auth,django.contr…

[转]mysql的sql优化工具

原标题&#xff1a;DBA的五款最佳SQL查询优化工具&#xff0c;收藏了 一般来说&#xff0c;SQL查询优化器分析给定查询的许多选项&#xff0c;预估每个选项的成本&#xff0c;最后选择成本最低的选项。如果查询优化器选择了错误的计划&#xff0c;则性能差异可能从几毫秒到几分…

.NET 7 中的 HttpResult 接口

.NET 7 中的 HttpResult 接口Intro在前面的文章中&#xff0c;我们提到了 .NET 7 引入了 Endpoint Filter 来支持 Endpoint 的过滤器&#xff0c;有了这个接口就想着把之前的统一 API response 的 filter 改造一下支持 endpoint filter&#xff0c;然而这个一直等到了 .NET 7 P…

5、Hive的自定义UDF函数

2019独角兽企业重金招聘Python工程师标准>>> 1、pom.xml引入依赖及打包 <dependencies><dependency><groupId>org.apache.hive</groupId><artifactId>hive-exec</artifactId><version>1.1.0</version></depende…

多线程-单生产单消费模型

2019独角兽企业重金招聘Python工程师标准>>> 创建资源对象&#xff0c;提供保存和取出方法&#xff08;使用synchronized代码块实现&#xff09; /*** Created by shaoqinghua on 2018/5/3.* 定义一个负责保存和取出的资源类*/ public class Resource {/*** 定义成员…

github1s 油猴插件

github1s 是一个非常有趣的项目&#xff0c;它可以让你在 1 秒内&#xff08;俗称 1s&#xff09;通过在线版本的 VS Code 来打开 GitHub 上的代码&#xff0c;只需要在对应项目的 URL 后面加上 1s 即可。 这是一个很有创意、很赞的项目&#xff0c;只需要在对应的 GitHub 项目…

WPF-02 布局

WPF中布局控件继承Panel&#xff0c;可以实现非常复杂的布局。我们介绍一下常用的布局控件1. Grid 布局控件Grid是网格布局控件&#xff0c;在WPF开发中我们用的最多的一个布局控件&#xff0c;可以自定义行和列&#xff0c;分别设置Height和Witdh值&#xff0c;一般推荐通过比…

微信多开工具 可以同时在电脑上打开多个微信 免费开源

本程序用C#代码编写&#xff0c;运行环境FrameWork5.0以上。 主要代码&#xff1a; using Microsoft.Win32; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using Sys…

Linux 第十周学习笔记(2)smtp服务的部署

SMTP服务的部署介绍&#xff1a;SMTP(Simple Mail Transfer Protocol)简单邮件传输协议是一种提供可靠且有效电子邮件传输的协议。 SMTP 是建模在 FTP 文件传输服务上的一种邮件服务&#xff0c;主要用于传输系统之间的邮件信息并提供来信有关的通知。一&#xff0e;环境的部署…

关于CTeX的几个大坑

https://blog.csdn.net/zjutczj/article/details/53463478 最近一直忙着写小论文&#xff0c;毕业设计中期答辩&#xff0c;没有更新博客&#xff0c;忙过这一阵我会把这段时间学习机器学习的一些心得分享。今天分享几个刚刚使用CTeX遇到的大坑&#xff0c;希望能挽救一些还没有…

西安电子地图下载 来自谷歌电子地图库 地图展示15、17、19级

西安电子地图下载 来自谷歌电子地图库 地图展示15、17、19级 一般来说商业用图几乎相同就是17级左右&#xff0c;提供的下载全然满足大多数人浏览使用&#xff0c;假设用于旅行外出当然级数越高越好&#xff0c;假设是驴行&#xff0c;那就更有必要下载完整的地图以作不时之需。…

​Magicodes.Pay已支持Volo Abp

简介Magicodes.Pay希望打造一个统一支付库&#xff0c;相关库均使用.NET标准库编写&#xff0c;支持.NET Framework以及.NET Core。目前已提供Abp及Abp VNext模块的封装&#xff0c;支持开箱即用。主要功能目前已提供Abp&#xff08;含Abp VNext&#xff09;模块的封装&#xf…

vscode 头文件包含问题_WSL+VSCode = Linux ?

官方文档​code.visualstudio.com使用VSCode新推出的Remote功能来连接WSL或服务器进行开发. 可以在Windows上享受优秀的界面体验的同时使用Linux环境进行开发(还是要感谢无数的VSCode插件贡献者).环境基础配置Visual Studio Code最新版本注意点: 安装时需要勾选环境变量添加到p…

PerfView专题 (第十篇):洞察 C# 终结队列引发的内存泄漏

一&#xff1a;背景 C# 程序内存泄漏的诱发因素有很多&#xff0c;但从顶层原理上来说&#xff0c;就是该销毁的 用户根 对象没有被销毁&#xff0c;从而导致内存中意料之外的对象无限堆积&#xff0c;导致内存暴涨&#xff0c;最终崩溃&#xff0c;这其中的一个用户根就是 终结…