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'?

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top