簡體   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