Java Servlet 详解

1. 什么是 Java Servlet?

Java Servlet 是一种用于构建 Web 应用程序的服务器端技术,它扩展了服务器的功能,允许 Java 代码处理 HTTP 请求和响应。Servlet 运行在支持 Java EE 规范的 Web 服务器或应用服务器(如 Apache Tomcat、Jetty)上,通常用于动态生成 Web 内容。

2. Java Servlet 的特点

  • 跨平台性:基于 Java 语言,支持不同操作系统和服务器环境。
  • 高效性:Servlet 运行在服务器端,支持多线程处理请求,提高性能。
  • 安全性:支持会话管理、身份验证等安全机制。
  • 扩展性:可以与其他 Java EE 技术(如 JSP、JDBC、Spring)结合使用。

3. Java Servlet 的生命周期

Servlet 的生命周期由 Web 容器(如 Tomcat)管理,主要包括以下几个阶段:

  1. 加载和实例化:Web 容器加载 Servlet 类,并创建其实例。
  2. 初始化(init 方法):容器调用 init() 方法,Servlet 进行初始化。
  3. 请求处理(service 方法):Servlet 通过 service() 方法处理客户端请求。
  4. 销毁(destroy 方法):Web 容器调用 destroy() 方法,Servlet 释放资源。
  5. 垃圾回收:Servlet 实例被垃圾回收机制回收。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
public void init() throws ServletException {
System.out.println("Servlet 初始化");
}

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<h1>Hello, Servlet!</h1>");
}

@Override
public void destroy() {
System.out.println("Servlet 销毁");
}
}

4. 处理 HTTP 请求

Servlet 主要通过 doGet()doPost() 方法处理 HTTP 请求:

  • doGet() 处理 GET 请求,通常用于获取数据。
  • doPost() 处理 POST 请求,通常用于提交数据。

获取请求参数

1
2
3
4
5
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name = request.getParameter("name");
response.getWriter().println("Hello, " + name);
}

处理表单提交

1
2
3
4
5
6
7
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
response.getWriter().println("用户名: " + username + ", 密码: " + password);
}

5. Servlet 配置方式

Servlet 可以通过两种方式进行配置:

5.1 使用 @WebServlet 注解

1
2
3
4
@WebServlet("/example")
public class ExampleServlet extends HttpServlet {
// 代码实现
}

5.2 在 web.xml 配置文件中定义

1
2
3
4
5
6
7
8
<servlet>
<servlet-name>ExampleServlet</servlet-name>
<servlet-class>com.example.ExampleServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ExampleServlet</servlet-name>
<url-pattern>/example</url-pattern>
</servlet-mapping>

6. Servlet 会话管理

6.1 使用 HttpSession

1
2
3
4
HttpSession session = request.getSession();
session.setAttribute("user", "admin");
String user = (String) session.getAttribute("user");
response.getWriter().println("当前用户: " + user);
1
2
3
Cookie cookie = new Cookie("username", "admin");
cookie.setMaxAge(3600); // 1 小时
response.addCookie(cookie);

7. 与 JSP 结合使用

在 Servlet 中,可以通过 RequestDispatcher 转发到 JSP 页面:

1
2
RequestDispatcher dispatcher = request.getRequestDispatcher("/index.jsp");
dispatcher.forward(request, response);

在 JSP 中,可以使用 request.getAttribute("user") 获取 Servlet 传递的数据。

8. Servlet 的应用场景

  • 处理动态 Web 页面请求
  • 处理表单提交
  • 实现 RESTful API
  • 作为 MVC 框架的 Controller 组件
  • 处理文件上传和下载

9. 结论

Java Servlet 是 Java Web 开发的基础组件,提供了处理 HTTP 请求的能力,并支持会话管理、安全机制、与 JSP 结合等功能。尽管如今 Spring MVC 和 Jakarta EE 等框架简化了 Web 开发,但 Servlet 仍然是 Java Web 技术栈中的核心部分。