十九、Servlet知识点

2 阅读6分钟

Servlet 超详细完整知识点大全


一、Servlet 基础概念

1. 什么是 Servlet?

  • Servlet = Server + Applet,运行在服务器端的 Java 小程序
  • Java 官方定义的一套动态网页技术标准
  • 本质是一个 Java 接口,用来处理客户端请求、生成动态响应
  • 运行在 Tomcat、Jetty、JBoss 等 Web 容器中
  • SpringMVC、SpringBoot 的底层基石

2. Servlet 作用

  1. 接收客户端 HTTP 请求
  2. 处理业务逻辑
  3. 生成动态响应(HTML、JSON、文本等)
  4. 与数据库交互
  5. 实现会话管理、权限控制

3. Servlet 技术特点

  • 基于 Java 语言,跨平台
  • 高性能:单实例多线程处理请求
  • 可扩展:易于维护和升级
  • 支持 Cookie、Session、过滤器、监听器 等 Web 功能
  • 是所有 Java Web 框架的底层基础

二、Servlet 接口与核心类

1. Servlet 核心 API

Servlet 规范定义了三个核心接口/类:

  1. javax.servlet.Servlet(顶层接口)
  2. javax.servlet.GenericServlet(通用实现)
  3. javax.servlet.http.HttpServlet(HTTP 专用,开发最常用)

2. Servlet 接口方法(必须掌握)

public interface Servlet {
    // 1. 初始化:Servlet 创建时执行,只执行 1 次
    void init(ServletConfig config) throws ServletException;

    // 2. 获取配置信息
    ServletConfig getServletConfig();

    // 3. 服务方法:处理请求,每次请求都会执行
    void service(ServletRequest req, ServletResponse res) throws Exception;

    // 4. 获取 Servlet 信息
    String getServletInfo();

    // 5. 销毁:服务器关闭时执行,只执行 1 次
    void destroy();
}

3. HttpServlet 核心方法(开发 99% 用这个)

public class MyServlet extends HttpServlet {
    // 处理 GET 请求
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    
    // 处理 POST 请求
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    
    // 统一处理所有请求
    protected void service(HttpServletRequest request, HttpServletResponse response)
}

三、Servlet 生命周期(面试必考)

Servlet 生命周期分为 3 个阶段,由 Web 容器(Tomcat)自动管理

1. 实例化(加载)

  • 容器通过反射创建 Servlet 对象
  • 默认:第一次请求时创建
  • 可配置 <load-on-startup> 让服务器启动时创建

2. 初始化(init)

  • 创建对象后立即执行 init()
  • 只执行一次
  • 用于加载配置、初始化资源

3. 服务(service)

  • 每次请求都会执行 service()
  • 根据请求方式(GET/POST)分发到 doGet() / doPost()
  • 可执行 N 次

4. 销毁(destroy)

  • 服务器正常关闭时执行
  • 只执行一次
  • 用于释放资源

四、Servlet 创建方式(3 种)

1. 实现 Servlet 接口(最原始)

必须重写全部 5 个方法,开发不用,仅用于学习。

2. 继承 GenericServlet(抽象类)

只需要重写 service() 方法。

3. 继承 HttpServlet(开发标准方式)

重写 doGet() / doPost() 即可。


五、Servlet 配置方式(2 种)

1. web.xml 配置(传统方式)

<servlet>
    <servlet-name>MyServlet</servlet-name>
    <servlet-class>com.test.MyServlet</servlet-class>
    <!-- 服务器启动时初始化 -->
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/myServlet</url-pattern>
</servlet-mapping>

2. 注解配置(Servlet 3.0 以上,推荐)

@WebServlet("/myServlet")
public class MyServlet extends HttpServlet { }

六、HttpServletRequest 请求对象

1. 作用

  • 获取客户端所有请求信息
  • 获取请求头、请求参数、Cookie、Session 等

2. 常用方法

(1)获取请求参数

String name = request.getParameter("name");          // 单个参数
String[] hobbies = request.getParameterValues("hobby"); // 多值参数
Map<String,String[]> map = request.getParameterMap();  // 所有参数

(2)获取请求头

String agent = request.getHeader("User-Agent");

(3)域对象(存数据)

request.setAttribute("key", value);    // 存
request.getAttribute("key");           // 取
request.removeAttribute("key");        // 删

(4)请求转发

request.getRequestDispatcher("/success.jsp").forward(request, response);

(5)其他常用

request.getMethod();       // GET/POST
request.getRequestURI();   // 请求地址
request.getCookies();      // 获取Cookie
request.getSession();      // 获取Session

七、HttpServletResponse 响应对象

1. 作用

  • 向客户端输出响应数据
  • 设置响应头、状态码、Cookie、跳转页面

