March 22, 2008

JSF und die Frage wie es losgeht

Wer sich erstmals mit den Java Server Faces befasst und/oder von Struts umsteigt, steht wahrscheinlich vor der Frage, wie und wann man am besten einen UI-Controller bzw. die zugrundeliegende(n) Managed Beans initialisiert, sprich, die benötigten Daten lädt. Denn alle darzustellenden Felder werden nur lose an beliebige Beans gebunden. Abgesehen von weiterführenden Themen wie Servlet Filtern oder Phase Listenern gibt es keine vordefinierten Einsprungmethoden.
Eine simple Lösung macht sich die Möglichkeit der Expression Language (EL) zunutze, komplexere und hierarchische Property-Ausdrücke aufzulösen.

Anstatt beispielsweise den Kundennamen wie folgt zu binden,
<h:inputText
    id="name" value="#{customerController.name}">
</h:inputText>

setzt man ein Formbean-Object davor:
<h:inputText
    id="name" value="#{customerController.formBean.name}">
</h:inputText>

Die Formbean wird als normale Java-Bean implementiert:
public class CustomerBean {
   private String name;
   public void setName(String name) {
      this.name = name; 
   }
   public String getName() {
      return name;
   }
}

Der Übersichtlichkeit kommt dies natürlich auch zugute, da der UI-Controller nicht mehr mit Gettern und Settern für alle Felder überschwemmt wird.

Im Controller gibt es nun eine zentrale Stelle für die Initialisierung:
public class CustomerController {
   public Object getFormBean() {
      if (formBean == null) {
         formBean = new CustomerBean();    
      
       // load form data, set form properties, etc.
       ... 
      }
   
      return formBean; 
   }  
   
   private CustomerBean formBean; 
}


Sobald erstmalig der Wert eines Feldes angefordert wird, wird die Formbean erzeugt - bei allen folgenden Property-Zugriffen wird die Initialisierung dann übersprungen.

No comments:

Post a Comment