如何评估Struts2s:if?

如何评估Struts2s:if?,struts2,Struts2,我有一个叫做“item”的对象。 它有一个名为“type”的属性 当我这样做时: <s:property value="item.type" /> 我明白了: Q 好的,所以我可以读取值,但当我尝试此操作时: <s:property value="item.type == 'Q'" /> 我得到一个空字符串 这给了我一个空字符串: <s:property value="%{#item.type == 'Q'}" /> 我甚至试过: <

我有一个叫做“item”的对象。 它有一个名为“type”的属性

当我这样做时:

<s:property value="item.type" />

我明白了: Q

好的,所以我可以读取值,但当我尝试此操作时:

<s:property value="item.type == 'Q'" /> 

我得到一个空字符串

这给了我一个空字符串:

<s:property value="%{#item.type == 'Q'}" />

我甚至试过:

<s:property value="item.type.equals('Q')" />

但是我得到了这个字符串: 假的


如何获得“true”?

我认为您不能将任何EL放入此标记的value属性中。您可以通过以下方式实现这一点:

<s:if test="%{#item.type == 'Q'}">
  true
</s:if>
<s:else>
  false
</s:else>

真的
假的
下面是更多的例子

注意-我在视图中使用freemarker,因此上述内容可能不准确。在freemarker中,您可以通过分配来执行此操作:

<#assign val = (item.type == 'Q')/>
${val}

${val}
或者,您也可以像上面那样使用if构造:

<#if (item.type == 'Q')>true<#else>false</#if>
truefalse

好吧,我一直在努力解决这个问题。。。最终发现了如何做到这一点。“Q”是字符串文字,而“Q”是字符。因此

<s:if test="%{#item.type == 'Q'}">

将始终评估为false。相反,尝试

<s:if test="%{#item.type == \"Q\"}">

我也见过这样做

<s:if test='%{#item.type == ("Q")}'>

(请注意测试属性值周围的单引号。)

OGNL是我心中的一根刺。我猜OP已经找到了答案。但希望这能帮助其他人。


<s:set name="prop" value="%{'val'}"/>

<s:if test="%{#prop == 'val'}">
  <s:property value="%{#prop}" />
</s:if>

<s:elseif test="%{#prop=='val1'}">
  <s:property value="%{#prop}" />
</s:elseif>

<s:else>
  ...
</s:else>
...
它非常简单:

<s:property value='item.type == "Q"' />

只需要将单引号替换为双引号,反之亦然