对Servlet的初始化的理解

    |     2015年5月6日   |   Servlet与Jsp   |     0 条评论   |    1784

Servlet 初始化时,容器会调用 init(ServletConfig config) 或无参 init()。ServletConfig 是接口,真正的实现类对象由容器实例化后再传进来。

web.xml 里给 Servlet 配的启动参数,也会在初始化时被容器收集,记进这份 ServletConfig。所以你能用 getInitParameter 把它们取出来。

要注意两点:初始化参数只能是字符串;覆盖带参 init 时记得 super.init(config),否则后面取不到配置。

一、init 由谁调用

结论先说:ServletConfig 由容器实例化。容器构造实现类对象,再把它传给 Servlet。GenericServlet 的带参 init 会把 config 存起来,再调无参 init(),所以日常覆盖无参版本即可。

public void init(ServletConfig config) throws ServletException {
    super.init(config);   // 必须先交给父类保存 config
    // 再做自己的一次性初始化:读参数、打开连接
}

二、初始化参数怎么传到 Servlet

在 web.xml 里用 <init-param> 配置。容器初始化 Servlet 时会收集这些参数,记录在 ServletConfig 的实现类中。之后用下面两个方法读取:

public String getInitParameter(String name);
public Enumeration getInitParameterNames();

结论:你对 Servlet 的配置,在初始化时都由容器收集并记进 ServletConfig。

三、一个 Servlet 配置示例

QQ╜╪═╝20161202093851

上图是把数据库配置文件路径写成初始化参数。Servlet 初始化完成后可以这样取:

String dbconf = this.getServletConfig().getInitParameter("dbConfig");

拿到的只是一个字符串。接下来可以用它去读配置文件,再初始化数据源。也可以传一个类名,再用反射实例化(原文 getInstance() 应写成 newInstance()):

// web.xml 里配置的值类似:cn.ittx.db.DBUtil
String dbconf = this.getServletConfig().getInitParameter("dbconfig");
Object db = Class.forName(dbconf).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的初始化的理解
本文链接地址:https://ai.zhousir.top/?p=627

上一篇:

下一篇:

回复 取消