在Java Web开发中。常量信息通常倾向于写在配置文件中。这样需求变化时只需要修改一下配置文件就可以了。而不用大量的改动代码并造成程序的重新编译。web.xml提供了这种配置初始化参数的功能。
<servlet>
<servlet-name>ServletParamTest</servlet-name>
<servlet-class>servlet.ServletParamTest</servlet-class>
<init-param>
<param-name>helloween</param-name> <!--第一个参数-->
<param-value>password</param-value> <!--第一个参数的参数值-->
</init-param>
<init-param>
<param-name>admin</param-name> <!--第二个参数-->
<param-value>admin</param-value> <!--第二个参数的参数值-->
</init-param>
<init-param>
<param-name>babyface</param-name> <!--第三个参数-->
<param-value>babyface</param-value> <!--第二个参数的参数值-->
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ServletParamTest</servlet-name>
<url-pattern>/servlet</url-pattern>
</servlet-mapping>
怎样取得Servlet初始化参数?
通过ServletConfig接口的getInitParameter(java.lang.String name)方法。
getServletConfig()该方法定义在Servlet接口中,返回ServletConfig接口的引用。
所有的servlet都继承了该方法。当容器实例化一个servlet之前,会从web.xml中读取这个servlet的初始化参数,并把这些参数交给ServletConfig,然后在调用init()方法时,容器会传送这个ServletConfig的引用到servlet。每个servlet都会有一个唯一的ServletConfig引用。一旦有了ServletConfig的引用就可以调用getInitParameter()方法来取得我们在servlet中设置的初始化参数。
还可以使用方法getInitParameterNames()来返回所有配置参数的名称的集合。这个集合为枚举类型。这种配置方式只可以在该Servlet种才可对其实现取值。而其他的Servlet中则不可以。因为它是配置在某一个<servlet></servlet>配置节内的。
举一个取值的例子:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("GBK");
response.setCharacterEncoding("GBK");
response.setContentType("text/html");
Enumeration parmas=this.getInitParameterNames(); //只获得所有参数名称。而不获得参数值
while(parmas.hasMoreElements()) //判断条件为枚举类型里是否有至少一个值
{
String name1=(String) parmas.nextElement(); //获取下一个参数名称
String name=getInitParameter(name1); //根据参数名称获得参数值
request.setAttribute("name", name);
}
response.sendRedirect("index.jsp");
而要做到每个Servlet中都可取到的参数则需要上下文参数。
上下文初始化参数与Servlet初始化参数类似,区别是上下文初始化参数对整个web应用而不是Servlet初始化参数只对应一个servlet。
在web应用的整个生命周期中上下文初始化参数都存在,任意的servlet和jsp都可以随时随地的访问它。
上下文初始化参数对应于整个web应用,因此它不在某个servlet元素内。一个web应用有一个ServletContext,而一个servlet有一个ServletConfig
而它需要使用标签<context-param>来配置
<context-param>
<param-name>helloween</param-name> <!--第一个参数-->
<param-value>password</param-value> <!--第一个参数的参数值-->
</context-param>
<context-param>
<param-name>admin</param-name> <!--第二个参数-->
<param-value>admin</param-value> <!--第二个参数的参数值-->
</context-param>
<context-param>
<param-name>babyface</param-name> <!--第三个参数-->
<param-value>babyface</param-value> <!--第二个参数的参数值-->
</context-param>
获取context-param可以使用ServletContext对象。
Servlet中通过getServletConfig().getServletContext()来获取ServletContext对象,使用该对象的getInitParameter()方法获取指定名称的参数值。getInitParameterNames()获取所有参数名称。
servlet的ServletConfig对象拥有该servlet的ServletContext的一个引用,所以可这样取得上下文初始化参数;
getServletConfig().getServletContext().getInitParameter()
也可以在servlet中直接调用getServletContext().getInitParameter(),两者是等价的
在Java 5.0里开始引入注解的概念。而是用注解可以实现不用Servlet主动读取配置的参数。而由WEB容器启动时自动把web.xml里配置的信息注射到Servlet里。不需要编写任何代码。
我们在配置servlet的时候,可能需要在启动servlet的时候给他初始化一些参数,这样我们可以在web.xml配置文件中对servlet进行配置。
< ?xml version="1.0" encoding="UTF-8"?>
< web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
< display-name>strutsDemo< /display-name>
< jsp-config>
< taglib>
< taglib-uri>/WEB-INF/struts-bean.tld< /taglib-uri>
< taglib-location>/WEB-INF/struts-bean.tld< /taglib-location>
< /taglib>
< taglib>
< taglib-uri>/WEB-INF/struts-html.tld< /taglib-uri>
< taglib-location>/WEB-INF/struts-html.tld< /taglib-location>
< /taglib>
< taglib>
< taglib-uri>/WEB-INF/struts-logic.tld< /taglib-uri>
< taglib-location>/WEB-INF/struts-logic.tld< /taglib-location>
< /taglib>
< taglib>
< taglib-uri>/WEB-INF/struts-tiles.tld< /taglib-uri>
< taglib-location>/WEB-INF/struts-tiles.tld< /taglib-location>
< /taglib>
< taglib>
< taglib-uri>/WEB-INF/struts-nested.tld< /taglib-uri>
< taglib-location>/WEB-INF/struts-nested.tld< /taglib-location>
< /taglib>
< /jsp-config>
< servlet>
< servlet-name>action< /servlet-name>
< servlet-class>org.zy.pro.strutsdemo.control.ApplicationActionServlet< /servlet-class>
< init-param>
< param-name>config< /param-name>
< param-value>/WEB-INF/struts-config.xml< /param-value>
< /init-param>
< init-param>
< param-name>debug< /param-name>
< param-value>2< /param-value>
< /init-param>
< load-on-startup>2< /load-on-startup>
< /servlet>
< servlet-mapping>
< servlet-name>action< /servlet-name>
< url-pattern>*.do< /url-pattern>
< /servlet-mapping>
< servlet>
< servlet-name>onefileuploadservlet< /servlet-name>
< servlet-class>org.zy.pro.strutsdemo.servlet.OneFileUploadServlet< /servlet-class>
< init-param>
< param-name>a< /param-name>
< param-value>aaaaaaaaaa< /param-value>
< /init-param>
< /servlet>
< servlet-mapping>
< servlet-name>onefileuploadservlet< /servlet-name>
< url-pattern>/onefileupload< /url-pattern>
< /servlet-mapping>
< servlet>
< description>Added by JBuilder to compile JSPs with debug info< /description>
< servlet-name>debugjsp< /servlet-name>
< servlet-class>org.apache.jasper.servlet.JspServlet< /servlet-class>
< init-param>
< param-name>classdebuginfo< /param-name>
< param-value>true< /param-value>
< /init-param>
< load-on-startup>3< /load-on-startup>
< /servlet>
< servlet-mapping>
< servlet-name>debugjsp< /servlet-name>
< url-pattern>*.jsp< /url-pattern>
< /servlet-mapping>
< /web-app>
如我们以上代码中的蓝色部分。即实现了我们的配置,那么我们如何在我们的servlet中使用呢?
我们看我们的servlet部分代码:
//Process the HTTP Post request
public void doPost(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
String a = this.getInitParameter("a");
System.out.println(" the a parameter initialize when loading : " +
a);
在我们的处理post的代码中,我们可以取得我们的配置参数。
之后,我们就可以对此参数进行处理了。
如果我们通过次配置使用一个xml来实现对servlet的扩展配置的话,那么我们此时得到的是一个xml文件的路径,那么我们可以通过对xml的读取和解析来取得我们想要的参数。
但是,我们不能在启动的时候给servlet初始化一个非String类的实例,如:
< init-param>
< param-name>util< /param-name>
< param-value>org.lyj.commons.util.DigestUtil< /param-value>
< /init-param>
这种配置是错误的。因为我们的getInitParameter()方法仅能得到一个字符串类型的返回值。
HelloWorldServlet.java
- package jp.co.xiehl.servlet.ch7;
- import java.io.IOException;
- import java.io.PrintWriter;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- public class HelloWorldServlet extends HttpServlet {
- private String driver;
- private String url;
- private String password;
- private String user;
- private static final long serialVersionUID = -5370049563045822665L;
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- PrintWriter out = resp.getWriter();
- out.println("<html>");
- out.println("<head>");
- out.println("<title>HelloWorld</title>");
- out.println("</head>");
- out.println("<body bgcolor=/"lightblue/">");
- out.println("<hr>");
- out.println("DRVER is " + driver);
- out.println("URL is " + url);
- out.println("USER is " + user);
- out.println("PSSSW is " + password);
- out.println("</body>");
- out.println("</html>");
- }
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- doPost(req, resp);
- }
- @Override
- public void init() throws ServletException {
- super.init();
- driver = getInitParameter("driver");
- url = getInitParameter("url");
- user = getInitParameter("user");
- password = getInitParameter("password");
- }
- }
package jp.co.xiehl.servlet.ch7; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class HelloWorldServlet extends HttpServlet { private String driver; private String url; private String password; private String user; private static final long serialVersionUID = -5370049563045822665L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter out = resp.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>HelloWorld</title>"); out.println("</head>"); out.println("<body bgcolor=/"lightblue/">"); out.println("<hr>"); out.println("DRVER is " + driver); out.println("URL is " + url); out.println("USER is " + user); out.println("PSSSW is " + password); out.println("</body>"); out.println("</html>"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override public void init() throws ServletException { super.init(); driver = getInitParameter("driver"); url = getInitParameter("url"); user = getInitParameter("user"); password = getInitParameter("password"); } }
web.xml配置
- <servlet>
- <servlet-name>HelloWorld</servlet-name>
- <servlet-class>jp.co.xiehl.servlet.ch7.HelloWorldServlet</servlet-class>
- <init-param>
- <param-name>driver</param-name>
- <param-value>aaaaaa-8</param-value>
- </init-param>
- <init-param>
- <param-name>url</param-name>
- <param-value>127.1.1.1</param-value>
- </init-param>
- <init-param>
- <param-name>user</param-name>
- <param-value>ccc</param-value>
- </init-param>
- <init-param>
- <param-name>password</param-name>
- <param-value>ddd</param-value>
- </init-param>
- </servlet>
- <servlet-mapping>
- <servlet-name>HelloWorld</servlet-name>
- <url-pattern>/hello</url-pattern>
- </servlet-mapping>
<servlet> <servlet-name>HelloWorld</servlet-name> <servlet-class>jp.co.xiehl.servlet.ch7.HelloWorldServlet</servlet-class> <init-param> <param-name>driver</param-name> <param-value>aaaaaa-8</param-value> </init-param> <init-param> <param-name>url</param-name> <param-value>127.1.1.1</param-value> </init-param> <init-param> <param-name>user</param-name> <param-value>ccc</param-value> </init-param> <init-param> <param-name>password</param-name> <param-value>ddd</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>HelloWorld</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping>
执行: