web-dev-qa-db-fra.com

Comment utiliser if, sinon condition dans jsf pour afficher l'image

J'ai une condition où j'ai un formulaire d'inscription dans lequel si userid est 0, il devrait montrer l'image factice et lorsque je modifie l'utilisateur à partir de n'importe quelle mise à jour, je vérifie si userid qui n'est pas égal à 0 puis affiche l'image correspondant à userid.

J'ai utilisé JSTL à l'intérieur de la page jsf. Mais toujours, il essaye d'aller à la boucle else pour montrer l'image. La fonctionnalité fonctionne bien. Le seul problème est que je ne peux pas afficher l'image factice lorsque je visite d'abord la page. Voici mon code .:

<c:if test="${'#{user.userId}' == '0'}">
  <a href="Images/thumb_02.jpg" target="_blank" ></a>
  <img src="Images/thumb_02.jpg" />
</c:if>
<c:otherwise>
  <a href="/DisplayBlobExample?userId=#{user.userId}" target="_blank"</a>
  <img src="/DisplayBlobExample?userId=#{user.userId}" />
</c:otherwise>

Puis-je utiliser cette balise JSTL ou le faire avec jsf?

31
pravi

Il est illégal d'imbriquer des expressions EL: vous devez les aligner. L'utilisation de JSTL est parfaitement valable dans votre situation. En corrigeant l'erreur, vous ferez fonctionner le code:

<c:if test="#{not empty user or user.userId eq 0}">
    <a href="Images/thumb_02.jpg" target="_blank" ></a>
    <img src="Images/thumb_02.jpg" />
</c:if>
<c:if test="#{empty user or user.userId eq 0}">
    <a href="/DisplayBlobExample?userId=#{user.userId}" target="_blank"></a>
    <img src="/DisplayBlobExample?userId=#{user.userId}" />
</c:if>

Une autre solution consiste à spécifier toutes les conditions souhaitées dans un EL d'un élément. Bien que cela puisse être plus lourd et moins lisible, le voici:

<a href="#{not empty user or user.userId eq 0 ? '/Images/thumb_02.jpg' : '/DisplayBlobExample?userId='}#{not empty user or user.userId eq 0 ? '' : user.userId}" target="_blank"></a>
<img src="#{not empty user or user.userId eq 0 ? '/Images/thumb_02.jpg' : '/DisplayBlobExample?userId='}#{not empty user or user.userId eq 0 ? '' : user.userId}" target="_blank"></img>
36
skuntsel

Pour ceux qui, comme moi, viennent de suivre le code de skuntsel et ont reçu une trace de pile cryptique, permettez-moi de vous faire gagner du temps.

Il semble que c:if Ne puisse pas à lui seul être suivi de c:otherwise.

La solution correcte est la suivante:

<c:choose>
    <c:when test="#{some.test}">
        <p>some.test is true</p>
    </c:when>
    <c:otherwise>
        <p>some.test is not true</p>
    </c:otherwise>
</c:choose>

Vous pouvez ajouter des tests c:when Supplémentaires si nécessaire.

44
jmkgreen

Au lieu d'utiliser les balises "c", vous pouvez également procéder comme suit:

<h:outputLink value="Images/thumb_02.jpg" target="_blank" rendered="#{not empty user or user.userId eq 0}" />
<h:graphicImage value="Images/thumb_02.jpg" rendered="#{not empty user or user.userId eq 0}" />

<h:outputLink value="/DisplayBlobExample?userId=#{user.userId}" target="_blank" rendered="#{not empty user and user.userId neq 0}" />
<h:graphicImage value="/DisplayBlobExample?userId=#{user.userId}" rendered="#{not empty user and user.userId neq 0}"/>

Je pense que c'est une alternative un peu plus lisible à la réponse alternative de skuntsel et utilise l'attribut rendu JSF au lieu d'imbriquer un opérateur ternaire. Et en dehors de la réponse, aviez-vous éventuellement l'intention de placer votre image entre les balises d'ancrage afin qu'elle soit cliquable?

7
Ryan D