Servlet 超详细完整知识点大全
一、Servlet 基础概念
1. 什么是 Servlet?
- Servlet = Server + Applet,运行在服务器端的 Java 小程序
- 是 Java 官方定义的一套动态网页技术标准
- 本质是一个 Java 接口,用来处理客户端请求、生成动态响应
- 运行在 Tomcat、Jetty、JBoss 等 Web 容器中
- 是 SpringMVC、SpringBoot 的底层基石
2. Servlet 作用
- 接收客户端 HTTP 请求
- 处理业务逻辑
- 生成动态响应(HTML、JSON、文本等)
- 与数据库交互
- 实现会话管理、权限控制
3. Servlet 技术特点
- 基于 Java 语言,跨平台
- 高性能:单实例多线程处理请求
- 可扩展:易于维护和升级
- 支持 Cookie、Session、过滤器、监听器 等 Web 功能
- 是所有 Java Web 框架的底层基础
二、Servlet 接口与核心类
1. Servlet 核心 API
Servlet 规范定义了三个核心接口/类:
- javax.servlet.Servlet(顶层接口)
- javax.servlet.GenericServlet(通用实现)
- 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. 三大域监听器
- ServletContextListener:监听应用启动/关闭
- HttpSessionListener:监听会话创建/销毁
- ServletRequestListener:监听请求创建/销毁
3. 常用场景
- 在线人数统计
- 系统初始化
- 日志记录
十三、Servlet 线程安全问题(面试必问)
1. 为什么不安全?
- Servlet 单实例多线程
- 多个线程同时访问成员变量会产生并发问题
2. 解决方案
- 不要在 Servlet 中定义成员变量
- 使用 ThreadLocal
- 实现 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 执行流程(完整图解)
- 客户端发送 HTTP 请求
- Tomcat 接收请求
- 解析 URL,找到对应 Servlet
- 若 Servlet 未创建,则实例化 + init
- 执行
service()→doGet()/doPost() - 生成响应返回客户端
- 服务器关闭 →
destroy()
十七、Servlet 与 SpringMVC 关系
- SpringMVC 底层就是 Servlet
- SpringMVC 提供一个 DispatcherServlet(中央控制器)
- 所有请求先进入 DispatcherServlet,再分发到 Controller
十八、高频面试题(总结版)
- Servlet 生命周期?
- doGet 和 doPost 区别?
- 请求转发和重定向区别?
- Servlet 为什么线程不安全?
- Cookie 和 Session 区别?
- Filter 作用与执行流程?
- 三大域对象区别?
- Servlet 3.0 新特性?