如何在 Struts 2 中将对象公开给我的所有视图?

Posted

技术标签:

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

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

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

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

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

【问题讨论】:

【参考方案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 错误日志并没有真正的帮助,而且您会在每个动作开始时松散性能处理逻辑,而不是将其与继承一起使用。

【讨论】:

以上是关于如何在 Struts 2 中将对象公开给我的所有视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何在struts 2中将迭代器索引值传递给Javascript?

如何在 OpenGL ES 2.0 中将视图/模型/投影矩阵传递给我的顶点着色器?

如何在 swift 3 中将单个对象作为参数发布到 http 请求中

如何在 Struts 2 中将 JSON 绑定到 bean

Struts2从一个action转到另一个action的两种方法

无法在 Qt android 5.7 中将 QtQuick2 对象公开给嵌入的 html