Question
J'ai un objet appelé 'item'. il a une propriété appelée 'type'
quand je fais cela:
<s:property value="item.type" />
Je comprends ceci: Q
ok, donc je peux lire la valeur, mais quand j'essaye ceci:
<s:property value="item.type == 'Q'" />
je reçois une chaîne vide
cela me donne une chaîne vide:
<s:property value="%{#item.type == 'Q'}" />
J'ai même essayé ceci:
<s:property value="item.type.equals('Q')" />
mais j'ai eu cette chaîne: faux
comment puis-je être "vrai"?
La solution
ok, j'ai eu du mal avec ça pour toujours ... et j'ai finalement trouvé comment faire ça. " Q " est un littéral de chaîne par rapport à 'Q' qui est un caractère. donc ...
<s:if test="%{#item.type == 'Q'}">
sera toujours évalué à faux. essayez plutôt ...
<s:if test="%{#item.type == \"Q\"}">
J'ai aussi vu cela se faire de cette façon ...
<s:if test='%{#item.type == ("Q")}'>
(remarquez les guillemets simples autour de la valeur de l'attribut de test.)
OGNL est une épine dans mon côté. Je suppose que le PO a déjà compris cela. mais j'espère que cela aidera quelqu'un d'autre.
Autres conseils
Je ne pense pas que vous puissiez insérer d'EL dans la propriété value de cette balise. Vous pouvez accomplir cela avec quelque chose comme:
<s:if test="%{#item.type == 'Q'}">
true
</s:if>
<s:else>
false
</s:else>
Remarque - J'utilise freemarker pour la vue. Il est donc possible que ce qui précède n'est pas exact Dans Freemarker, vous pouvez le faire avec un attribut:
<#assign val = (item.type == 'Q')/>
${val}
Vous pouvez également utiliser la construction if comme ci-dessus:
<#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>
C’est aussi simple que:
<s:property value='item.type == "Q"' />
Il suffit de remplacer les guillemets simples par des guillemets doubles et inversement