Java Servlet是Java Web开发的基础技术,用于处理客户端的HTTP请求并生成动态响应,掌握Servlet的编写是理解Java Web框架(如Spring MVC)的关键,本文将从环境准备、核心步骤、生命周期、请求响应处理、高级特性及常见问题六个方面,详细讲解Java Servlet的编写方法。

开发环境准备
编写Servlet需要先搭建Java Web开发环境,主要包括JDK、Servlet容器(如Tomcat)和IDE(如IntelliJ IDEA或Eclipse)。
- 安装JDK:确保JDK版本为1.8或更高,配置环境变量
JAVA_HOME和PATH,验证安装通过java -version命令。 - 下载Tomcat:从Apache官网下载Tomcat(建议9.x版本),解压后配置环境变量
CATALINA_HOME,启动Tomcat可通过bin/startup.bat(Windows)或bin/startup.sh(Linux)。 - IDE配置:在IDE中创建Dynamic Web Project,将Tomcat的
lib/servlet-api.jar添加到项目依赖(或通过Maven添加依赖:javax.servlet:javax.servlet-api:4.0.1)。
Servlet编写核心步骤
Servlet的编写遵循固定流程,主要包括创建类、继承父类、重写方法、配置映射和部署运行。
创建Servlet类并继承HttpServlet
Servlet是一个Java类,需继承javax.servlet.http.HttpServlet,并重写doGet()或doPost()方法(分别处理GET和POST请求)。
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
resp.setContentType("text/html;charset=UTF-8");
resp.getWriter().write("<h1>Hello, Servlet!</h1>");
}
}
配置Servlet映射
容器需通过映射将URL与Servlet类关联,有两种方式:
- web.xml配置(传统方式):在
WEB-INF/web.xml中添加<servlet>和<servlet-mapping>标签:<servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>com.example.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> - 注解配置(Servlet 3.0+):在Servlet类上添加
@WebServlet注解,更简洁:@WebServlet(urlPatterns = "/hello") public class HelloServlet extends HttpServlet { /* ... */ }
部署与运行
将项目打包为WAR文件(或直接将项目目录放入Tomcat的webapps目录),启动Tomcat后,通过浏览器访问http://localhost:8080/项目名/hello即可看到响应结果。

Servlet生命周期详解
Servlet的生命周期由容器管理,主要包括三个阶段:
-
初始化(init):Servlet实例创建后,容器调用
init()方法(仅执行一次),用于加载资源、初始化配置,可通过重写init()方法自定义初始化逻辑:@Override public void init() throws ServletException { System.out.println("Servlet初始化中..."); } -
处理请求(service):每次请求到达时,容器调用
service()方法,该方法根据请求类型(GET/POST等)调用对应的doGet()、doPost()等,开发者通常只需重写doGet()或doPost(),无需修改service()。 -
销毁(destroy):容器关闭或Servlet被移除时,调用
destroy()方法(仅执行一次),用于释放资源(如关闭数据库连接)。@Override public void destroy() { System.out.println("Servlet销毁中..."); }
请求与响应处理
Servlet的核心功能是处理请求(HttpServletRequest)和生成响应(HttpServletResponse)。

请求处理
通过HttpServletRequest对象获取客户端信息:
- 获取请求参数:
String name = req.getParameter("name"); - 获取请求头:
String userAgent = req.getHeader("User-Agent"); - 获取请求方法:
String method = req.getMethod(); - 设置请求编码:
req.setCharacterEncoding("UTF-8");(解决POST请求中文乱码)
响应处理
通过HttpServletResponse对象向客户端返回数据:
- 设置响应类型:
resp.setContentType("application/json;charset=UTF-8"); - 输出文本/HTML:
resp.getWriter().write("响应内容"); - 输出二进制数据(如文件下载):
resp.getOutputStream().write(byte[]); - 设置响应状态码:
resp.setStatus(404);
高级特性
请求转发与重定向
- 请求转发(forward):服务器内部跳转,地址栏URL不变,共享请求数据:
req.getRequestDispatcher("/target.jsp").forward(req, resp); - 重定向(redirect):客户端跳转,地址栏URL改变,不共享请求数据:
resp.sendRedirect("http://example.com");
线程安全问题
Servlet默认是单例模式(每个Servlet类只有一个实例),多个线程同时访问时,若使用成员变量(非局部变量),可能导致数据错乱,解决方案:
- 避免在Servlet中使用成员变量,改用局部变量;
- 必须使用成员变量时,通过
synchronized同步代码块(但影响性能)。
常见问题与解决方案
- 404错误:检查
url-pattern配置是否正确,确保项目名与访问路径一致。 - 中文乱码:
- POST请求乱码:
req.setCharacterEncoding("UTF-8");(需在获取参数前调用); - GET请求乱码:修改Tomcat配置文件
conf/server.xml,在<Connector>标签添加URIEncoding="UTF-8"。
- POST请求乱码:
- ClassNotFoundException:确保
servlet-api.jar已添加到项目依赖,且部署时包含在WEB-INF/lib目录下。
Java Servlet是Java Web开发的基石,掌握其编写流程、生命周期、请求响应处理及线程安全等知识,是深入理解Web框架的前提,通过实践编写简单的Servlet(如用户登录、数据查询),逐步熟悉其核心功能,为后续学习Spring MVC等现代框架打下坚实基础。


















