Java Web实战 | 设计一个监听器

简介: 在Web应用程序设计中,经常需要对某些事件进行监听,以便及时做出处理。对于桌面应用程序而言,鼠标单击或双击、键盘上的键被按下等都是事件。类似地,对于Web应用程序来说,session对象的创建、请求域中某个属性的移除等都是事件。为此,Servlet规范提供了监听器(Listener),专门用于监听Servlet事件。监听器技术涉及几个重要的概念,分别如下。

640.jpg


在Web应用程序设计中,经常需要对某些事件进行监听,以便及时做出处理。对于桌面应用程序而言,鼠标单击或双击、键盘上的键被按下等都是事件。类似地,对于Web应用程序来说,session对象的创建、请求域中某个属性的移除等都是事件。为此,Servlet规范提供了监听器(Listener),专门用于监听Servlet事件。监听器技术涉及几个重要的概念,分别如下。

(1) 事件:对于Web应用程序而言,ServletContext对象、HttpSession对象和ServletRequest对象的状态改变可称为Servlet事件。如HttpSession对象的创建,ServletRequest对象中属性的增加或移除都是事件。

(2) 监听器:负责监听事件是否发生。它是一个实现了一个或多个Servlet事件监听接口的类。它在Web应用程序部署时被注册到Web容器中并被实例化。

(3) 事件处理器: 监听器的方法。当事件发生的时候,监听器会监听到事件的发生,并触发相应的处理器用以处理事件。

01、监听器应用案例

设计一个监听器一般需要如下步骤。

(1) 实现合适的接口:监听器需要根据监听对象的不同,实现表5-5中的某个监听接口。

(2) 设计事件处理器:根据所选择的监听器接口,实现该接口中的相关方法。

(3) 配置监听器:既可以在部署描述文件web.xml文件中配置,又可以利用注解@WebListener完成监听器配置。

(4) 提供任何需要的初始化参数。
【例1】设计监听器,监听ServletContext、HttpSession和ServletRequest域对象的生命周期事件。

为实现这个目标,就要设计监听器类来实现针对这些域对象的监听器接口。可以设计一个类,来实现3个接口,从而使这个类具有针对3个域对象的事件监听的功能。监听器MyListener代码如文件1所示。
【文件1】MyListener.java

