Nun, ich habe nicht nur einen schrecklichen Unfall überlebt; noch ein bischen Geduld und ich bin hoffentlich wieder komplett hergestellt. Zeit um über einen Lebenszyklus zu schreiben. Und zwar den von JSF. Allerdings gibt es heute keinen Artikel, der alles im Detail beschreibt, sondern eine Anleitung, selber herauszufinden, wann denn was passiert.

Wie bisher, erfolgt die Erläuterung am Beispiel von NetBeans. Legen Sie eine neue WebApplikation an. Markieren Sie “Enable Context and Dependency Injection”. Wählen Sie JSF als Framework mit “*.xhtml” als URL-Pattern. So, das war knapp, ausführlicher und mit Screenshots steht dies in Teil II meines JSF Tutorials.

Ergänzen Sie die generierte index.xhtlm wie folgt:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
           xmlns:h="http://java.sun.com/jsf/html"
           xmlns:f="http://java.sun.com/jsf/core">
       <f:metadata>
               <f:phaseListener type="demo.LifeCycleListener"/>
       </f:metadata>

       <h:head>
               <title>Facelet Title</title>
       </h:head>
       <h:body>
               Hello from Facelets

               <h:form id="form">
                       <p>
                               <h:outputLabel for="name" value="Name:"/>
                               <h:inputText id="name" value="#{backingBean.name}"/>
                       </p>
                       <p>
                               <h:outputLabel for="age" value="Age:"/>
                               <h:inputText id="age" value="#{backingBean.age}"/>
                       </p>
                       <p>
                               <h:commandButton value="Ok"/>
                       </p>
               </h:form>
       </h:body>
</html>

Legen Sie ein Paket namens “demo” an.

Erstellen Sie eine “JSF managed bean” und geben ihr den Namen”BackingBean”. Da Sie CDI angewählt haben, wird dies tatsächlich als named bean erzeugt. Oder legen Sie einfach eine neue Java-Klasse an und erweitern diese im Code.

package demo;

import javax.enterprise.context.RequestScoped;
import javax.inject.Named;

@Named
@RequestScoped
public class BackingBean {

       private String _name;
       private int _age;

       public String getName() {
               return _name;
       }

       public void setName(String name) {
               this._name = name;
       }

       public int getAge() {
               return _age;
       }

       public void setAge(int age) {
               this._age = age;
       }
}

Und noch eine zweite Bean mit Namen “LifeCycleListener”.

package demo;

import javax.enterprise.context.Dependent;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import javax.inject.Named;

@Named
@Dependent
public class LifeCycleListener implements PhaseListener {

       @Override
       public void beforePhase(PhaseEvent event) {
               System.out.println("Before phase: " + event.getPhaseId());
       }

       @Override
       public void afterPhase(PhaseEvent event) {
               System.out.println("After phase: " + event.getPhaseId());
       }

       @Override
       public PhaseId getPhaseId() {
               return PhaseId.ANY_PHASE;
       }

}

Nun starten Sie das Projekt und beobachten die Ausgabe in der NetBeans-Console, Tab GlassFish Server. Geben Sie einen Namen und ein Alter ein und klicken auf den Button. Und geben Sie statt eines Zahlenwertes eien paar Buchstaben als Alter ein und clicken dann wieder auf [Ok]. Haben Sie den Unterschied bemerkt?

Ausführliche Erläuterungen gibt es, wenn ich wieder mehr Zeit finde.