Jakarta EE 实验 — Web 聊天室(过滤器、监听器版)进阶
Jakarta EE 实验 — Web 聊天室(过滤器、监听器版)进阶
- 使用JSP表单:在JSP页面(如login.jsp和chat.jsp)中使用
<form>
标签提交数据(POST方法),恢复传统表单提交方式。这符合实验要求的功能(如登录和消息发送),并避免了之前版本的JavaScript fetch。 - 不用在web.xml中mapping:所有Servlet的URL映射从web.xml移除,使用
@WebServlet
注解直接写在Servlet类的上方。 - 注解写在servlet类的上方:每个Servlet类上方添加
@WebServlet
注解,指定URL模式(e.g.,@WebServlet("/login")
)。
-
过滤器扩展:- 在EncodingFilter中添加日志记录(记录请求URL、方法和时间)和简单性能监控(测量Filter处理时间,并日志记录如果超过阈值)。
- 动态维护敏感词表:从web.xml的<init-param>读取敏感词列表(配置化),允许动态修改而不改代码。如果需要从数据库读取,可扩展为在init()方法中查询数据库(代码中添加注释说明)。
- 监听器扩展:
- 添加ServletContextAttributeListener监听Application(ServletContext)属性变化,实现细粒度状态管理(e.g., 日志记录属性添加/替换/移除)。
- 添加HttpSessionAttributeListener监听Session属性变化,当"username"属性被修改时(e.g., 用户更换用户名),自动更新在线用户列表(移除旧名,添加新名)。
一、扩展原则:
- 保持原有实验结构,仅添加扩展功能。
- 提供完整的、更新后的代码(包括pom.xml、web.xml、JSP、Filter、Listener和Servlet)。
- 在代码中添加详细注释,解释扩展点、关键知识(如Filter/Listener的工作原理、扩展功能)和思考。
- 项目仍使用Maven + Tomcat运行。测试时,可修改web.xml中的init-param测试动态敏感词。
二、回答思考与扩展(总结):
-
过滤器扩展:
- 额外功能:日志记录(e.g., 请求细节)和性能监控(e.g., 时间测量)是Filter的典型扩展,可用于调试和优化。压缩响应(e.g., GZIP)可通过包装响应实现,但代码中未添加以保持简单。
- 动态维护敏感词表:通过web.xml <init-param>配置(代码中实现),或从数据库读取(init()中添加JDBC查询,注释说明)。这使敏感词可配置化,提高灵活性。
-
监听器扩展:
- 监听Application/Request属性变化:使用ServletContextAttributeListener监听全局属性(代码中实现,日志变化);ServletRequestAttributeListener可类似监听请求属性,实现细粒度管理(如实时监控共享数据变化)。
- 结合HttpSessionAttributeListener:当Session属性(如"username")变化时,自动更新在线用户列表(代码中实现)。这处理用户修改资料场景,确保列表一致性。
现在,提供完整的、更新后的代码。变化点用注释突出。
三、实验步骤
步骤1: 创建Jakarta EE项目
(同原步骤,无变化)打开IntelliJ IDEA 2025.2,选择“Java Enterprise”(Jakarta EE),使用Maven构建,添加Tomcat服务器。项目名称如“ChatRoomWithFiltersListeners”。
步骤2: 配置pom.xml(添加Jakarta EE依赖)
(同原代码,无变化)完整pom.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>chatroom-with-filters-listeners</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target></properties><dependencies><!-- Jakarta EE API (includes Servlet, Filter, Listener, JSP) --><dependency><groupId>jakarta.platform</groupId><artifactId>jakarta.jakartaee-api</artifactId><version>10.0.0</version><scope>provided</scope></dependency></dependencies><build><plugins><!-- Tomcat Maven Plugin for running the app --><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><configuration><port>8080</port><path>/</path></configuration></plugin></plugins></build>
</project>
代码解释(详细注释):
- // 这个pom.xml定义了Jakarta EE依赖,用于Servlet、Filter、Listener等。scope=provided表示运行时由Tomcat提供实现。
- // Tomcat插件用于快速运行项目。无变化,因为约束不影响依赖。
步骤3: 配置web.xml(移除mapping,添加Filter init-param和扩展Listener)
web.xml中移除所有Servlet相关的<servlet>
和<servlet-mapping>
(按约束)。为EncodingFilter添加<init-param>用于动态敏感词。添加扩展Listener声明。完整web.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"version="5.0"><!-- Listener 配置:原有 + 扩展(属性变化监听) --><listener><listener-class>com.example.listener.AppInitListener</listener-class></listener><listener><listener-class>com.example.listener.SessionLifecycleListener</listener-class></listener><!-- 扩展:监听Application属性变化 -->