有没有办法将OGNL与Struts2 UI标记绑定

时间:2013-08-14 16:17:20

标签: java session struts2 ognl valuestack

我正在使用Struts2开发一个webapp。我曾经使用过Struts1

有没有办法直接将会话对象引用到JSP,这样如果我更改了公式中的值,引用的会话对象中的值也将被更新。

<s:textfield name="%{#session.order.amount}"/>

例如我有一个会话对象顺序,它具有带getter和setter的属性数量。

似乎,在我将一些值放入textfield然后提交页面后,会话中的值没有得到更新。

目前我正在使用另一种方法,该方法在动作属性的setter中包含session.put()。我个人不喜欢现在的解决方案。

2 个答案:

答案 0 :(得分:1)

您可以尝试将名称设为 string session.order.amount,并使您的操作实现SessionAware,并公开会话。目前,您已将名称设置为session.order.amount

我不知道它是否会起作用,你可能需要使用数组/收集符号,但我不知道为什么不会工作。

那就是说,我觉得直接将视图层写入到web app内部是一个坏主意。

答案 1 :(得分:1)

默认情况下,从表单bean放置到会话作用域的Struts1,或者只是通过设置属性值scope="session",一切都很好。

在Struts2中,您还没有形成bean,也没有会话范围的 bean。要使用会话范围的 bean,您需要自己实现它,或者使用其他框架,如Spring,Guice或CDI,其中会话范围已实现并可供用户使用。

另一方面,Struts2大量使用拦截器,它为您提供了scope interceptorscopedModelDriven interceptor等附加功能,允许您将一些操作属性放入会话范围。每次执行操作时,它都会初始化属性,引用对象放在会话范围上。

如果没有这个辅助拦截器,你总是可以通过实现SessionAware(参见How do we get access to the session)来拦截会话对象,并在执行动作时初始化属性,即prepare()方法,因为它是注入会话映射后进行。将初始化程序放入访问器是一个坏主意。