2013-07-11 13 views
21

Ho una condizione in cui ho un modulo di iscrizione in cui se userid è 0 dovrebbe mostrare l'immagine fittizia e quando modifico l'utente da qualsiasi aggiornamento, controllo se userid che non è uguale a 0 quindi visualizza l'immagine corrispondente a userid.Come utilizzare if, else condition in jsf per visualizzare l'immagine

Ho usato JSTL all'interno della pagina jsf. Ma cerca sempre di andare al loop else per mostrare l'immagine. La funzionalità funziona correttamente. L'unica cosa è che non posso visualizzare l'immagine fittizia quando visito prima la pagina. Qui s il mio codice .:

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

Posso utilizzare questo tag JSTL o posso farlo utilizzando JSF?

risposta

27

Non è consentito annidare le espressioni EL: è necessario incorporarle. L'uso di JSTL è perfettamente valido nella tua situazione. Correggere l'errore, farete il codice di lavoro:

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

Un'altra soluzione è quella di specificare tutte le condizioni che si desidera all'interno di un EL di un elemento. Anche se potrebbe essere più pesante e meno leggibile, eccolo:

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

Non solo questo risulta in (quasi) codice duplicato ma raddoppia anche il tempo di valutazione. Considera 'c: scegli + c: quando + c: altrimenti' invece. – Qdeep

29

Per quelli come me che ha appena seguito il codice skuntsel e ha ricevuto una traccia dello stack criptico, mi permetta di risparmiare un po 'di tempo.

Sembra che c:if non possa essere seguito da c:otherwise.

Il corretta soluzione è la seguente:

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

È possibile aggiungere ulteriori c:when test in base alle necessità.

+0

È fantastico che tu abbia scritto un aggiornamento! Ho corretto la mia risposta in modo che fosse compilata. A volte è utile rileggere la tua risposta. – skuntsel

6

Invece di usare i tag "c", si potrebbe anche effettuare le seguenti operazioni:

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

penso che sia un po 'alternativa più leggibile alla risposta alternativa di skuntsel e sta utilizzando l'attributo JSF reso invece di nidificazione un operatore ternario. E, a parte la risposta, forse intendevi mettere la tua immagine tra i tag di ancoraggio in modo che l'immagine sia cliccabile?