4.5.1 获取Web应用程序的初始化参数
在server.xml文件和web.xml文件中都可以设置Web应用程序的初始化参数。通过设置Web应用程序的初始化参数,可以在不需要修改程序的前提下,改变Web应用程序的某些设置。如一个Web应用程序可能不只运行在一家公司,如果将该程序部署在某一家公司,而且公司名称被设置成为Web应用程序的初始化参数。这时就可以直接修改初始化参数就可以将公司名设置成这家公司的名称。
在ServletContext接口中定义了getInitParameter方法和getInitParameterNames方法来访问Web应用程序的初始化参数,其中getInitParameter方法可以通过初始化参数名获得参数值,而getInitParameterNames可以获得保存所有初始化参数名的Enumeration对象。
在web.xml文件中配置Web应用程序的初始化参数需要使用<context-param>元素,下面是一个在web.xml文件中配置初始化参数的例子:
<web-app ... >
<context-param>
<param-name>companyName</param-name>
<param-value>Sun公司</param-value>
</context-param>
... ...
</web-app>
如果想在server.xml中配置Web应用程序的初始化参数,需要在当前Web应用程序的<Context>标签中使用<Parameter>子标签来配置初始化参数,代码如下:
<Context docBase="demo" path="/demo" reloadable="true"
source="org.eclipse.jst.jee.server:demo">
<!-- 配置Web应用程序的初始化参数 -->
<Parameter name = "myParam" value = "newValue " override="true" />
</Context>
其中override属性值如果为true,表示web.xml文件中的初始化参数可以覆盖server.xml文件中的同名初始化参数,也就是说,当override属性为true时,如果web.xml文件和server.xml文件中有同名的初始化参数,以web.xml文件中的初始化参数为准。当override属性为false时,以server.xml文件中的同名初始化参数为准。override属性的默认值是true。
例子 : 读取Web应用程序的初始化参数
1. 配置Web应用程序的初始化参数
由于本书使用的IDE是Eclipse IDE for Java EE,这个IDE使用了自己的server.xml文件,因此,如果在该IDE中测试本例的程序,不能在<Tomcat安装目录>\conf\server.xml文件中设置Web应用程序的初始化参数,而应该在IDE所使用的server.xml文件中设置这些参数。
如果在Eclipse IDE for Java EE配置了Tomcat作为Web服务器,那么会在【Project Explorer】页中添加一个Servers工程。其中该IDE所使用的server.xml文件就在其中的【Tomcat v6.0 Server-config】节点中,如图4.6所示。
图4.6 server.xml文件的位置
双击server.xml打开该文件后,找到如下的配置代码:
<Context docBase="demo" path="/demo" reloadable="true" source="org.eclipse.jst.jee.server:demo"/>
将上面的配置代码修改成下面的形式:
<Context docBase="demo" path="/demo" reloadable="true"
source="org.eclipse.jst.jee.server:demo">
<Parameter name = "myParam" value = "newValue" override = "false" />
<Parameter name = "myParam1" value = "newValue1" override = "true" />
</Context>
下面来配置web.xml中的初始化参数,打开web.xml文件,在<web-app>元素中添加如下的配置代码:
<!-- 配置第一个Web应用程序的初始化参数 -->
<context-param>
<param-name>companyName</param-name>
<param-value>Sun公司</param-value>
</context-param>
<!-- 配置第二个Web应用程序的初始化参数 -->
<context-param>
<param-name>myParam</param-name>
<param-value>myParamValue</param-value>
</context-param>
在server.xml和web.xml文件中有一个同名的初始化参数myParam,由于在server.xml文件中的<Parameter>元素的override属性值为false,因此,使用getInitParameter方法读出来的是在server.xml文件中配置的参数值newValue。
2. 编写ContextParamServlet类
在ContextParamServlet类中通过getInitParameterNames方法得到保存所有初始化参数名的Enumeration对象,并逐个扫描初始化参数名,并通过getInitParameter方法获得相应的初始化参数值。ContextParamServlet类的代码如下:
public class ContextParamServlet extends HttpServlet
{
protected void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException
{
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("Web应用程序的初始化参数列表<p/>");
ServletContext context = getServletContext();
// 获得所有的初始化参数名称
Enumeration<String> params = context.getInitParameterNames();
while(params.hasMoreElements())
{
// 获得当前初始化参数名
String key = params.nextElement();
// 获得当前初始化参数值
String value = context.getInitParameter(key);
out.println(key + " = " + value + "<br/>");
}
}
}
下面是ContextParamServlet类的配置代码:
<servlet>
<servlet-name>ContextParamServlet</servlet-name>
<servlet-class>chapter4.ContextParamServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ContextParamServlet</servlet-name>
<url-pattern>/ContextParamServlet</url-pattern>
</servlet-mapping>
3. 测试ContextParamServlet类
在浏览器地址栏中输入如下的URL:
http://localhost:8080/demo/ContextParamServlet
浏览器显示的结果如图4.7所示。
图4.7 Web应用程序的初始化参数列表
4. 程序总结
从图4.7的显示结果可以看出,使用getInitParameterNames方法获得的初始化参数列表既包括在server.xml文件中配置的初始化参数,也包括在web.xml文件中配置的初始化参数。其中myParam1参数只在server.xml文件中配置,并未在web.xml中配置。而myParam参数同时在server.xml和web.xml文件中配置,但由于<Parameter>元素的override属性值为false,因此,myParam参数的值以server.xml文件中的配置为准。