Pregunta

Tengo un objeto llamado 'item'. tiene una propiedad llamada 'tipo'

cuando hago esto:

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

me sale esto: Q

ok, entonces puedo leer el valor, pero cuando intento esto:

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

me sale una cadena vacía

esto me da una cadena vacía:

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

Incluso probé esto:

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

pero tengo esta cadena: falso

¿Cómo obtengo 'true'?

¿Fue útil?

Solución

ok, luché con esto para siempre ... y, finalmente, descubrí cómo hacerlo. " Q " es una cadena literal contra 'Q' que es un carácter. por lo tanto ...

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

siempre se evaluará como falso. En su lugar, intente ...

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

También lo he visto hecho de esta manera ...

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

(observe las comillas simples alrededor del valor del atributo de prueba)

OGNL es una espina en mi costado. Supongo que el OP ya ha resuelto esto. pero espero que esto ayude a alguien más.

Otros consejos

No creo que puedas poner ningún EL dentro de la propiedad de valor de esta etiqueta. Podrías lograr eso con algo como:

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

Más ejemplos de esto son aquí

Nota: uso freemarker para la vista, por lo que lo anterior puede no ser exacto. En freemarker puedes hacer esto con una asignación:

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

O, también puedes usar el constructo if como arriba:

<#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>

Es tan simple como:

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

Solo necesita reemplazar las comillas simples por comillas dobles y viceversa

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top