Unterschied zwischen "${cc.getS...}" und "#{cc.getS...}" auf einer XHTML-Seite?
Antwort vom**Der Unterschied ist grundlegend: `${...}` wird beim Erzeugen der XHTML-Seite sofort ausgewertet, `#{...}` bleibt als JSF-Expression erhalten und wird erst im JSF-Lebenszyklus ausgewertet. Dadurch funktioniert `#{cc.getS...}` für Komponenten, Events, Binding und dynamische Werte meist korrekt, `${cc.getS...}` oft nicht.** ## Der praktische Unterschied In einer XHTML-Seite mit JSF/Facelets stehen die beiden Schreibweisen für zwei verschiedene Expression-Languages: - `${...}` = **Immediate EL / JSP-ähnliche Auswertung** - `#{...}` = **Deferred EL / JSF-EL** Der entscheidende Punkt ist also **nicht nur die Syntax**, sondern **wann** der Ausdruck ausgewertet wird. ## Was bedeutet das konkret `${cc.getS...}` wird schon beim Aufbau der View direkt zu einem Wert aufgelöst. Das ist nur dann sinnvoll, wenn du **einfach nur einen statischen Wert früh einsetzen** willst. `#{cc.getS...}` wird von JSF als echter Ausdruck weitergereicht. Dadurch kann JSF den Wert später noch: - erneut auswerten - an den Komponenten-Lebenszyklus koppeln - für Getter/Setter verwenden - bei Validierung, Ajax, Rendering oder Events korrekt verarbeiten ## Warum ist `cc` hier besonders wichtig `cc` steht in JSF für die **aktuelle Composite Component**. Gerade bei Composite Components ist `#{cc.attrs...}` oder `#{cc.someMethod()}` der Normalfall, weil JSF diese Ausdrücke oft **nicht nur einmal**, sondern in einem bestimmten Kontext und zu einem bestimmten Zeitpunkt braucht. Mit `${cc...}` bekommst du häufig Probleme, weil der Ausdruck zu früh ausgewertet wird und JSF danach nur noch das fertige Ergebnis sieht, **nicht mehr die eigentliche Bindung**. ## Typischer Unterschied an Beispielen ### Meist richtig ```xhtml <h:inputText value="#{cc.attrs.value}" /> ``` Hier kann JSF den Wert lesen, später zurückschreiben und in Validierung/Update Model verwenden. ### Oft falsch oder problematisch ```xhtml <h:inputText value="${cc.attrs.value}" /> ``` Hier wird der Wert früh eingesetzt. Das kann dazu führen, dass kein korrektes Update mehr möglich ist, weil JSF keinen echten Value-Expression-Kontext mehr hat. ## Faustregel ## Verwende in JSF-XHTML fast immer `#{...}` Das ist die klare Praxisregel. `${...}` taucht zwar noch auf, ist in JSF-Facelets aber nur für Sonderfälle sinnvoll. Sobald es um - `value` - `rendered` - `action` - `actionListener` - `validator` - `binding` - `cc.attrs` - Methodenaufrufe in JSF-Komponenten geht, ist `#{...}` praktisch immer die richtige Wahl. ## Der wichtigste Unterschied in einem Satz `${...}` liefert **sofort einen fertigen Wert**. `#{...}` liefert **einen von JSF steuerbaren Ausdruck**. Genau deshalb ist bei `cc.getS...` in einer XHTML-Seite fast immer `#{...}` korrekt und `${...}` die falsche oder zumindest riskante Variante.