对Servlet的初始化的理解
Servlet 初始化时,容器会调用 init(ServletConfig config) 或无参 init()。ServletConfig 是接口,真正的实现类对象由容器实例化后再传进来。
web.xml 里给 Servlet 配的启动参数,也会在初始化时被容器收集,记进这份 ServletConfig。所以你能用 getInitParameter 把它们取出来。
要注意两点:初始化参数只能是字符串;覆盖带参 init 时记得 super.init(config),否则后面取不到配置。
一、init 由谁调用
结论先说:ServletConfig 由容器实例化。容器构造实现类对象,再把它传给 Servlet。GenericServlet 的带参 init 会把 config 存起来,再调无参 init(),所以日常覆盖无参版本即可。
二、初始化参数怎么传到 Servlet
在 web.xml 里用 <init-param> 配置。容器初始化 Servlet 时会收集这些参数,记录在 ServletConfig 的实现类中。之后用下面两个方法读取:
结论:你对 Servlet 的配置,在初始化时都由容器收集并记进 ServletConfig。
三、一个 Servlet 配置示例
上图是把数据库配置文件路径写成初始化参数。Servlet 初始化完成后可以这样取:
拿到的只是一个字符串。接下来可以用它去读配置文件,再初始化数据源。也可以传一个类名,再用反射实例化(原文 getInstance() 应写成 newInstance()):
结论:web.xml 对 Servlet 的初始化,只能传递字符串类型的数据。
| 对象 | 谁创建 | 作用范围 | 典型用途 |
|---|---|---|---|
| ServletConfig | 容器,每个 Servlet 一份 | 当前 Servlet | 读 <init-param>、取 ServletContext |
| ServletContext | 容器,每个 Web 应用一份 | 整个应用 | 共享属性、读上下文参数、拿真实路径 |
四、ServletContext
ServletContext 负责和「上下文」交互:向上对接 Servlet 容器,向下对接请求和响应。在 ServletConfig 上调用 getServletContext() 就能拿到当前应用的上下文对象。
它同样是接口,实现对象也是 Servlet 初始化时由容器创建的——这点和 ServletConfig 相同。应用级共享数据(例如数据源)通常放在 Context 属性里,而不是每个 Servlet 自己藏一份。
扩展阅读:深入分析 JavaWeb Item6 —— servletConfig 与 servletContext。
一句话总结:初始化参数只是字符串:容器写入 ServletConfig,再通过 ServletContext 连到整个应用。
转载请注明来源:对Servlet的初始化的理解








