web-dev-qa-db-ja.com

画像を表示するためのjsfのif、else条件の使用方法

登録フォームがあり、ユーザーIDが0の場合、ダミーイメージを表示する必要があり、更新からユーザーを編集するときに、0以外のユーザーIDをチェックしてから、ユーザーIDに対応するイメージを表示するという条件があります。

Jsfページ内でJSTLを使用しました。ただし、常にイメージを表示するためにelseループに移動しようとします。機能は正常に動作しています。唯一のことは、最初にページにアクセスしたときにダミー画像を表示できないことです。ここに私のコードがあります。

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

このJSTLタグを使用できますか、それともjsfを使用して実行できますか?

31
pravi

EL式をネストすることは違法です。インライン化する必要があります。 JSTLの使用は、あなたの状況で完全に有効です。間違いを修正すると、コードが機能するようになります。

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

別の解決策は、1つの要素のEL内に必要なすべての条件を指定することです。重くて読みにくいかもしれませんが、ここにあります:

<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

Skuntselによってコードをたどり、不可解なスタックトレースを受け取ったばかりの私にとっては、時間を節約できます。

c:ifの後にc:otherwiseを続けることはできないようです。

正しいソリューションは次のとおりです。

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

必要に応じて、c:whenテストを追加できます。

44
jmkgreen

「c」タグを使用する代わりに、次のこともできます。

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

これは、skuntselの別の答えに対するもう少し読みやすい選択肢であり、三項演算子をネストする代わりにJSFレンダリング属性を利用していると思います。そして答えから外れて、画像がアンカータグの間に置かれ、画像がクリック可能になったのでしょうか?

7
Ryan D