Servlet 是 Java Web 的基石,理解其接口契约与生命周期是掌握 SpringMVC、Struts2 等框架原理的前提。本文梳理 Servlet 接口五大方法、生命周期流转,并给出最简手写实现与 web.xml 配置。
| 方法 | 签名 | 调用时机 | 核心职责 |
|---|---|---|---|
| init | void init(ServletConfig config) | 实例化后、首次请求前(单次) | 初始化资源:数据库连接、加载配置、创建对象 |
| service | void service(ServletRequest req, ServletResponse res) | 每次请求到达 | 核心业务处理:读参数、调用服务、写响应 |
| destroy | void destroy() | 容器卸载 Servlet 前(单次) | 释放资源:关闭连接、停止线程、清理缓存 |
| getServletConfig | ServletConfig getServletConfig() | 任意时刻 | 返回初始化时传入的 ServletConfig |
| getServletInfo | String getServletInfo() | 任意时刻 | 返回描述信息:作者、版本、版权等 |
public class HelloWorldServlet implements Servlet {
private ServletConfig servletConfig;
@Override
public void init(ServletConfig config) throws ServletException {
this.servletConfig = config; // 保存配置对象
}
@Override
public ServletConfig getServletConfig() {
return servletConfig;
}
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
String realName = servletConfig.getInitParameter("realName");
String servletName = servletConfig.getServletName();
String username = req.getParameter("username");
res.setContentType("text/html;charset=gb2312");
PrintWriter out = res.getWriter();
out.println("Hello World " + username + "<br/>");
out.println("Servlet 名称:" + servletName + "<br/>");
out.println("初始化参数 realName:" + realName + "<br/>");
out.close();
}
@Override
public String getServletInfo() {
return "作者:张三;版本:1.0";
}
@Override
public void destroy() {
// 释放资源
}
}
<web-app>
<servlet>
<servlet-name>HelloWorldServlet</servlet-name>
<servlet-class>com.lp.servlet.HelloWorldServlet</servlet-class>
<init-param>
<param-name>realName</param-name>
<param-value>张三</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorldServlet</servlet-name>
<url-pattern>/helloworld</url-pattern>
</servlet-mapping>
</web-app>
访问 https://localhost:8080/servlet-test/helloworld?username=lp 即可看到输出。


init(config),注入 ServletConfigservice(req, res),多线程并发destroy()service 并发执行 → 成员变量非线程安全config.getInitParameter("key")req.setCharacterEncoding() + res.setContentType()