
本文已完整覆盖 Servlet 所有核心知识点适合 Java 后端初学者、面试备考、项目开发全文干货无废话建议收藏反复阅读前言Servlet 是 JavaWeb 开发的基石是每一位 Java 后端开发者必须 100% 掌握的核心技术。无论是传统 JavaWeb 项目还是 Spring Boot、Spring MVC 等主流框架底层全部基于 Servlet 实现。本文将从概念、接口、生命周期、HttpServlet、配置映射、ServletConfig、ServletContext、高频面试题全方位讲解带你彻底吃透 Servlet轻松应对开发与面试。一、Servlet 核心概念1.1 什么是 ServletServlet Server Applet运行在 Web 服务器如 Tomcat中的小型 Java 程序。基于 HTTP 协议接收、处理、响应客户端请求是前端与后端业务逻辑的核心桥梁。一句话总结用户的所有请求最终都由 Servlet 处理登录 → 登录 Servlet注册 → 注册 Servlet查询 → 查询 Servlet1.2 JavaWeb 三大组件Servlet 是三大组件之首必须掌握Servlet处理用户请求Filter过滤器请求拦截、编码、权限校验Listener监听器观察者模式监听域对象生命周期二、Servlet 接口与原生开发2.1 Servlet 核心接口所有 Servlet必须实现javax.servlet.Servlet接口共 5 个方法方法作用调用时机init(ServletConfig)初始化实例创建后仅调用 1 次service(req,res)处理请求每次请求必调用destroy()销毁Tomcat 关闭时调用getServletConfig()获取配置手动调用getServletInfo()描述信息基本不用2.2 手写第一个 Servlet原生版① 编写 Servlet 实现类package cn.tx.servlet; import javax.servlet.*; import java.io.IOException; import java.io.PrintWriter; public class Servlet1 implements Servlet { // 初始化只执行一次 Override public void init(ServletConfig servletConfig) throws ServletException { System.out.println(Servlet1 初始化...); } // 获取配置对象 Override public ServletConfig getServletConfig() { return null; } // 核心处理请求 Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { System.out.println(Servlet1 处理请求...); // 响应中文 res.setContentType(text/html;charsetUTF-8); PrintWriter out res.getWriter(); out.write(Hello Servlet我是原生 Servlet); } // 描述信息 Override public String getServletInfo() { return null; } // 销毁服务器关闭执行 Override public void destroy() { System.out.println(Servlet1 销毁...); } }② web.xml 配置访问路径?xml version1.0 encodingUTF-8? web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaee xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd version3.1 !-- 注册 Servlet -- servlet servlet-namehello/servlet-name servlet-classcn.tx.servlet.Servlet1/servlet-class /servlet !-- 配置访问地址 -- servlet-mapping servlet-namehello/servlet-name url-pattern/hello/url-pattern /servlet-mapping /web-app2.3 Tomcat 请求响应完整流程浏览器访问http://localhost:8080/项目名/helloTomcat 解析 URL匹配web.xml的url-pattern根据名称找到对应servlet-class反射创建 Servlet 实例仅第一次请求创建调用service()处理请求响应结果返回浏览器三、Servlet 生命周期面试必考Servlet生命周期完全由 Tomcat 管理我们只写逻辑不负责创建 / 调用。3.1 完整生命周期四步走实例化默认第一次访问时Tomcat 反射创建对象初始化调用init()只执行 1 次服务每次请求调用service()销毁Tomcat 关闭 → 调用destroy()→ 释放资源核心结论一个 Servlet 类Tomcat 只创建一个实例 → 单例多线程3.2 配置 Tomcat 启动时创建 Servlet默认第一次访问创建可通过load-on-startup提前创建servlet servlet-namehello/servlet-name servlet-classcn.tx.servlet.Servlet1/servlet-class !-- 数字越小优先级越高≥0 启动即创建 -- load-on-startup1/load-on-startup /servlet四、HttpServlet 企业级开发最常用原生 Servlet 必须实现所有方法开发繁琐。实际开发 100% 使用 HttpServlet4.1 继承体系Servlet接口→ GenericServlet抽象类→ HttpServletHTTP专用4.2 快速编写 HttpServletpackage cn.tx.servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; public class Servlet2 extends HttpServlet { // 处理 GET 请求 Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } // 处理 POST 请求 Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType(text/html;charsetUTF-8); PrintWriter out response.getWriter(); out.write(Hello HttpServlet企业开发标准写法); } }4.3 HTTP 常见请求方法GET查询资源POST提交数据PUT修改资源DELETE删除资源HEAD只获取响应头五、Servlet 路径映射规则5.1 三种匹配方式完全路径匹配以/开头精准匹配示例/hello、/user/login目录匹配以/开头 /*示例/user/*、/*扩展名匹配不能以/开头示例*.do、*.action5.2 匹配优先级必背完全路径匹配 目录匹配 扩展名匹配禁止写法/*.do→ 语法错误Tomcat 无法启动5.3 经典匹配示例请求 URL匹配规则执行 Servlet/abc/abc精准匹配/abc/a.html/abc/*目录匹配/a.do*.do扩展名匹配六、ServletConfig 单个 Servlet 配置6.1 作用封装当前 Servlet 私有配置一个 Servlet 对应一个 ServletConfig。6.2 配置私有参数servlet servlet-namehello/servlet-name servlet-classcn.tx.servlet.Servlet1/servlet-class !-- 单个 Servlet 初始化参数 -- init-param param-nameusername/param-name param-valueroot/param-value /init-param init-param param-namepassword/param-name param-valuetxjava/param-value /init-param /servlet6.3 获取参数Override public void init(ServletConfig config) throws ServletException { // 获取单个参数 String username config.getInitParameter(username); System.out.println(username username); // 获取所有参数名 EnumerationString names config.getInitParameterNames(); while (names.hasMoreElements()) { String name names.nextElement(); String value config.getInitParameter(name); System.out.println(name value); } }七、ServletContext 全局域对象重点7.1 核心特点一个 Web 应用只有一个ServletContext服务器启动创建服务器关闭销毁所有 Servlet 共享数据全局作用域7.2 常用 API方法功能getInitParameter(name)获取全局参数setAttribute(name,value)存数据getAttribute(name)取数据getRealPath(path)获取服务器真实路径getResourceAsStream(path)获取文件流7.3 配置全局参数所有 Servlet 共享!-- 全局参数 -- context-param param-namecompany/param-name param-value达内教育/param-value /context-param7.4 实战统计网站总访问次数Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletContext context getServletContext(); // 取出次数 Integer count (Integer) context.getAttribute(visitCount); count count null ? 1 : count 1; // 存入域对象 context.setAttribute(visitCount, count); // 响应 response.setContentType(text/html;charsetUTF-8); response.getWriter().write(总访问次数 count); }7.5 读取资源文件三种方式// 方式1获取真实路径 String path context.getRealPath(/test.properties); // 方式2直接获取文件流 InputStream is1 context.getResourceAsStream(/WEB-INF/test.properties); // 方式3类加载器通用不依赖 Servlet InputStream is2 this.getClass().getClassLoader() .getResourceAsStream(test.properties);八、Servlet 高频面试题背会稳拿分8.1 Servlet 是单例吗为什么线程不安全是单例Tomcat 对每个 Servlet 只创建一个实例线程不安全多线程并发访问同一个实例成员变量会被共享覆盖解决方案不定义成员变量、使用局部变量、使用 ThreadLocal8.2 Servlet 生命周期必背 3 步创建第一次请求 → 反射实例化初始化执行init()→ 仅一次服务每次请求 →service()销毁服务器关闭 →destroy()8.3ServletConfigvs ServletContext对比项ServletConfigServletContext作用域当前 Servlet整个 Web 应用创建时机Servlet 创建时服务器启动时共享范围自己所有 Servlet用途私有配置全局数据、文件读取九、全文总结本文完整覆盖 Servlet从入门到精通所有核心Servlet 概念 JavaWeb 三大组件原生 Servlet 接口 生命周期HttpServlet 企业开发写法路径映射优先级ServletConfig 私有配置ServletContext 全局共享 访问量统计实战高频面试题