# Jakarta Server Faces
## 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.

Lifecycle

Lifecycle: Initialer Aufruf

Lifecycle: Validation Error

Erste Ausgabe

                    <!DOCTYPE html>
<html lang="de"  xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:h="http://java.sun.com/jsf/html">
    <head>
        <meta charset="UTF-8"/>
        <title>Hello World of JSF</title>
    </head>
    <body>
        <h:outputText value="Hello World"/>
    </body>
</html>
                    
                
## Unified Expression Language * Grundsyntax ```html ${expression} // immediate #{expression} // deferred ```
### 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
                                @ManagedBean
@ViewScope
public class SayHello
                                
                            
  • Faces-config.xml:
    • Zugriff über Attributwert managed-bean-name
                                <managed-bean>
  <managed-bean-name>sayHello</managed-bean-name>
  <managed-bean-class>demo.SayHello</managed-bean-class>
  <managed-bean-scope>request</managed-bean-scope>
</managed-bean>
                                
                            
### 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
### Navigation Rule (explizite Navition) ``` html[|2|3,7|4|5|6] <navigation-rule> <from-view-id>/login.xhtml</from-view-id> <navigation-case> <from-action>#{LoginForm.login}</from-action> <from-outcome>success</from-outcome> <to-view-id>/storefront.xhtml</to-view-id> </navigation-case> <navigation-case> <to-view-id>/default.xhtml</to-view-id> </navigation-case> </navigation-rule> ```
### Implizite Navigation Greift keine Navigation Regel dann wird der Rückgabewert der jeweiligen Action als relative URL genutzt.
### Zusätzliche Interfaces * Converters * Events and Listeners * Validators
## Common Event Processing
### Event Types * Application Events * ActionEvent * ValueChangeEvent * System Events
### 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
### Standardvalidatoren ```html <f:validateLength minimum="6" maximum="15"/> <f:validateLongRange minimum="6" maximum="15"/> <f:validatePattern pattern="<myPattern>"/> ```
### Verwendung ```html <h:inputText value="#{bean.variable}" validator="validatorMethod()" /> <h:inputText value="#{bean.variable}"> <f:validateRequired/> </inputText> ```
## 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}"/> ```
## JSF-Tags

Form

                        <h:form id="id">
    ...
</h:form>
                    

Checkbox

                        <h:selectBooleanCheckbox value="#{item.done}"
                         disabled="true" />
                    

Input Text

                        <h:inputText value="#{item.title}"/>
                    

Input Hidden

                        <h:inputHidden value="#{item.title}"/>
                    

Commandbutton

                        <h:commandButton value="Speichern"
                 action="#{manager.save()}"/>
                    
## Requirements * JDK * Servlet-Container (bspw. Apache Tomcat)
## Praxis * erstellen Todo Listen Anwendung
### Requirements * Todo Liste * erkennbar welche Todo bereits abgeschlossen * Todos sollen hinzugefügt und editiert werden können * Todos enthalten ID, Titel und Description