繁体   English   中英

在 web.xml 中引用环境变量

[英]Referencing Environment Variables in web.xml

我正在预先打包一个依赖于 web.xml 中的一些文件路径设置的 JSP web 应用程序。 这些设置在打包时是未知的,因为它们引用了客户在部署整个应用程序(其中 web 应用程序是管理界面)时将设置的路径。

似乎在我的安装程序脚本中避免令牌和文件修改的最简单方法是向用户询问安装位置,将此位置设置为环境变量(例如 JAVA_HOME),并让 web.xml 始终引用该变量。

有没有办法从 web.xml 中引用环境变量值? 谷歌搜索导致从 ejb xml 文件设置环境变量的 J2EE 方法。 这不是我要找的。

您可以在任何 tomcat xml 配置文件中使用 Ant 样式的变量替换,例如:

<servlet-mapping>
    <servlet-name>mvc-dispatcher</servlet-name>
    <url-pattern>${foo}</url-pattern>
</servlet-mapping>

其中fooJava 系统属性(sysprop)。

你不能直接使用操作系统环境变量(envvars),我想......

要使用 envvars,你可以把

set "CATALINA_OPTS=-DsomeJavaSysProp=%SOME_OS_ENVVAR%"

bin/setenv.bat (或类似地在bin/setenv.sh用于 *nix)。 您可能需要创建该文件。 Tomcat 会在启动时运行这个文件。

由于CATALINA_OPTS是一个 envvar(与命令行选项相反),系统上的其他用户不应该看到它(除了古老的 Unix),尽管我还没有对此进行测试。

http://tomcat.apache.org/tomcat-7.0-doc/config/

如果您使用的是 Spring,您可以创建一个<context:property-placeholder/> bean,然后直接在 Spring XML 配置文件(虽然不是web.xml )中使用 envvars 或 sysprops 。

我认为您不想使用环境变量(我认为无法从 web.xml 访问),而是使用环境条目[ 1 , 2 ]。 像这样:

<env-entry>
    <env-entry-name>Bla/SomeFilePath</env-entry-name>
    <env-entry-type>java.lang.String</env-entry-type>
    <env-entry-value>/opt/bla</env-entry-value>
</env-entry>

你可以使用 SomeFilePath 像:

InitialContext ic = new InitialContext();
String s = (String) ic.lookup("java:comp/env/ejb/Bla/SomeFilePath");

基本上,你不会那样做。 web.xml应该包含事物的默认值,是的,但是您应该在实际进行部署时覆盖它们。 如果您要部署到 Tomcat,则可以通过在用于部署的context.xml中包含适当的条目来完成此操作。 例如:

<Context path="/app">
    <!-- For things described by webapp parameters -->
    <Parameter name="foobar" value="grill" />

    <!-- For things described by environment entries -->
    <Environment name="Bla/SomeFilePath" type="java.lang.String"
            value="/opt/bla" />
</Context>

其他容器将有自己的机制来这样做。 您必须查找他们的文档(或使您的帮助请求更加集中)。

可以在 xml 文件中访问环境变量,如下所示:

${env.ENVIRONMENT_VARIABLE_NAME}

显然,用户帐户设置和访问问题可能存在问题,但我已尝试使用系统变量,并且可以正常工作!

我不完全清楚您的限制,但也许您可以这样做(我假设它是您尝试配置的 init-param):

1) 在 web.xml 中保留未指定的变量
2) 创建一个 ServletContextListener 并将其添加到您的应用程序中
3) 监听 servlet 的初始化
4) 在那个时候为 servlet 设置 init-param

我用类似的问题尝试过这个,但它对我来说失败了,因为结果证明 3rd 方 servlet(我也不想弄乱)实际上根本不像 servlet,所以上下文从未得到初始化。 但也许它在这里有机会......

您必须按顺序排列 env-entry:

<env-entry>
  <env-entry-name>maxAmount</env-entry-name>
  <env-entry-type>java.lang.String</env-entry-type>
  <env-entry-value>aString</env-entry-value>
</env-entry>

否则你会在 web.xml 上有验证错误

参考: https : //community.oracle.com/thread/840452? tstart =0

如果您使用的是Spring - 您可以通过ConfigurableBeanFactory.resolveEmbeddedValue管道FilterConfig以启用web.xml属性占位符插值支持。

用于使 FilterConfig 参数可解析的代理类。

public class ResolvableFilterConfig implements FilterConfig {

    private final FilterConfig source;
    private final ConfigurableBeanFactory resolver;

    public ResolvableFilterConfig(FilterConfig source, ConfigurableBeanFactory resolver) {
        this.source = source;
        this.resolver = resolver;
    }

    @Override
    public String getFilterName() {
        return source.getFilterName();
    }

    @Override
    public ServletContext getServletContext() {
        return source.getServletContext();
    }

    @Override
    public String getInitParameter(String name) {
        final String value = source.getInitParameter(name);
        return resolver.resolveEmbeddedValue(value);
    }

    @Override
    public Enumeration<String> getInitParameterNames() {
        return source.getInitParameterNames();
    }
}

过滤器实现示例代码

    @Override
    public void init(FilterConfig config) throws ServletException {
        // configure
        final ServletContext servletContext = config.getServletContext();
        final AbstractApplicationContext aac = (AbstractApplicationContext) getRequiredWebApplicationContext(servletContext);
        final ConfigurableBeanFactory beanFactory = aac.getBeanFactory();
        config = new ResolvableFilterConfig(config, beanFactory);
        // ... do the rest
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM