Pergunta
Eu tenho um objeto chamado 'item'. tem uma propriedade chamada 'tipo'
Quando eu faço isso:
<s:property value="item.type" />
Eu entendo isso: q
Ok, para que eu possa ler o valor, mas quando tento:
<s:property value="item.type == 'Q'" />
eu recebo uma corda vazia
Isso me dá uma corda vazia:
<s:property value="%{#item.type == 'Q'}" />
Eu até tentei isso:
<s:property value="item.type.equals('Q')" />
Mas eu peguei esta string: false
Como faço para me tornar 'verdadeiro'?
Solução
OK, eu lutei com isso para sempre ... e eventualmente descobri como fazer isso. "Q" é um literal de corda versus 'q', que é um personagem. Portanto...
<s:if test="%{#item.type == 'Q'}">
sempre se avaliará como falso. Em vez disso, tente ...
<s:if test="%{#item.type == \"Q\"}">
Eu também vi isso feito assim ...
<s:if test='%{#item.type == ("Q")}'>
(Observe as citações únicas em torno do valor do atributo de teste.)
Ognl é um espinho no meu lado. Acho que o OP já descobriu isso. Mas espero que isso ajude outra pessoa.
Outras dicas
Eu não acho que você possa colocar qualquer EL dentro da propriedade Value desta tag. Você poderia conseguir isso com algo como:
<s:if test="%{#item.type == 'Q'}">
true
</s:if>
<s:else>
false
</s:else>
Mais exemplos disso são aqui
NOTA - Eu uso o Freemarker para a exibição, portanto o acima pode não ser exato. No Freemarker, você pode fazer isso com uma atribuição:
<#assign val = (item.type == 'Q')/>
${val}
Ou, você também pode usar a construção se acima:
<#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>
É tão simples quanto:
<s:property value='item.type == "Q"' />
Só preciso substituir citações únicas por citações duplas e vice-versa