2010-09-09 8 views
5

Ich baue eine JSF-Anwendung. Ich habe die GUI definiert und die SELECT-Anweisungen die Datenbank mit select abgefragt.Wie Formulareingabewerte senden und eine Methode in JSF-Bean aufrufen

Jetzt muss ich die Insert-Anweisungen tun, aber ich weiß nicht, wie man die value einer JSF-Eingabekomponente wie <h:inputText> lesen und an meine Bean senden, die die Einfügung ausführt.

Sollte <h:inputText> Wert durch faces-config.xml zugeordnet werden, so kann ich es in meinem Java-Code haben?

Antwort

18

Sie müssen alle über einen EL-Ausdruck wie #{bean.property}<h:inputXxx>/<h:selectXxx> Komponenten in einem <h:form> und binden ihre value Attribut auf eine Bean-Eigenschaft setzen, durch einen Getter/Setter Paar gesichert. Bei korrekter Einstellung legt JSF automatisch die Werte in der Bean fest, wenn das Formular über eine <h:commandXxx> Komponente im selben Formular gesendet wird. Sie können eine Bean-Aktionsmethode im action Attribut der Komponente <h:commandXxx> über einen EL-Ausdruck wie #{bean.action} angeben, der auf die bare Methode action() verweist. Alle übermittelten Werte sind sofort auf dem üblichen Java-Weg verfügbar.

diese JSF Form Beispiel mit einem Eingabefeld gegeben und ein Auswahlfeld:

<h:form> 
    <h:inputText value="#{bean.text}" required="true" /> 
    <h:selectOneMenu value="#{bean.choice}" required="true"> 
     <f:selectItem itemValue="#{null}" /> 
     <f:selectItem itemValue="One" /> 
     <f:selectItem itemValue="Two" /> 
     <f:selectItem itemValue="Three" /> 
    </h:selectOneMenu> 
    <h:commandButton value="submit" action="#{bean.submit}" /> 
    <h:messages /> 
    <h:outputText value="#{bean.result}" /> 
</h:form> 

Folgende Bean druckt die eingereichten Werte an die stdout, was beweist, dass JSF bereits die Werte lange vor dem Sie Moment gesetzt hat Zugang es in der Aktionsmethode.

package com.example; 

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

@Named // Use @javax.faces.bean.ManagedBean on outdated environments. 
@RequestScoped // Use @javax.faces.bean.RequestScoped on outdated environments. 
public class Bean { 

    private String text; 
    private String choice; 
    private String result; 

    public void submit() { 
     result = "Submitted values: " + text + ", " + choice; 
     System.out.println(result); 
    } 

    public String getText() { 
     return text; 
    } 

    public void setText(String text) { 
     this.text = text; 
    } 

    public String getChoice() { 
     return choice; 
    } 

    public void setChoice(String choice) { 
     this.choice = choice; 
    } 

    public String getResult() { 
     return result; 
    } 
} 

Das ist alles. Um das reguläre Formular in ein Ajax-Formular umzuwandeln, muss eine <f:ajax> in der Befehlskomponente verschachtelt werden (siehe unten).

<h:commandButton value="submit" action="#{bean.submit}"> 
    <f:ajax execute="@form" render="@form" /> 
</h:commandButton> 

Sie können ein weiteres Beispiel und wertvolle Links im unteren Bereich der our JSF wiki page finden.

Beachten Sie, dass alles, was Sie mit den übermittelten Werten zu tun beabsichtigen, nicht in der Verantwortung von JSF liegt. Zum Beispiel, manipulieren, in eine andere Klasse übergehen, in der Datenbank speichern, usw. Das alles ist nicht mit JSF verbunden. Es hat als ein HTML-Formular-basiertes Framework bereits seine Aufgabe gemacht, Ihnen die eingereichten Werte in Form von brauchbaren Java-Variablen zur Verfügung zu stellen. Der Rest liegt bei Ihnen.

Um den nächsten Schritt zu untersuchen, sollten Sie an dieser Stelle tun, als ob Sie bereits eine Reihe vorbereiteter/fest codierter Variablen anstelle einer ganzen JSF-basierten Benutzeroberfläche haben. Um beispielsweise die Werte in einer Datenbank zu speichern, verwenden Benutzer normalerweise ein Business-Service-Layer-Framework wie EJB, das wiederum ein Persistence-Layer-Framework wie JPA verwendet. Manche Leute benutzen sogar "plain vanilla" JDBC dafür. Weitere Links zu konkreten Beispielen finden Sie hier: JSF Controller, Service and DAO.

+0

Wenn wir davon ausgehen, dass es eine Entitätsklasse mit Text- und Zahlen-Gettern/Setter gab, wie ist es möglich, diese Entität zu verwenden, anstatt die Getter/Setter erneut zu definieren? – hallaji

+0

@hallaji Setzen Sie den letzten Link in der Antwort fort. – BalusC