JavaWeb的三大组件的一些细节

发布时间:2026/7/26 13:05:15

JavaWeb的三大组件的一些细节 JavaWeb是一切框架的基础对这里做一篇笔记只记录一些细节方便大家回忆和理解。JavaWeb有三大组件分别是Servlet,Filter,ListenerServlet用于处理用户发来的请求返回后端服务器的响应。Filter是过滤器功能很多我们常用的就是用作拦截用户请求校验身份解决中文字符的一些乱码问题。Listener是监听器通常在网页中我们可以进行在线人数的统计等功能。下面我们简单的做一下这几个的代码练习。一、Servlet本质运行在服务器端的 Java 类用于接收 / 处理 HTTP 请求返回响应一次请求对应一个 Servlet 实例多线程共享。核心生命周期init()初始化仅执行 1 次→service()处理请求每次请求执行→destroy()销毁服务器关闭时执行。关键注解WebServlet(/路径)替代 web.xml 配置Servlet3.0 支持。核心对象HttpServletRequest封装请求数据参数、头信息、域数据HttpServletResponse封装响应数据返回内容、状态码、重定向 / 转发。import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; // 访问路径http://localhost:8080/项目名/demoServlet WebServlet(/demoServlet) public class DemoServlet extends HttpServlet { // 初始化仅执行1次 Override public void init() throws ServletException { System.out.println(Servlet 初始化); } // 处理 GET 请求 Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 解决响应乱码 resp.setContentType(text/html;charsetUTF-8); PrintWriter out resp.getWriter(); // 获取请求参数 String name req.getParameter(name); out.write(h3Servlet 响应结果/h3); out.write(接收参数 (name null ? 无 : name) br); out.write(请求方式 req.getMethod()); } // 处理 POST 请求复用 GET 逻辑 Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 解决 POST 请求参数乱码 req.setCharacterEncoding(UTF-8); doGet(req, resp); } // 销毁服务器关闭时执行 Override public void destroy() { System.out.println(Servlet 销毁); } }二、Filter过滤器本质拦截请求 / 响应可对请求做预处理如编码、登录校验对响应做后处理。执行顺序可配置多个 Filter按WebFilter的order属性排序值越小越先执行。核心方法doFilter()核心拦截逻辑必须调用chain.doFilter()放行否则请求终止。常见场景登录校验、统一编码处理、敏感词过滤。import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; // 拦截所有请求/*order 越小优先级越高 WebFilter(urlPatterns /*, filterName LoginFilter, dispatcherTypes DispatcherType.REQUEST) public class LoginFilter implements Filter { Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println(过滤器初始化); } Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 强转为 HTTP 类型处理 Web 请求 HttpServletRequest req (HttpServletRequest) request; HttpServletResponse resp (HttpServletResponse) response; // 1. 统一编码处理 req.setCharacterEncoding(UTF-8); resp.setContentType(text/html;charsetUTF-8); // 2. 登录校验排除登录页 String uri req.getRequestURI(); if (!uri.contains(login) req.getSession().getAttribute(user) null) { // 未登录重定向到登录页 resp.sendRedirect(/项目名/login.html); return; // 终止请求 } // 3. 放行请求必须调用否则请求无法到达 Servlet chain.doFilter(request, response); // 4. 响应后处理放行后执行 System.out.println(请求已处理响应返回中); } Override public void destroy() { System.out.println(过滤器销毁); } }三、Listener监听器核心细节本质监听 Web 容器中对象的创建 / 销毁、属性变化触发对应逻辑。常用监听器类型ServletContextListener监听应用启动 / 销毁全局初始化数据HttpSessionListener监听会话Session创建 / 销毁统计在线人数ServletRequestListener监听请求创建 / 销毁。核心特点被动触发无需主动调用由容器自动执行。import javax.servlet.annotation.WebListener; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; import javax.servlet.http.HttpSession; // 监听 Session 创建/销毁 WebListener public class OnlineCountListener implements HttpSessionListener { // 在线人数全局变量ServletContext 存储更安全 private int onlineCount 0; // Session 创建用户首次访问创建会话 Override public void sessionCreated(HttpSessionEvent se) { onlineCount; HttpSession session se.getSession(); // 存入应用域全局共享 session.getServletContext().setAttribute(onlineCount, onlineCount); System.out.println(新用户上线当前在线 onlineCount); } // Session 销毁超时/手动销毁 Override public void sessionDestroyed(HttpSessionEvent se) { if (onlineCount 0) onlineCount--; HttpSession session se.getSession(); session.getServletContext().setAttribute(onlineCount, onlineCount); System.out.println(用户下线当前在线 onlineCount); } }细节总结Servlet核心是处理请求生命周期由容器管理service()方法处理每次请求需注意请求 / 响应的编码问题Filter核心是拦截必须调用chain.doFilter()放行常用于登录校验、统一编码支持多过滤器排序Listener核心是监听事件对象创建 / 销毁、属性变化被动触发HttpSessionListener是统计在线人数的核心实现方式。

相关新闻