我有一个使用带有Freemarker模板的Struts2和Spring4的Web应用程序。
我有一些存储在.properties
文件中的配置字符串,我需要在每个页面上呈现(例如,我们的CDN路径,其中包含版本字符串)。现在,这些属性由spring读取并存储在org.springframework.core.env.Environment
的实例中。
是否有一种简单的方法可以让我的环境实例可以访问我的所有视图?我们有另一个应用程序通过动作继承来实现这一点,其中基类具有getEnvironment()
方法。我不喜欢这种方法,因为每个动作都必须扩展基类。
答案 0 :(得分:4)
将您的逻辑放在一个bean(例如Configuration.java)中,然后在需要它的所有操作中注入(通过Spring DI,Java EE CDI或其他),并通过Getter公开。
但是我不会低估继承方法 here ,它并不像你描述它那么糟糕,因为你可以在遍历时构建你的继承树添加规范它:一个BaseAction,一些Sub-BaseActions,一些子子......等等。slim3
branch。
如果您稍后发现兄弟BaseActions需要您放置在BaseAction上的东西,只需向上移动一级(在父级BaseAction中,直到第一个,每个人都相同)。
答案 1 :(得分: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
get bean并将其放在值栈上。在每个JSP中,您都可以使用OGNL访问值堆栈的对象。
答案 2 :(得分:1)
嗯,我认为继承解决方案非常适合您的问题,所有控制器都需要这些属性,因此这是最好和最合乎逻辑的方法。
您可以尝试像Roman刚刚告诉您的拦截器解决方案,但我认为拦截器配置有点棘手,Struts2错误日志在拦截器内部出现问题并且您有大量应用程序时并没有真正帮助,而且,在每个动作的开始时你都会松开性能处理逻辑,而不是将它与继承一起使用。