## Ziele
* Requestübergreifendes Management des States der UI Komponenten
* Stark typisiertes Eventmodel um serverseitig Client Events zu behandeln
* Kapselung der Unterschiede innerhalb der Clients und Browsern
* Handling der Navigation sowie Error und Exception Events
* Typ Konvertierung
* Validierung der Daten sowie entsprechendes Errorhandling
Abgrenzung zu JSP
JSF
ist ein MVC Framework, welches zu dem ein Lifecycle enthält
JSP
ermöglicht das dynamische Erzeugen von HTML Pages
## JSF Konfiguration
* Konfiguration in faces-config.xml im WEB-INF Ordner
* hier gibt es Definitionen zu:
* Navigation
* Listeners
* Beans
* etc.
### Literale
```
${'hello ' + 'world'} // hello world
${21*2} // 42
${'\${' + '\#{'} // $ und # müssen escaped werden
```
### Attributzugriff auf Beans
Rein lesend:
```
${bean.attribute} // => bean.getAttribute
```
### Attributzugriff auf Beans
Lesend und schreibend:
```
#{bean.attribute} // Funktion phasenabhängig
```
* Lesender Zugriff in den Phasen: `process validations` und `render response`
* Schreibender Zugriff in den Phasen: `update Model`
* Beispiel (Two-Way-Binding, lesend+schreiben):
```
<h:InputText value="#{bean.name}"/>
```
## Beans
Beans definieren
Annotations:
Zugriff über Klassenname mit kleinem Anfangsbuchstabe
### Scopes
* Request Scope `RequestScoped`
* View Scope `ViewScoped`
* während der Nutzer auf dem gleichen View bleibt
* gilt auch über mehrere Page-Reloads
* Session `SessionScoped`
* gilt für die Session des Nutzers
* Application Scope `ApplicationScoped`
* Gilt über die komplette Laufzeit
### Baking Beans
* JSF ruft die Getter und Setter in jeder Phase neu auf
* unnötige Resourcenverschwendung
* Aufwendige Berechnungen oder Aufrufe externer Dienste aus Beans sind teuer
* Füge Baking Beans zwischen View und Logik ein
* Pufferung und Interpretation der Daten
## Navigation
* explizit über in `faces-config.xml` definierte Regeln
* implizit wenn keine explizite Regel greift
### Application Events
* extends `jakarta.faces.event.FacesEvent`
* enthält immer die triggernde Komponenten
* werden an eine Lifecycle Phase gebunden
* können gequeued werden
#### Listener Classes Application Events
* für jeden Application Event Type eine Listener
* ActionListener
* ValueChangeListener
### System Events
* extends `SystemEvent`
* alle spezifizierte Events unter `jakarta.faces.event`
* Beispiel: `PostConstructApplicationEvent`
#### Component System Events
* spezielle System Events
* beinhalten einen Verweis auf eine Komponente
* Beispiel: `PreRenderViewEvent`
#### Listener Classes
* nur zwei Listener Classes nötig
* für System Events: `jakarta.faces.event.SystemEventListener`
* für Component System Events: `jakarta.faces.event.ComponentSystemEventListener`
## Validatoren
* Validatoren für Beans und Input Fields
* Standardvalidatoren für gängige Datentypen
* einfache Einschränkungen für Standard-Datentypen
* eigene komplexe Validatoren möglich
## Konverter
* Validatoren für Beans und Input Fields
* Konverter für gängige Datentypen
* BooleanConverter, BigIntegerConverter, DateTimeConverter etc.
### Verwendung
* wird automatisch zugeordnet durch den Typ der Beanvariable
```
<h:inputText value="#{bean.variable}"/>
```
### Requirements
* Todo Liste
* erkennbar welche Todo bereits abgeschlossen
* Todos sollen hinzugefügt und editiert werden können
* Todos enthalten ID, Titel und Description