0

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

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

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

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

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

目前我正在使用另一种方法,该方法涉及session.put()动作属性的设置器。我个人不喜欢我目前的解决方案。

4

2 回答 2

1

您可以尝试将名称作为字符串 session.order.amount并使您的操作实现 SessionAware,并公开会话。当前,您正在将名称设置session.order.amount.

我不知道它是否会起作用,您可能需要使用数组/集合表示法,但我不知道为什么它不起作用

也就是说,我觉得直接将视图层写入Web 应用程序内部是一个坏主意。

于 2013-08-14T16:30:46.850 回答
1

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

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

另一方面,Struts2 大量使用拦截器,它为您提供额外的功能,如scope拦截器,或scopedModelDriven拦截器,允许您将一些操作属性放入会话范围。每次执行操作时,它都会初始化属性,引用对象放在会话范围内。

如果没有这个帮助拦截器,你总是可以通过实现来拦截会话对象SessionAware(请参阅我们如何访问会话)并在执行操作时在某处初始化属性,即prepare()方法,因为它是在会话映射被注入之后进行的。将初始化程序放入访问器是一个坏主意。

于 2013-08-14T18:33:12.900 回答