有些时候,书再厚也无法涵盖一切细节。 比如说今天我在学习过程中遇到这样的一个问题:Servlet初始化参数与上下文初始化参数的获取方法,在书中略为带过而已。但调试的时候总是报错,步骤一致,结果却不一样。后来经过自己不断测试和查找相关文章阅读,总算是解决了这个问题。以下对问题解决方法的描述基于网络上已有的文章,这里感谢他们的工作。
Servlet初始化参数:
Servlet初始化参数定义在web.xml中的一个servlet元素中,例如:
<servlet>
<servlet-name>test</servlet-name>
<servlet-class>com.bk.Test</servlet-class>
<init-param>
<param-name>default-time</param-name>
<param-value>60</param-value>
</init-param>
</servlet>
可以有若干个<init-param>对。
怎样取得Servlet初始化参数?
A 单个参数值的获取
通过ServletConfig接口的getInitParameter(java.lang.String name)方法。
getServletConfig()该方法定义在Servlet接口中,返回ServletConfig接口的引用。
所有的servlet都继承了该方法。当容器实例化一个servlet之前,会从web.xml中读取这个servlet的初始化参数,并把这些参数交给ServletConfig,然后在调用init()方法时,容器会传送这个ServletConfig的引用到servlet。每个servlet都会有一个唯一的ServletConfig引用。一旦有了ServletConfig的引用就可以调用getInitParameter()方法来
取得我们在servlet中设置的初始化参数。
B 多个参数值的获取
需要注意:
1 web.xml的写法:
<servlet>
<servlet-name>testContextParam</servlet-name>
<servlet-class>testContextParam</servlet-class>
<init-param>
<param-name>nameInit</param-name>
<param-value>nameInit</param-value>
</init-param>
<init-param>
<param-name>ageInit</param-name>
<param-value>ageInit</param-value>
</init-param>
<init-param>
<param-name>sexInit</param-name>
<param-value>sexInit</param-value>
</init-param>
</servlet>
这里我犯了两个错误:首先,我将<init-param>标签置于<servlet>标签之外,结果获取的结果总是null。其次,我将多个初始化参数错误地写成:
<init-param>
<param-name>nameInit</param-name>
<param-value>nameInit</param-value>
<param-name>ageInit</param-name>
<param-value>ageInit</param-value>
<param-name>sexInit</param-name>
<param-value>sexInit</param-value>
</init-param>
结果使用以下的获取方式总是只能读到最后一个参数的信息。
2 获取方式:
public void service(ServletRequest req,ServletResponse res) throws
ServletException,IOException{
...
out.println("init parameters");
Enumeration myEnum=getInitParameterNames();
while(myEnum.hasMoreElements()){
String name=(String)myEnum.nextElement();//取得参数名
out.println(name+":"+getInitParameter(name));//获取参数值
}
...
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
上下文初始化参数:
上下文初始化参数与Servlet初始化参数类似,区别是上下文初始化参数对整个web应用而不是Servlet初
始化参数只对应一个servlet。
在web应用的整个生命周期中上下文初始化参数都存在,任意的servlet和jsp都可以随时随地的访问它。
在web.xml中的配置例子如下:
<context-param>
<param-name>default-time</param-name>
<param-value>60</param-value>
</context-param>
上下文初始化参数对应于整个web应用,因此它不在某个servlet元素内。一个web应用有一个ServletContext,而一个servlet有一个ServletConfig。
怎样取得上下文初始化参数?
servlet的ServletConfig对象拥有该servlet的ServletContext的一个引用,所以可这样取得上下文初始化参数;
getServletConfig().getServletContext().getInitParameter()
也可以在servlet中直接调用getServletContext().getInitParameter(),两者是等价的。