2. 常用方法

(1)设置响应格式

response.setContentType("text/html;charset=utf-8");

(2)输出数据

PrintWriter out = response.getWriter();
out.write("<h1>Hello Servlet</h1>");

(3)重定向

response.sendRedirect("/index.jsp");

(4)设置 Cookie

Cookie cookie = new Cookie("username", "zhangsan");
response.addCookie(cookie);

(5)设置状态码

response.setStatus(200);
response.sendError(404, "资源不存在");

八、请求转发 vs 重定向(面试高频)

1. 请求转发(forward)

  • request.getRequestDispatcher("/a").forward(req,resp)
  • 服务器内部跳转
  • 地址栏不变
  • 只有 1 次请求
  • 可以共享 request 域数据
  • / 表示项目根目录

2. 重定向(redirect)

  • response.sendRedirect("/a")
  • 客户端跳转
  • 地址栏改变
  • 2 次请求
  • 不能共享 request 域数据
  • / 表示服务器根目录

九、Servlet 三大域对象

1. Request 域

  • 作用范围:一次请求
  • 转发共享,重定向不共享

2. Session 域

  • 作用范围:一次会话(浏览器打开到关闭)
  • 一个用户独享

3. ServletContext 域

  • 作用范围:整个 Web 应用
  • 所有用户共享
  • 服务器启动创建,关闭销毁

十、Cookie & Session(会话管理)

1. Cookie(客户端存储)

  • 服务器生成,保存在浏览器
  • 键值对字符串
  • 大小限制 4KB
  • 不安全
// 创建
Cookie c = new Cookie("user","张三");
c.setMaxAge(60*60*24); // 存活1天
response.addCookie(c);

// 获取
Cookie[] cs = request.getCookies();

2. Session(服务端存储)

  • 保存在服务器内存
  • 安全、可存对象
  • 依赖 Cookie(JSESSIONID)
HttpSession session = request.getSession();
session.setAttribute("loginUser", user);  // 存
session.getAttribute("loginUser");        // 取
session.invalidate();                    // 销毁

十一、Filter 过滤器(重点)

1. 作用

  • 请求到达 Servlet 之前拦截
  • 统一处理:编码、登录验证、权限、日志、压缩
  • 可配置多个过滤器,形成过滤链

2. 过滤器方法

public void init(FilterConfig config) // 初始化
public void doFilter(request,response,chain) // 过滤
public void destroy() // 销毁

3. 放行

chain.doFilter(request, response);

4. 配置

@WebFilter("/*") // 拦截所有请求

十二、Listener 监听器

1. 作用

  • 监听 域对象的创建、销毁、属性变化
  • 监听 Session 活化、钝化、绑定事件

2. 三大域监听器

  1. ServletContextListener:监听应用启动/关闭
  2. HttpSessionListener:监听会话创建/销毁
  3. ServletRequestListener:监听请求创建/销毁

3. 常用场景

  • 在线人数统计
  • 系统初始化
  • 日志记录

十三、Servlet 线程安全问题(面试必问)

1. 为什么不安全?

  • Servlet 单实例多线程
  • 多个线程同时访问成员变量会产生并发问题

2. 解决方案

  1. 不要在 Servlet 中定义成员变量
  2. 使用 ThreadLocal
  3. 实现 SingleThreadModel(不推荐)

十四、Servlet 3.0 新特性

  • 注解支持:@WebServlet、@WebFilter、@WebListener
  • web.xml 可选
  • 异步支持
  • 文件上传简化

十五、文件上传下载(Servlet 3.0)

1. 上传

@MultipartConfig
Part part = request.getPart("file");
part.write("路径");

2. 下载

设置响应头:

response.setHeader("Content-Disposition","attachment;filename=xxx");

十六、Servlet 执行流程(完整图解)

  1. 客户端发送 HTTP 请求
  2. Tomcat 接收请求
  3. 解析 URL,找到对应 Servlet
  4. 若 Servlet 未创建,则实例化 + init
  5. 执行 service()doGet()/doPost()
  6. 生成响应返回客户端
  7. 服务器关闭 → destroy()

十七、Servlet 与 SpringMVC 关系

  • SpringMVC 底层就是 Servlet
  • SpringMVC 提供一个 DispatcherServlet(中央控制器)
  • 所有请求先进入 DispatcherServlet,再分发到 Controller

十八、高频面试题(总结版)

  1. Servlet 生命周期?
  2. doGet 和 doPost 区别?
  3. 请求转发和重定向区别?
  4. Servlet 为什么线程不安全?
  5. Cookie 和 Session 区别?
  6. Filter 作用与执行流程?
  7. 三大域对象区别?
  8. Servlet 3.0 新特性?