webentwicklung-frage-antwort-db.com.de

Wie verwende ich if, else Bedingung in jsf, um das Bild anzuzeigen

Ich habe eine Bedingung, in der ich ein Registrierungsformular habe, in dem, wenn die Benutzer-ID 0 ist, das Dummy-Image angezeigt werden soll. Wenn ich einen Benutzer aus einem Update heraus bearbeite, überprüfe ich, ob die Benutzer-ID ungleich 0 ist, und zeige dann das der Benutzer-ID entsprechende Image an.

Ich habe JSTL innerhalb der JSF-Seite verwendet. Aber es wird immer versucht, in die else-Schleife zu wechseln, um das Bild anzuzeigen. Die Funktionalität funktioniert gut. Das einzige Problem ist, dass ich das Dummy-Bild nicht anzeigen kann, wenn ich die Seite zum ersten Mal besuche. Hier ist mein 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>

Kann ich dieses JSTL-Tag verwenden oder kann ich es mit jsf ausführen?

31
pravi

Es ist illegal, EL-Ausdrücke zu verschachteln: Sie sollten sie inline setzen. Die Verwendung von JSTL ist in Ihrer Situation absolut gültig. Wenn Sie den Fehler korrigieren, wird der Code funktionieren:

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

Eine andere Lösung besteht darin, alle gewünschten Bedingungen in einer EL eines Elements anzugeben. Obwohl es schwerer und weniger lesbar sein könnte, ist es hier:

<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

Wenn Sie wie ich dem Code per Skuntsel gefolgt sind und einen kryptischen Stack-Trace erhalten haben, können Sie Zeit sparen.

Es scheint c:if kann von sich aus nicht gefolgt werden von c:otherwise.

Die richtige Lösung lautet wie folgt:

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

Sie können zusätzliche c:when testet nach Bedarf.

44
jmkgreen

Anstatt die "c" -Tags zu verwenden, können Sie auch Folgendes tun:

<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}"/>

Ich denke, das ist eine etwas besser lesbare Alternative zu Skuntsels alternativer Antwort und verwendet das von JSF gerenderte Attribut, anstatt einen ternären Operator zu verschachteln. Und aus der Antwort, haben Sie möglicherweise vorgehabt, Ihr Bild zwischen die Anker-Tags zu setzen, damit das Bild anklickbar ist?

7
Ryan D