【问题标题】:How can I expose an object to all of my views in Struts 2?如何在 Struts 2 中将对象公开给我的所有视图?
【发布时间】:2016-06-11 11:07:25
【问题描述】:

我有一个使用带有 Freemarker 模板的 Struts 2 和 Spring 4 的 Web 应用程序。

我有一些配置字符串存储在.properties 文件中,我需要在每个页面上呈现它们(例如,我们的 CDN 路径,其中包含一个版本字符串)。现在这些属性由 Spring 读取并存储在 org.springframework.core.env.Environment 的实例中。

有没有一种简单的方法可以让我的所有视图都可以访问我的 Environment 实例?

我们有另一个应用程序通过动作继承来做到这一点,其中一个基类有一个getEnvironment() 方法。我不喜欢这种方法,因为每个动作都必须扩展基类。

【问题讨论】:

    标签: java spring properties struts2 freemarker


    【解决方案1】:

    编写一个拦截器来拦截每个动作,并将这个拦截器添加到自定义拦截器堆栈中。这个栈你应该做一个默认的拦截器栈。

    <interceptors>
      <interceptor name="myinterceptor" class="com.company.interceptor.MyInterceptor"/>
      <interceptor-stack name="customStack">
        <interceptor-ref name="myinterceptor"/>
        <interceptor-ref name="defaultStack"/>
      </interceptor-stack>
    </interceptors>
    <default-interceptor-ref name="customStack"/>
    

    myinterceptor的实现中,从应用上下文中获取bean并放到值栈中。在每个 JSP 中,您都可以使用 OGNL 访问值堆栈的对象。

    有关如何编写自定义拦截器的更多信息,请参阅文档Writing Interceptors

    【讨论】:

      【解决方案2】:

      将您的逻辑放入一个 bean(例如 Configuration.java)中,然后将其注入(通过 Spring DI、Java EE CDI 或其他)在所有需要它的操作中,并通过 Getter 公开。

      但我不会低估继承方法这里,它并没有你描述的那么糟糕,因为你可以在遍历的同时构建你的继承树添加规范它:一个 BaseAction,一些 Sub-BaseActions,一些 sub-sub... 等等。Read more.

      如果您稍后发现同级 BaseAction 需要您放置在 BaseAction 上的某些内容,只需将其上移一级(在父 BaseAction 中,直到第一个,对所有人都通用)。

      【讨论】:

      • 感谢您的意见。我选择使用继承。
      • 我同意,您的所有操作很可能共享一组通用的有用方法(数据库连接、从上下文中检索对象、日志记录、公共资源的路径、用户代理信息、IP、等等.. )。所有这些东西可能最终都会出现在您的 BaseAction 中。
      • @fustaki 可以通过支持答案来表示同意 :)
      【解决方案3】:

      嗯,我认为继承解决方案非常适合您的问题,您的所有控制器都需要这些属性,因此它是最好和最合乎逻辑的方法。

      您可以尝试 Roman 刚刚告诉您的拦截器解决方案,但我认为拦截器的配置有点棘手,并且当拦截器内部出现问题并且您有一个大型应用程序时,Struts2 错误日志并没有真正的帮助,而且您会在每个动作开始时松散性能处理逻辑,而不是将其与继承一起使用。

      【讨论】:

        猜你喜欢
        • 2020-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-31
        • 1970-01-01
        • 2017-02-03
        相关资源
        最近更新 更多