# JSF if und when



## thomasch (26. Aug 2010)

Hallo,
ich bin grade dabei, mich in JSF einzuarbeiten. Momentan habe ich folgendes Problem:

Ich möchte abhängig von einem gesetzen Flag Sachen darstellen oder auch nicht. Dazu habe ich eine Klasse mit einer Methode geschrieben, die true oder false zurück gibt. 

Leider habe ich wohl Schwierigkeiten, diesen Ausdruck in einem c:if oder c:when Konstrukt auszuwerten - egal, was ich versuche, es wird offenbar immer zu "true" ausgewertet.

Hier mal ein Beispei:

```
<c:if test="${person.emptyName eq true}">
             <h:outputLabel value="If liefert true"/>
        </c:if>
        <c:when test="${person.emptyName}">
            <h:outputLabel value="when liefert true"/>
        </c:when>
       
       <h:outputLabel value="#{person.emptyName}"/>
```

Die letzte Zeile liefert mir, so wie gewollt, je nach Eingabe "true" oder "false".


----------



## SlaterB (26. Aug 2010)

c:when gibts sicherlich nur innerhalb von <c:choose>, oder?
hab grad nix zu testen, richtest du dich nach gesicherten Tutorials oder schreibst du irgendwas was dir in den Sinn kommt?

ich habe desweiteren nach c:if für JSF gesucht, und recht viele Seiten gesehen, die das an sich bezweifeln,
<:if in JSF überhaupt möglich? @ tutorials.de: Tutorials, Forum & Hilfe
an anderer Stelle wird es wieder empfohlen
JSF Best Practices

mag auch an der Version liegen
> As of JSF 1.2 and Servlets  2.5, JSTL 1.2 is supposed to work well with JSF. So give a try to <c:if> and <c:choose> tags and let us know about the results.
HOW: 'if'-like JSF conditions? (JSF forum at JavaRanch)


----------



## thomasch (26. Aug 2010)

Hallo,
so ein richtig passendes Tutorial habe ich nicht wirklich gefunden - ich suche aber schon im Netz nach Antworten...

Der Tipp mit dem <c:choose> war klasse - jetzt tut immerhin das <c:when...>

Allerdings habe ich wohl ein generelles Verständnisproblem:
Der Ausdruck wird offenbar nur bei der erstmaligen Erstellung der Seite ausgewertet. Ich habe darüber ein Formular, welches dafür sorgt, dass person.emptyName wahlweise true oder false zurück gibt.
Ein <hutputLabel value="#{person.emptyName}"/> zeigt mir das auch richtig an.

Ich war jetzt der Meinung, dass daher auch ein <c:when...> jedesmal neu ausgewertet wird - und liege damit offenbar falsch


----------



## maki (26. Aug 2010)

Das rendered attribut kennst du?


----------



## Cage Hunter (26. Aug 2010)

Also ich benutze das c:if eigentlich ziemlich gerne, klar, es gibt auch "rendered" allerdings kommt das zB bei größeren includes von Facelets nicht in Frage 


```
<c:if test="#{someBean.isSomeBeansMethod()}">
            <ui:include src="/bla.xhtml" />
</c:if>
```

So sieht das aus. Durch "test" wird die Methode isSomeBeansMethod() gefragt ob true oder false, fertig...nix mit eq oder sonstwas, es kann bei c:if eh nur true oder false rauskommen 

Was Dein anderes Problem angeht versteh ich es nicht ganz, denn die Tags werden bei jedem Laden der Seite ausgewertet. Könnte es sein, dass du da was mit Ajax machst? In dem Fall würde bei einem Ajax-Event nicht die Seite neu geladen werden, wenn du es Ajax nicht auch so mitteilst


----------



## imho1001 (26. Aug 2010)

Frage von der Seite:

Was ist denn jetzt der Unterschied zwischen c:when und c:if?
Wenn ich bei when
<c:when test="${item.irgendeinFeld == 'BLA'}">
wird doch im Endeffekt auch nur die Bedingung auf TRUE oder FALSE geprüft...

Oder ist es so, dass <c:if> AUSSCHLIESSLICH bei boolean Feldern zum Einsatz kommt?


----------



## thomasch (26. Aug 2010)

@maki jupp, das kenne ich, wollte ich aber vermeiden, da ich einen ganzen Block einfügen und dem nur einmal die Anweisung zum (nicht) Darstellen geben wollte.

@Cage Hunter
Ich habe mir mittlerweile unter anderem courses.coreservlets.com zu Gemüte geführt. 

Da steht unter Anderem:


> c:if and c:choose don’t interact properly with ui:repeat
> because they run when component tree is built, not when
> it is rendered.
> • So, don’t use the JSTL conditional evaluation tags



Dass das bei Dir dennoch funktioniert wundert mich jetzt etwas. 

Gelöst habe ich das Problem letztendlich durch die Verwenung eines <ui:fragment rendered="#{person.emptyName}> Blockes. In sofern ging die Lösung doch eher in die Richtung von dem, was maki schrieb.


----------



## Cage Hunter (26. Aug 2010)

Der Unterschied ist, dass <c:choose> komplexere Verzweigungen erlaubt


```
<c:choose>
 <c:when />
 <c:otherwise />
</c:choose>
```

Ein <c:if> steht hingegen alleine, es gibt kein else oder sonstwas


----------



## imho1001 (26. Aug 2010)

Das ist der einzige Unterschied? ...ist mir auch mal in den Sinn gekommen... hatte aber gedacht: "Nee, kann ja nicht sein. Da muss es doch noch nen anderen Grund geben..."

Aber schön. Wieder was gelernt


----------



## Cage Hunter (26. Aug 2010)

thomasch hat gesagt.:


> Dass das bei Dir dennoch funktioniert wundert mich jetzt etwas.



Jo, das ist mir bekannt^^

Aber bei mir hat das if keine Auswirkungen auf's Rendering, weil die includes ja vorm Rendern in den Tree kommen müssen 
Wie gesagt, bei größeren Includes wären meine Seiten ja monströs, wenn das nicht anders ginge


----------



## thomasch (26. Aug 2010)

@imho1001 Laut 
Doku kann man den Wert des Ausdrucks bei if noch einer Variablen zuorden - soweit ich das verstanden habe.


----------



## imho1001 (26. Aug 2010)

Danke.

Hatte ich schon gesehen. Aber verstehen tu ich's nicht so richtig... Ist erstmal auch egal. Für meine Anwendungen reicht mir bis jetzt das <c:when> 
Vielleicht sieht das anders aus wenn ich das <c:if> mal komplett kapiert habe ... Im Moment wüsste ich nicht für welche Sachen man die optionalen parameter var und scope brauchen könnte.

btw
hab in unseren Projekten allerdings schon öfter <c:if> gesehen ohne die optionalen var="" und scope=""... also etwas was durchaus auch durch <c:when> hätte gemacht werden können.

ich nehme an dass es gemacht wurde, weil in diesen Fällen kein "else" nötig war/ist ...


----------

