Servlet三大组件以及请求与响应

发布时间:2026/6/18 19:14:41

Servlet三大组件以及请求与响应 JavaWeb开发的核心是请求处理、资源过滤、事件监听以及数据交互那么Servlet、Filter、Listener作为JavaWeb的三大组件同时配合上HttpServletRequest、HttpServletResponse进行请求响应对象就构成了JavaWeb开发的基础框架。接下来将详细梳理三大组件以及请求响应对象厘清 JavaWeb基础框架。一、JavaWeb 三大组件JavaWeb 的三大核心组件各司其职共同完成 Web 应用的请求处理和生命周期管理1.Servlet核心组件负责接收和处理客户端的HTTP请求是请求处理的核心2.Filter请求拦截组件在请求到达Servlet之前进行预处理在相应返回后进行后续处理3.Listener事件监听组件在JavaWeb被监听的事件源为ServletContext、HttpSession、ServletRequest即三大域对象二、Servlet:Web请求的核心处理器其本质是运行在Web服务器上的Java程序。2.1 Servlet的核心接口与生命周期Servlet 的核心是javax.servlet.Servlet接口该接口定义了 5 个核心方法其中init()、service()、destroy() 构成了 Servlet 的完整生命周期由 Tomcat 自动调用init(ServletConfig)Servlet 实例创建后立即调用一个Servlet实例只被创建一次因此init仅执行一次。service(ServletRequest, ServletResponse)每次请求都会调用。destroy()Tomcat 关闭或 Servlet 被销毁前调用仅执行一次用于释放资源。getServletConfig()用于获取配置对象即获取Web.xml文件中servlet的参数信息。getServletInfo()只是返回一个字符串用来说明当前Servlet。Servlet 生命周期总结容器创建实例 → 调用 init () 初始化 → 每次请求调用 service () → 容器销毁前调用 destroy () → JVM 垃圾回收。2.2快速创建Servlet2.2.1创建servlet的方法1.创建一个servlet的类让他继承Servlet2.创建一个servlet类让他继承HttpServlet3.直接创建servlet如图所示2.2.2 详细步骤在实际开发中通常继承HttpServlet只需重写doGet和doPost方法分别用来处理GET和POST请求。1.创建HttpServlet子类package cn.tx.servlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class HelloServlet extends HttpServlet { Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { response.getWriter().write(Hello Servlet!); } Override protected void doPost(HttpServletRequest request, HttpServletResponse response) { doGet(request, response); // POST请求复用GET处理逻辑 } }2.web.xml配置访问路径Servlet必须在web.xml中配置否则Tomcat将无法找到主要配置servlet和servlet-mappingweb-app xmlnshttp://xmlns.jcp.org/xml/ns/javaee version3.1 servlet servlet-namehello/servlet-name servlet-classcn.tx.servlet.HelloServlet/servlet-class /servlet servlet-mapping servlet-namehello/servlet-name url-pattern/hello/url-pattern /servlet-mapping /web-app3.Servlet的必要配置1提前加载Servlet默认情况下Servlet 在第一次被访问时由 Tomcat 创建若需要 Tomcat 启动时就创建可添加load-on-startup标签值为数字越小优先级越高其需配置在XML中servlet servlet-namehello/servlet-name servlet-classcn.tx.servlet.HelloServlet/servlet-class load-on-startup1/load-on-startup /servlet2ServletConfig获取 Servlet 局部配置ServletConfig对应 web.xml 中当前 Servlet 的配置信息可通过它获取初始化参数由 Tomcat 在Servlet的 init () 方法中传入!-- 配置初始化参数 -- servlet servlet-namehello/servlet-name servlet-classcn.tx.servlet.HelloServlet/servlet-class init-param param-nameusername/param-name param-valueroot/param-value /init-param /servlet// 在init()中获取参数 Override public void init(ServletConfig config) { String username config.getInitParameter(username); System.out.println(初始化参数 username); // 输出root }3ServletContext全局域对象代表当前 Web 应用所有 Servlet 共享一个实例服务器启动时创建关闭时销毁4URL 路径映射规则Servlet 的url-pattern支持三种映射方式优先级从高到低为完全路径匹配 目录匹配 扩展名匹配完全路径匹配以 / 开头如/hello、/user/login目录匹配以 / 开头且以 * 结尾如/user/*、/*扩展名匹配不能以 / 开头以 * 开头如*.do、*.action2.3 重要特性servlet的单例多线程每个servlet仅创建一个实例所有请求都有这个实例的service()方法处理因此线程不安全三、Filter请求的拦截与预处理Filter过滤器是 JavaWeb 三大组件之一本质是拦截请求的 Java 程序运行在请求到达 Servlet 之前、响应返回客户端之后不处理请求仅做预处理 / 后处理。3.1 Filter 的核心接口与生命周期Filter 的核心是javax.servlet.Filter接口定义了 3 个核心方法生命周期同样由 Tomcat 管理init(FilterConfig)服务器启动时创建 Filter 实例仅执行一次与Servlet类似doFilter(ServletRequest, ServletResponse, FilterChain)每次请求匹配时调用核心拦截方法通过FilterChain.doFilter()实现放行destroy()服务器关闭时调用仅执行一次用于释放资源。3.2快速创建FilterFilter和servlet的创建方法类似可以手动创建一个类让他继承Filter,或者自动创建如图3.2.1详细步骤1.实现Fliter接口三个方法public class MyFilter implements Filter{ Override public void init(FilterConfig filterConfig) throws ServletException { } Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println(Hello Filter!!!); } Override public void destroy() { } }2.web.xml配置Fliter:核心是filter和filter-mapping同时URL的映射同Servlet的URL映射规则。filter filter-namefirstFilter/filter-name filter-classcn.tx.filter.MyFilter/filter-class /filter filter-mapping filter-namefirstFilter/filter-name url-pattern/*/url-pattern /filter-mapping其中FilterConfigFilter接口中的init()方法的参数类型为FilterConfig类型。它的功能与ServletConfig相似与web.xml文件中的配置信息对应。下面是FilterConfig的功能介绍String getFilterName()获取Filter的配置名称与filter-name元素对应String getInitParameter(String name)获取Filter的初始化配置与init-param元素对应Enumeration getInitParameterNames()获取所有初始化参数的名称。filter filter-namefirstFilter/filter-name filter-classcn.tx.filter.MyFilter/filter-class init-param param-nameencode/param-name param-valueUTF-8/param-value /init-param init-param param-namecompany/param-name param-valuetxjava/param-value /init-param /filter上述这些方法均在filter中调用String filterName filterConfig.getFilterName(); String company filterConfig.getInitParameter(company); EnumerationString names filterConfig.getInitParameterNames(); while (names.hasMoreElements()){ String name names.nextElement(); String value filterConfig.getInitParameter(name); }3.2.3 其他1.Filter的执行顺序由其在web.xml中的顺序决定这一点与servlet不同2.Filter预处理和后处理是“穿层”进行的如图3.FilterChain是过滤器链对象若当前是最后一个 Filter放行后请求到达目标 Servlet资源若不放行不调用doFilter()请求会被拦截无法到达目标资源。四、ListenerWeb 容器的事件监听器Listener监听器是 JavaWeb 三大组件之一用于监听 Web 容器中域对象的创建、销毁和属性变化当事件触发时自动执行监听器的对应方法监听HttpSession。4.1三大域对象4.1.1 ServletContextListenerTomcat启动和关闭时调用下面两个方法:public void contextInitialized(ServletContextEvent evt)ServletContext对象被创建后调用public void contextDestroyed(ServletContextEvent evt)ServletContext对象被销毁前调用4.1.2 HttpSessionListener开始会话和结束会话时调用下面两个方法public void sessionCreated(HttpSessionEvent evt)HttpSession对象被创建后调用public void sessionDestroyed(HttpSessionEvent evt)HttpSession对象被销毁前调用4.1.3 ServletRequestListener开始请求和结束请求时调用下面两个方法public void requestInitiallized(ServletRequestEvent evt)ServletRequest对象被创建后调用public void requestDestroyed(ServletRequestEvent evt)ServletRequest对象被销毁前调用。4.2 Listener的使用1.web.xml配置listener listener-classcn.tx.listener.MyListener/listener-class /listener2.Lisenter实现public class MyListener implements ServletContextListener, HttpSessionListener, ServletRequestListener { public MyListener() { } Override public void requestInitialized(ServletRequestEvent sre) { System.out.println(requestInitialized); } Override public void requestDestroyed(ServletRequestEvent sre) { System.out.println(requestDestroyed); } public void contextInitialized(ServletContextEvent sce) { System.out.println(contextInitialized); } public void contextDestroyed(ServletContextEvent sce) { System.out.println(contextDestroyed); } public void sessionCreated(HttpSessionEvent se) { System.out.println(sessionCreated); } public void sessionDestroyed(HttpSessionEvent se) { System.out.println(sessionDestroyed); } }五、请求与响应HttpServletRequest、HttpServletResponseTomcat 接收到客户端 HTTP 请求后会为每次请求创建一个HttpServletRequest请求对象和HttpServletResponse响应对象分别封装请求数据和响应数据作为 Servlet/Filter 中方法的参数是实现客户端与服务器数据交互的核心。5.1 HttpServletRequest封装请求的所有数据HttpServletRequest是 ServletRequest 的子接口专门处理 HTTP 请求核心功能是获取请求数据和请求转发主要功能分为以下几类5.1.1获取请求头信息// 获取指定请求头 String userAgent request.getHeader(User-Agent); // 浏览器类型 // 获取所有请求头名称 EnumerationString headerNames request.getHeaderNames(); while (headerNames.hasMoreElements()) { String name headerNames.nextElement(); String value request.getHeader(name); System.out.println(name value); }5.1.2. 获取请求参数请求参数是客户端传递给服务器的核心数据如表单、地址栏参数支持单值参数和多值参数GET 和 POST 请求的获取方法一致// 1. 获取单值参数如用户名、密码 String username request.getParameter(username); String password request.getParameter(password); // 2. 获取多值参数如复选框、多选下拉框 String[] hobbies request.getParameterValues(hobby); // 3. 获取所有参数的Map集合 MapString, String[] paramMap request.getParameterMap(); for (String key : paramMap.keySet()) { String[] values paramMap.get(key); System.out.println(key Arrays.toString(values)); }5.1.3. 解决中文乱码问题GET 和 POST 请求的中文乱码处理方式不同核心原因是POST 参数在请求体中GET 参数在 URL 中1.POST 请求设置请求体编码需在获取参数前调用request.setCharacterEncoding(UTF-8); // 仅对POST有效2.GET 请求Tomcat8.5 已默认支持 UTF-8无需处理低版本需修改 Tomcat 的server.xml添加URIEncodingUTF-8Connector port8080 protocolHTTP/1.1 URIEncodingUTF-8/5.1.4. 请求转发与 request 作用域请求转发是服务器内部的跳转通过request.getRequestDispatcher()实现特点是地址栏不变、一次请求、数据可共享适用于 Servlet 处理完业务后跳转到页面 / 其他 Servlet。request是请求域对象作用域为一次请求响应过程通过setAttribute()和getAttribute()实现数据共享仅在请求转发中有效5.2 HttpServletResponse封装响应的所有数据HttpServletResponse是 ServletResponse 的子接口专门处理 HTTP 响应核心功能是向客户端输出响应数据和重定向主要功能分为以下几类5.2.1. 设置响应编码解决中文乱码// 方式1单独设置 response.setCharacterEncoding(UTF-8); // 设置响应体编码 response.setContentType(text/html;charsetUTF-8); // 设置浏览器解析编码 // 方式2简化设置推荐 response.setContentType(text/html;charsetUTF-8);5.2.2 向客户端输出响应数据// 输出普通文本 response.getWriter().write(Hello Response!); // 输出HTML response.getWriter().write(h1这是响应的HTML内容/h1);5.2.3 重定向客户端跳转重定向是服务器通知客户端重新请求新的资源通过response.sendRedirect()实现特点是地址栏变化、两次请求、数据不共享适用于登录成功、表单提交后跳转防止重复提交// 重定向到首页 response.sendRedirect(/index.jsp);六、总结1.三大组件Servlet处理请求、Filter拦截请求、Listener监听事件均由 Web 容器管理生命周期需实现对应接口并在 web.xml 配置2.Servlet 核心单例多线程线程不安全生命周期 init ()→service ()→destroy ()实际开发继承 HttpServlet重写 doGet/doPost3.Filter 核心拦截请求的预处理 / 后处理通过 FilterChain.doFilter () 放行多个 Filter 按配置顺序执行4.Listener 核心监听域对象ServletContext/HttpSession/ServletRequest的事件常用 HttpSessionListener 实现在线人数统计5.请求响应HttpServletRequest 封装请求数据获取参数、请求转发HttpServletResponse 封装响应数据输出内容、重定向解决中文乱码是核心要点6.核心区别请求转发是服务器内部跳转一次请求重定向是客户端跳转两次请求面试高频考点。

相关新闻