如何将一个对象暴露给 Struts 2 中的所有视图?

How can I expose an object to all of my views in Struts 2?

我有一个使用 Struts 2 和 Freemarker 模板的 Web 应用程序,以及 Spring 4.

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

的实例中

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

我们有另一个应用程序通过动作继承来执行此操作,其中基 class 有一个 getEnvironment() 方法。我不喜欢这种方法,因为每个动作都必须扩展基础 class.

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

<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

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

暴露

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

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

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

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