package com.example.listener;
//import 部分此处略
@WebListener
public class MyListener implements ServletContextListener,HttpSessionListener,ServletRequestListener{
public void contextInitialized(ServletContextEvent sce){
System.out.println("ServletContext 对象被创建");
}
public void contextDestroyed(ServletContextEvent sce){system.out.println("ServletContext 对象被销毁");}
public void sessionCreated(HttpSessionEvent se) {System.out.println("HttpSession 对象被创建");
public void sessionDestroyed(HttpSessionEvent se) {System.out.println("HttpSession 对象被销毁");
public void requestInitialized(ServletRequestEvent sre)System.out.println("ServletRequest 对象被创建");
public void requestDestroyed(ServletRequestEvent sre)System.out.println("ServletRequest 对象被销毁”)

文件1中,@WebListener的作用是配置监听器(第4行)。ServletContext对象与当前的Web应用程序对应。因为已在Tomcat服务器上部署了chapter5项目,当服务器启动时,Tomcat服务器会自动加载chapter5项目,并创建与其对应的ServletContext对象。由于chapter5项目中配置了MyListener监听器,并且该监听器实现了ServletContextListener接口,当Tomcat创建ServletContext对象时就会调用MyListener类的contextInitialized()方法作为事件处理器,输出“ServletContext对象被创建”这行信息(第7~9行)。要观察ServletContext对象的销毁信息,可以将Tomcat服务器关闭。Tomcat服务器关闭前,会销毁ServletContext对象,同时contextDestroyed()方法被调用(第10~12行),在控制台可见ServletContext对象被销毁的信息,如图1所示。

640.png


■ 图1 ServletContext对象的创建和销毁

为了查看HttpSessionListener和ServletRequestListener的运行效果,可以在chapter5项目中编写一个名为listener.jsp的文件,内容如文件2所示。
【文件2】listener.jsp

< html >
 <body>
  This is listener
 </body>
</html>

为了尽快看到HttpSession对象的创建和销毁过程,可以在项目的web.xml文件中设置session的超时时间为1min,内容如下:

< session - config >
< session - timeout > 1 </session - timeout >
</session- config>

启动Tomcat服务器,在浏览器的地址栏输入“http://localhost:8080/chapter5/listener.jsp”, 观察控制台输出。当浏览器第一次访问项目中的动态资源(JSP、Servlet)时,会创建HttpSession对象,Tomcat服务器会调用监听器的sessionCreated()方法作为创建HttpSession对象事件的事件处理器(第13~15行)。并且,由于浏览器发送请求,会自动创建HttpServletRequest对象,Tomcat服务器会调用requestInitialized()方法作为创建请求对象事件的处理器(第19~21行)。当listener.jsp对该请求做出响应后,请求随即被销毁,控制台就会输出“ServletRequest对象被销毁”的消息(第22~24行),如图2所示。

640.png


■ 图2 控制台输出

如果关闭访问listener.jsp文件的浏览器页面或保持浏览器不刷新。与之对应的HttpSession对象会在1min后被销毁。控制台显示结果如图2所示。

目录
相关文章
|
1月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
1月前
|
安全 Java 开发者
告别NullPointerException:Java Optional实战指南
告别NullPointerException:Java Optional实战指南
242 119
|
2月前
|
人工智能 Java API
Java AI智能体实战:使用LangChain4j构建能使用工具的AI助手
随着AI技术的发展,AI智能体(Agent)能够通过使用工具来执行复杂任务,从而大幅扩展其能力边界。本文介绍如何在Java中使用LangChain4j框架构建一个能够使用外部工具的AI智能体。我们将通过一个具体示例——一个能获取天气信息和执行数学计算的AI助手,详细讲解如何定义工具、创建智能体并处理执行流程。本文包含完整的代码示例和架构说明,帮助Java开发者快速上手AI智能体的开发。
990 8
|
2月前
|
人工智能 Java API
Java与大模型集成实战:构建智能Java应用的新范式
随着大型语言模型(LLM)的API化,将其强大的自然语言处理能力集成到现有Java应用中已成为提升应用智能水平的关键路径。本文旨在为Java开发者提供一份实用的集成指南。我们将深入探讨如何使用Spring Boot 3框架,通过HTTP客户端与OpenAI GPT(或兼容API)进行高效、安全的交互。内容涵盖项目依赖配置、异步非阻塞的API调用、请求与响应的结构化处理、异常管理以及一些面向生产环境的最佳实践,并附带完整的代码示例,助您快速将AI能力融入Java生态。
463 12
|
2月前
|
Java 开发者
Java并发编程:CountDownLatch实战解析
Java并发编程:CountDownLatch实战解析
437 100
|
2月前
|
存储 前端开发 Java
【JAVA】Java 项目实战之 Java Web 在线商城项目开发实战指南
本文介绍基于Java Web的在线商城技术方案与实现,涵盖三层架构设计、MySQL数据库建模及核心功能开发。通过Spring MVC + MyBatis + Thymeleaf实现商品展示、购物车等模块,提供完整代码示例,助力掌握Java Web项目实战技能。(238字)
323 0
|
2月前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
362 1
|
2月前
|
存储 JavaScript 安全
Web渗透-XSS漏洞深入及xss-labs靶场实战
XSS(跨站脚本攻击)是常见的Web安全漏洞,通过在网页中注入恶意脚本,窃取用户信息或执行非法操作。本文介绍其原理、分类(反射型、存储型、DOM型)、测试方法及xss-labs靶场实战案例,帮助理解与防御XSS攻击。
808 1
Web渗透-XSS漏洞深入及xss-labs靶场实战
|
2月前
|
安全 Linux PHP
Web渗透-命令执行漏洞-及常见靶场检测实战
命令执行漏洞(RCE)指应用程序调用系统命令时,用户可控制输入参数,导致恶意命令被拼接执行,从而危害系统安全。常见于PHP的system、exec等函数。攻击者可通过命令连接符在目标系统上执行任意命令,造成数据泄露或服务瘫痪。漏洞成因包括代码层过滤不严、第三方组件缺陷等。可通过参数过滤、最小权限运行等方式防御。本文还介绍了绕过方式、靶场测试及复现过程。
903 0
|
3月前
|
数据采集 JSON Java
Java爬虫获取1688店铺所有商品接口数据实战指南
本文介绍如何使用Java爬虫技术高效获取1688店铺商品信息,涵盖环境搭建、API调用、签名生成及数据抓取全流程,并附完整代码示例,助力市场分析与选品决策。
下一篇
oss云网关配置