JSF if und when

thomasch

Mitglied
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:
Java:
        <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".
 
S

SlaterB

Gast
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

Mitglied
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 <h:eek:utputLabel 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
 

Cage Hunter

Aktives Mitglied
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 :)

Java:
<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 :)
 
I

imho1001

Gast
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

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

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

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

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

imho1001

Gast
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 :D
 
I

imho1001

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

Neue Themen


Oben