【问题标题】:Is there a way to bind OGNL with Struts2 UI tags有没有办法将 OGNL 与 Struts2 UI 标签绑定
【发布时间】:2013-08-14 16:17:19
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: java session struts2 ognl valuestack


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的回复,我可以使用我在初始帖子中编写的 OGNL 语法从会话中检索值。但不知何故,它不会将值从 from 设置到会话中。我猜 struts2 会复制该值,而不是从会话中引用该对象。
    • @raito 我严重怀疑它是否会克隆,但我相信它没有工作没有问题,这是一件好事 - 这是一个可怕的做法。远距离的怪异动作应该留给量子物理学。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 感谢您的回复,但我们不打算使用其他框架。已经考虑过使用拦截器从动作中检索值并将其放入会话中,它仍然涉及双重工作。
    • @raito 上面提到的其他框架都是通过插件集成到Struts2中的,它只是一个合理的扩展。但如果您严格坚持使用 Struts2,您可能会发现 this 解决方案作为一种选择。
    • 正如 Dave 提到的,您只需要 SessionAware,您当然可以通过这种方式添加和修改会话属性。
    • @Quaternion,您也可以通过 ServletActionContext 访问会话变量。顺便说一句,我们的解决方案 atm 将对象放入 setter 中的会话
    • @ratio 你可以,但是会降低可测试性,推荐使用SessionAware。
    猜你喜欢
    • 1970-01-01
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 2022-01-22
    • 2019-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多