如何在不重新编译的情况下覆盖servlet的@WebInitParam?

时间:2013-02-14 13:59:58

标签: java java-ee servlets servlet-3.0

我有一个带有以下@WebServlet注释的Java Servlet:

@WebServlet(urlPatterns={"/GetInfo"},
            initParams={
                @WebInitParam(name="directory.path", value="/appli/PdlInfo")})

如何在不重新编译servlet的情况下更改@WebInitParam的值?

2 个答案:

答案 0 :(得分:3)

在Servlet 3.0中,注释仅提供默认值。 只需使用web.xml文件(或部署时容器上可用的工具),您就可以更改它。无论哪种情况,您都需要为servlet提供一个有意义的名称:

    @WebServlet(
            name="GetInfo"
            urlPatterns={"/GetInfo"},
            initParams={@WebInitParam(name="directory.path",value="/appli/PdlInfo")}
    )

对于web.xml,这里有一个片段:

  <servlet>
    <servlet-name>GetInfo</servlet-name>
    <init-param>
        <param-name>directory.path</param-name>
        <param-value>/other/path</param-value>
    </init-param>
  </servlet>

答案 1 :(得分:0)

是否可以覆盖“directory.path”变量而无需重新编译该类。将web.xml文件添加到WEB-INF文件夹,该文件夹定义了一个新的init参数。

servlet-class更改为您正在使用的实际servlet类。

为了考虑更改,必须重新启动容器,但不需要重新编译/重建。

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <servlet>
        <servlet-name>MyServletLinkName</servlet-name>
        <servlet-class>your.path.to.servlet.YourServlet</servlet-class>
        <init-param>
            <param-name>directory.path</param-name>
            <param-value>/new/path</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>MyServletLinkName</servlet-name>
        <url-pattern>/GetInfo</url-pattern>
    </servlet-mapping>
</web-app>

修改

如果要使用在应用程序运行时更改的动态参数,可以使用由线程监视并以X秒为间隔进行检查的属性文件。

您可以使用包含文件位置的上下文参数以及上下文初始化的侦听器。侦听器创建一个观察程序线程,用于更新所有servlet都可以访问的公共变量。