Servlet 是 Java 平台用于处理 Web 请求和生成动态内容的核心技术之一,主要应用于服务器端开发。
1、Servlet 是什么?
- 定义:Servlet 是用 Java 编写的服务器端程序,遵循特定的接口(如 javax.servlet.Servlet),用于处理 HTTP 请求(GET、POST 等)并生成动态响应(HTML、JSON 等)。
- 核心作用:在 Web 容器(如 Tomcat、Jetty)中运行,充当客户端(浏览器)与服务器端逻辑(如数据库、业务逻辑)之间的中间层。
2、Servlet 的工作流程
- 客户端发起请求:浏览器发送 HTTP 请求到服务器。
- Web 容器接收请求:容器(如 Tomcat)解析请求,确定对应的 Servlet。
- Servlet 处理请求:
- 调用 service() 方法,根据请求类型(GET/POST)分发到 doGet() 或 doPost()。
- 执行业务逻辑(如查询数据库)。
- 生成响应:Servlet 通过 response 对象返回 HTML、JSON 或其他格式的数据。
- 容器发送响应:容器将响应返回给客户端。
3、Servlet 的生命周期
- 初始化阶段:
- 容器加载 Servlet 类,调用 init(ServletConfig config) 方法(仅一次)。
- servlet 在内存中只存在一个,是单例的,存在线程安全问题
- 用于初始化资源(如数据库连接)。
- 使用
<load-on-startup>
来控制创建时机- 非负整数:容器启动时创建
- 负数:第一次被访问时创建
- 容器加载 Servlet 类,调用 init(ServletConfig config) 方法(仅一次)。
- 请求处理阶段:
- 每次请求时,容器创建 ServletRequest 和 ServletResponse 对象。
- 调用 service() 方法处理请求(多线程执行)。
- 销毁阶段:
- 容器卸载 Servlet 前调用 destroy() 方法(仅一次)。
- 只有服务器正常关闭才会调用销毁方法。
- 用于释放资源(如关闭连接)。
4、核心类与接口
- HttpServlet:开发者通常继承此类,重写 doGet() 和 doPost() 方法。
- HttpServletRequest:封装 HTTP 请求信息(参数、头信息、Session 等)。
- HttpServletResponse:封装 HTTP 响应操作(设置状态码、写入输出流等)。
- ServletConfig:提供 Servlet 初始化参数。
- ServletContext:代表整个 Web 应用,用于共享全局数据。
5、配置 Servlet
- 方式 1:XML 配置(web.xml)
<servlet> <servlet-name>MyServlet</servlet-name> <servlet-class>com.example.MyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>/my-servlet</url-pattern> </servlet-mapping>
- 方式 2:注解配置(Java 5+)
@WebServlet(name = "MyServlet", urlPatterns = "/my-servlet") public class MyServlet extends HttpServlet { // ... }
6、Helleword
- 创建Maven工程:
src/ ├── main/ │ ├── java/ │ │ └── com/example/ │ │ └── HelloServlet.java # Servlet 类 │ └── webapp/ │ └── WEB-INF/ # 可留空(Servlet 3.0+ 使用注解) pom.xml # Maven 依赖配置
- 代码实现
- Servlet 类 HelloServlet.java
package com.example;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/hello") // 定义访问路径
public class HelloServlet extends HttpServlet {
// 处理 GET 请求
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException {
// 设置响应内容类型
response.setContentType("text/html");
// 获取输出流
PrintWriter out = response.getWriter();
// 生成 HTML 内容
out.println("<html>");
out.println("<head><title>Hello World Servlet</title></head>");
out.println("<body>");
out.println("<h1>Hello World from Servlet!</h1>");
out.println("</body>");
out.println("</html>");
}
}
7、Servlet 与 JSP 的关系
- Servlet:适合处理业务逻辑和复杂计算,直接操作请求/响应。
- JSP(Java Server Pages):本质是 Servlet 的变体,更擅长生成动态 HTML(通过嵌入 Java 代码和标签)。
- 协作模式:通常使用 MVC 模式,Servlet 作为控制器(Controller),JSP 作为视图(View)。
8、应用场景
- 处理表单提交(如用户登录)。
- 构建 RESTful API(返回 JSON/XML)。
- 实现会话管理(通过 HttpSession)。
- 与数据库交互(如查询并展示数据)。
9、注意事项
- 线程安全:Servlet 实例通常被多个线程共享,避免使用实例变量保存状态。
- 性能优化:合理使用 init() 和 destroy() 管理资源。
- 异步处理:Servlet 3.0+ 支持异步处理(AsyncContext),适合长时间任务。
10、优势与局限
优势:
- 跨平台(Java 特性)。
- 高性能(多线程处理请求)。
- 与 Java 生态无缝集成(如 Spring MVC)。
局限:
- 直接使用 Servlet API 较底层,通常需结合框架(如 Spring)简化开发。
11、总结
Servlet 是 Java Web 开发的基石,理解其原理是掌握高级框架(如 Spring MVC)的前提。尽管现代开发中更多使用框架,但 Servlet 的核心机制(如生命周期、请求/响应模型)仍然是关键基础。