一、Servlet 是什么?
Servlet(Server Applet) 是运行在 Web 服务器上的 Java 程序,用于处理 HTTP 请求并生成动态响应。它是 JavaWeb 技术的核心,所有现代 JavaWeb 框架(如 Spring MVC)的基础。
二、Servlet 的核心作用
- 接收请求:解析客户端(浏览器)的 HTTP 请求(GET/POST/PUT/DELETE 等)。
- 处理业务逻辑:如用户登录验证、数据库操作、数据计算等。
- 生成响应:返回 HTML、JSON、XML 等格式的数据给客户端。
- 协作视图层:与 JSP 配合实现 MVC 模式(Servlet 作为控制器)。
三、Servlet 的生命周期
Servlet 的生命周期由 Web 容器(如 Tomcat) 管理,分为三个阶段:
- 初始化(Init):
- 首次被请求时调用
init()
方法(或服务器启动时,取决于配置)。 - 通常用于加载资源(如数据库连接)。
- 首次被请求时调用
- 处理请求(Service):
- 每次请求触发
service()
方法,根据请求类型调用doGet()
、doPost()
等。
- 每次请求触发
- 销毁(Destroy):
- 服务器关闭或 Servlet 被移除时调用
destroy()
方法,释放资源(如关闭连接)。
- 服务器关闭或 Servlet 被移除时调用
四、Servlet 的核心 API
类/接口 | 说明 |
---|---|
HttpServlet |
Servlet 的抽象基类,提供 doGet() 、doPost() 等方法。 |
HttpServletRequest |
封装 HTTP 请求信息(参数、请求头、Session 等)。 |
HttpServletResponse |
封装 HTTP 响应操作(设置状态码、响应头、输出内容)。 |
ServletConfig |
获取 Servlet 配置参数(如 web.xml 中的 <init-param> )。 |
ServletContext |
应用全局上下文对象,共享数据(如所有用户的在线统计)。 |
五、开发第一个 Servlet
1. 创建 Servlet 类
1 | // 注解配置访问路径 |
2. 部署到 Tomcat
- Maven 项目:将项目打包为 WAR 文件,复制到 Tomcat 的
webapps
目录。 - IDE 部署:在 IntelliJ/Eclipse 中配置 Tomcat,直接运行调试。
3. 访问 Servlet
浏览器输入:http://localhost:8080/你的项目名/hello
六、Servlet 的两种配置方式
1. 注解配置(推荐)
1 |
|
2. web.xml
配置(传统方式)
1 | <servlet> |
七、Servlet 处理请求与响应
1. 获取请求参数
1 | String username = request.getParameter("username"); |
2. 读取请求头
1 | String userAgent = request.getHeader("User-Agent"); |
3. 设置响应内容
1 | response.setContentType("text/html"); // 设置 MIME 类型 |
4. 重定向与请求转发
重定向(Redirect):客户端行为,地址栏变化。
1
response.sendRedirect("/newPage.jsp");
请求转发(Forward):服务器内部跳转,地址栏不变。
1
request.getRequestDispatcher("/result.jsp").forward(request, response);
八、Servlet 的进阶应用
1. 会话管理(Session & Cookie)
Session:服务端存储用户会话数据。
1
2
3HttpSession session = request.getSession(); // 获取或创建 Session
session.setAttribute("user", user); // 存储数据
session.invalidate(); // 销毁 SessionCookie:客户端存储数据。
1
2
3Cookie cookie = new Cookie("theme", "dark");
cookie.setMaxAge(3600); // 有效期(秒)
response.addCookie(cookie); // 发送 Cookie 到客户端
2. 文件上传
使用 Apache Commons FileUpload
或 Servlet 3.0+ 的 Part
接口:
1 | Part filePart = request.getPart("file"); |
3. 异步处理(Servlet 3.0+)
支持非阻塞 I/O,提升并发性能:
1 |
|
九、Servlet 与 JSP 的协作(MVC 模式)
- Servlet(Controller):接收请求,调用业务逻辑,准备数据。
- JavaBean(Model):封装业务数据。
- JSP(View):展示数据,生成 HTML。
示例流程:
1 | // Servlet 中处理请求并转发到 JSP |
1 | <!-- JSP 中显示数据 --> |
十、常见问题与调试技巧
404 错误:
- 检查 URL 路径是否正确(区分
/hello
和/hello/
)。 - 确认 Servlet 类已正确部署到
WEB-INF/classes
。
- 检查 URL 路径是否正确(区分
中文乱码:
- 请求乱码:在 Filter 或 Servlet 中设置
request.setCharacterEncoding("UTF-8")
。 - 响应乱码:设置
response.setContentType("text/html;charset=UTF-8")
。
- 请求乱码:在 Filter 或 Servlet 中设置
线程安全问题:
- 避免在 Servlet 类中定义成员变量(除非使用同步锁)。
十一、Servlet 的现代演进
- Spring MVC:基于 Servlet 的 Web 框架,提供更简洁的注解和功能。
- Jakarta EE:Servlet 规范的新归属(原 Java EE)。
- Reactive Web:异步非阻塞的响应式编程模型(如 Spring WebFlux)。
总结
Servlet 是 JavaWeb 开发的基石,掌握其核心机制(生命周期、请求处理、会话管理)是构建动态网站的关键。建议通过实际项目练习,逐步理解过滤器、监听器、MVC 模式等进阶概念,最终过渡到 Spring 等现代框架。