【问题标题】:Parametric file inclusion in struts.xml configurations, based on properties参数文件包含在 struts.xml 配置中,基于属性
【发布时间】:2015-12-18 10:44:29
【问题描述】:

我有一个 Web 应用程序(基于 Spring,Struts 2 构建),我正在尝试基于属性在主 struts.xml 配置中动态包含一个 struts 配置文件。

已定义,在属性文件中:

key=foo

我尝试在 struts.xml 中使用它:

<struts>
   ...
   <include file="/config/struts/struts-${key}.xml" />
</struts>

包含“struts-foo.xml”文件(或其他文件,取决于值)。

属性文件由 Spring 在启动时加载,我可以在 Spring 的 xml 文件中使用它来参数化 bean 定义。

【问题讨论】:

  • struts.xml 文件没有被 spring 加载。
  • 感谢亚历山大;还有其他方法可以读取 struts 文件中的属性/参数吗?
  • 您可以在构建应用程序时替换关键字。或者在 struts.xml 中包含所有文件并仅将其中的一些复制到包中。
  • 是的,这听起来绝对是 Maven 任务(或其他)的工作。还要记住,为了实现完全的可测试性,构建的可重复性很重要,因此(在完美的世界中)构建应该始终相同,无论环境是 dev 还是 prod,并且配置应该是外部的它,例如在环境变量或服务器本身的文件中。也就是说,为什么需要包含不同的 struts.xml ?这是一个奇怪的用例,most likely XY
  • @AndreaLigios 我正在开发一个 web 应用程序,它将在两个不同的站点上运行:它们将非常相似,但有一些小的自定义,比如说 85% 的通用对 15% 的自定义。在我工作的地方,我们通常通过分支整个代码库或使用if(site1)..else if (site2) 填充代码来解决这个问题,我不喜欢这些解决方案......这是一种模块化定制的尝试,并且只根据本地安装,由属性引导(在这些问题中,我询问的是动作映射,但我使用相同的系统来加载不同的 spring bean)。

标签: spring properties struts2


【解决方案1】:

您可以利用 Struts2 插件框架。

您基本上创建了一个基于 jar 的项目,其中包含所有特定客户端的操作映射、支持类等。如果您还部署到 Servlet 3.0 或更高版本的容器中,您还可以选择在其中包含 UI 工件jar 的 META-INF\resources 目录也用于干净的打包。

现在,您通常将内容放在 struts.xml 中以进行操作映射,您只需将其放在 struts-plugin.xml 中,然后将此 xml 文件放在 jar 文件的根目录中。

当 Struts2 框架启动时,jar 文件将被扫描,struts-plugin.xml 文件将被拾取并自动包含在您的应用程序中。

我将相同的设置与我的 maven 构建过程结合使用,以便如果客户的部署不包含特定功能或要自定义标准功能,我可以自定义库存的操作映射.

在我们的例子中,stock 应用程序是一个基于 struts-plugin 的 jar,它在任何其他 jar 之前加载,然后加载后续功能 jar 以扩展或覆盖功能。实际的 WAR 项目内部很少,主要是用于部署其他项目工件组合的工件。

【讨论】:

    【解决方案2】:

    如您所知,您可以更改 struts.xml 配置文件名,如下所示:

    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
        <init-param>
            <param-name>config</param-name>
            <param-value>struts-config.xml</param-value>
        </init-param>
    </filter>
    

    您可以使用此功能动态更改 struts.xml。

    您需要扩展 StrutsPrepareAndExecuteFilter 并在此处加载您的动态配置。用web.xml中的struts替换你的新过滤器。

    public class MyStrutsPrepareAndExecuteFilter extends StrutsPrepareAndExecuteFilter{
    
        @Override
        protected void postInit(Dispatcher dispatcher, FilterConfig filterConfig) {
            //load your config here        
    
        }
    
    }
    

    请查看StrutsPrepareAndExecuteFilter 源代码。您可以查看配置的加载方式以及如何更改它。


    如果您只想动态更改应用程序消息,只需在 MyStrutsPrepareAndExecuteFilter 中调用 LocalizedTextUtil.addDefaultResourceBundle ("messages/customize") 即可更轻松地做到这一点

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-30
      • 1970-01-01
      • 2011-07-22
      • 1970-01-01
      • 2010-10-01
      相关资源
      最近更新 更多