Servlet 生命周期、配置与部署
2025/9/17大约 3 分钟
Servlet 生命周期、配置与部署
前置知识
建议你已掌握 Servlet 基础、请求与响应机制。
目录
Servlet 生命周期详解
Servlet 生命周期由 Servlet 容器(如 Tomcat)全权管理,主要包括:
- 加载与实例化:容器加载 Servlet 类,创建实例
- 初始化:调用
init()
方法,做初始化操作 - 请求处理:每次请求调用
service()
,分发到doGet
/doPost
等 - 销毁:容器关闭或卸载时调用
destroy()
,释放资源
生命周期方法示例
package com.example.servlet;
import lombok.extern.slf4j.Slf4j;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Slf4j
@WebServlet(name = "LifeServlet", urlPatterns = "/life", loadOnStartup = 1)
public class LifeServlet extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
log.info("Servlet 初始化");
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
log.info("Servlet 处理请求");
super.service(req, resp);
}
@Override
public void destroy() {
log.info("Servlet 被销毁");
super.destroy();
}
}
说明
init()
只调用一次,适合初始化资源service()
每次请求都会调用destroy()
只调用一次,适合释放资源loadOnStartup=1
表示容器启动时立即加载
Servlet 配置方式
1. 注解方式(推荐)
- 使用
@WebServlet
注解,简洁直观 - 支持 urlPatterns、name、initParams、loadOnStartup 等属性
@WebServlet(name = "DemoServlet", urlPatterns = {"/demo", "/test"}, loadOnStartup = 1)
2. web.xml 配置方式
- 适合老项目或需集中管理
web.xml 配置示例
<servlet>
<servlet-name>DemoServlet</servlet-name>
<servlet-class>com.example.servlet.DemoServlet</servlet-class>
<init-param>
<param-name>msg</param-name>
<param-value>Hello XML</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DemoServlet</servlet-name>
<url-pattern>/demo</url-pattern>
</servlet-mapping>
初始化参数与上下文参数
1. Servlet 初始化参数
- 可通过注解或 web.xml 配置
- 用于为 Servlet 提供配置信息
注解方式
@WebServlet(name = "ConfigServlet", urlPatterns = "/config", initParams = {
@WebInitParam(name = "site", value = "Java学习网"),
@WebInitParam(name = "author", value = "张三")
})
public class ConfigServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String site = getInitParameter("site");
String author = getInitParameter("author");
resp.getWriter().write(site + " - " + author);
}
}
2. 上下文参数(全局参数)
- 配置在 web.xml,所有 Servlet 可共享
web.xml 上下文参数
<context-param>
<param-name>version</param-name>
<param-value>1.0.0</param-value>
</context-param>
- 获取方式:
String version = getServletContext().getInitParameter("version");
部署与发布流程
- 开发完成后,打包为 war 包
- 将 war 包放入 Tomcat 的 webapps 目录
- 启动 Tomcat,自动解压并部署
- 通过浏览器访问对应 URL
Maven 打包命令
mvn clean package
热部署建议
- 开发阶段可用 IDE 插件或 Tomcat 热部署功能,提升效率
常见问题与小结
常见问题
- init/destroy 未调用:检查是否被容器管理,loadOnStartup 设置
- 参数获取为 null:检查注解或 web.xml 配置、参数名拼写
- 多路径映射冲突:避免不同 Servlet 映射同一 urlPattern
- war 包部署失败:检查包结构、Tomcat 日志
- 理解生命周期有助于资源管理与性能优化
- 推荐优先使用注解配置,web.xml 适合全局参数
- 部署前建议本地充分测试,关注容器日志
- 后续可学习过滤器、监听器等高级特性
本文为 Servlet 系列教程第三篇,下一篇将介绍过滤器与监听器,敬请期待!