Вопрос
у меня есть объект с именем 'item'. у него есть свойство с именем 'type'
когда я это сделаю:
<s:property value="item.type" />
я получаю это: Вопрос р>
Хорошо, я могу прочитать значение, но когда я попробую это:
<s:property value="item.type == 'Q'" />
я получаю пустую строку
это даст мне пустую строку:
<s:property value="%{#item.type == 'Q'}" />
Я даже попробовал это:
<s:property value="item.type.equals('Q')" />
но я получил эту строку: ложь р>
как я могу получить 'true'?
Решение
Хорошо, я боролся с этим навсегда ... и в конце концов узнал, как это сделать. & Quot; Q & Quot; является строковым литералом против 'Q', который является символом. следовательно ...
<s:if test="%{#item.type == 'Q'}">
всегда будет иметь значение false. вместо этого попробуйте ...
<s:if test="%{#item.type == \"Q\"}">
Я также видел, как это было сделано таким образом ...
<s:if test='%{#item.type == ("Q")}'>
(обратите внимание на одинарные кавычки вокруг значения атрибута теста.)
OGNL - бельмо на моей стороне. Я предполагаю, что ОП уже понял это. но, надеюсь, это поможет кому-то еще.
Другие советы
Я не думаю, что вы можете поместить какой-либо EL в свойство value этого тега. Вы можете сделать это с помощью чего-то вроде:
<s:if test="%{#item.type == 'Q'}">
true
</s:if>
<s:else>
false
</s:else>
Дополнительные примеры этого приведены здесь
Примечание. Я использую freemarker для представления, поэтому приведенное выше может быть неточным. В freemarker вы можете сделать это с помощью присваивания:
<#assign val = (item.type == 'Q')/>
${val}
Или вы также можете использовать конструкцию if, как указано выше:
<#if (item.type == 'Q')>true<#else>false</#if>
<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"' />
Просто нужно заменить одинарные кавычки на двойные и наоборот