【问题标题】:OGNL/Struts2 JSP assigning bean to an objectOGNL/Struts2 JSP 将 bean 分配给对象
【发布时间】:2014-11-28 22:46:43
【问题描述】:

在 Struts2 / OGNL 页面中,是否可以根据条件将任何类型的 bean 分配给对象?

例如,

  <s:if test"%{customer != null}">
       <s:set var="someobject" value="customer">
  </s:if>
  <s:else>
       <s:set var="someobject" value="user">
  </s:else>

【问题讨论】:

  • 有什么问题?
  • 我没有找到任何类似的例子,也不知道它是否有效。我必须根据它的工作原理来决定设计!

标签: jsp parameters struts2 ognl struts-tags


【解决方案1】:

&lt;s:set&gt; tag 将变量存储在作为映射的值堆栈上下文中。因此,任何对象都可以在var 属性中指定的键下设置。如果您在带有&lt;s:set&gt; 标签的页面上频繁使用相同的键,那么它会覆盖之前设置的值。例如

<s:set var="someobject" value="customer">
<s:set var="someobject" value="user">

之后,如果使用 someobject 引用,则只能检索 user 对象。

关于您可以阅读OGNL 文档的参考资料。

框架使用标准命名上下文来评估 OGNL 表达式。处理 OGNL 的顶级对象是 Map(通常 称为上下文映射或上下文)。 OGNL 有一个概念 作为上下文中的根(或默认)对象。在表达上, 根对象的属性可以不加任何引用 特殊的“标记”概念。对其他对象的引用标有 井号 (#)。

使用上面的示例,您可以使用对someobject 的引用来获取user 属性name

Hello, <s:property value="#someobject.name"/>

【讨论】:

  • 你能详细说明最后一句话吗?
  • 最后一句话你听懂了吗?
  • 我认为该答案没有任何问题。他提供了答案并提出了建议。
  • 好的答案是回答一个问题的答案,不好的答案没有它,与问题无关的建议成本是多少? 提出建议听起来像是给狗扔骨头。
  • 哈哈。我明白你的意思了!再次感谢。你值得称赞。但我已经接受了另一个答案!
【解决方案2】:

是的,你可以。但是你确定你应该这样做吗?

这似乎是业务,而不是演示,因此为什么在视图中而不是在控制器中?

代替

<s:if test"%{customer != null}">
     <s:set var="someobject" value="customer">
</s:if>
<s:else>
     <s:set var="someobject" value="user">
</s:else>

SomeObject is of type : <s:property value="%{#someobject.class.name}" />

你可以在你的行动中使用

public String getSomeobject(){
    return (customer!=null) ? customer : user;
}

仅在 JSP 中

SomeObject is of type : <s:property value="%{someobject.class.name}" />

当您的操作对您的对象一无所知时,您的用例更合适,但是您会在视图中放置很多业务逻辑...

【讨论】:

  • %{someobject.class.name} 真的有效吗?我试过了。但它没有
  • 谢谢 AleksandrM,一如既往的公平。 @KevinRave,在第二个 s:property 中,您不需要 #,因为 getSomeobject() 是一个 Action 方法,而 The Action instance is always pushed onto the value stack. 是上下文映射的根。
猜你喜欢
  • 1970-01-01
  • 2014-07-19
  • 1970-01-01
  • 1970-01-01
  • 2012-07-17
  • 1970-01-01
  • 2014-06-29
  • 2015-05-05
  • 1970-01-01
相关资源
最近更新 更多