2010-09-09 22 views
5

Je crée une application JSF. J'ai défini l'interface graphique et les instructions select ont interrogé la base de données à l'aide de select.Comment envoyer des valeurs d'entrée de formulaire et appeler une méthode dans le bean JSF

Maintenant, je dois faire les instructions d'insertion, mais je ne sais pas comment lire le value d'un composant d'entrée JSF comme <h:inputText> et l'envoyer à mon bean qui effectue l'insertion.

La valeur <h:inputText> doit-elle être mappée par faces-config.xml, donc je peux l'avoir dans mon code Java?

Répondre

18

Vous devez mettre tous <h:inputXxx>/<h:selectXxx> composants dans un <h:form> et lier leur attribut value à une propriété de haricot par une expression EL comme #{bean.property}, soutenu par une paire getter/setter. Lorsqu'il est correctement défini, JSF définit automatiquement les valeurs dans le bean lorsque le formulaire est soumis via un composant <h:commandXxx> dans le même formulaire. Vous pouvez spécifier une méthode d'action du bean dans l'attribut action du composant <h:commandXxx> via une expression EL telle que #{bean.action}, qui pointe vers la méthode nue action(). Toutes les valeurs soumises sont disponibles immédiatement de la manière habituelle Java.

Compte tenu de cet exemple de formulaire JSF avec un champ d'entrée et un champ de sélection:

<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> 

Les empreintes de haricots suivant les valeurs soumises au stdout, ce qui prouve que JSF a déjà fixé les valeurs bien avant le moment où vous accès dans la méthode d'action.

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; 
    } 
} 

C'est tout. Transformer le formulaire normal en une forme ajax consiste à imbriquer un <f:ajax> dans le composant de commande comme ci-dessous.

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

Vous pouvez trouver un autre exemple et des liens utiles au bas de our JSF wiki page. Notez que tout ce que vous avez l'intention de faire avec les valeurs soumises ne relève pas de la responsabilité de JSF. Par exemple, le manipuler, le passer dans une autre classe, le sauvegarder dans la base de données, etc. Rien de tout cela n'est lié à JSF. Il a comme cadre HTML basé sur le formulaire déjà fait son travail de vous fournir les valeurs soumises dans la saveur des variables Java utilisables. Le reste dépend de vous.

Pour étudier l'étape suivante, vous devriez à présent faire comme si vous aviez déjà un tas de variables préparées/codées en dur au lieu d'une interface utilisateur basée sur JSF entière. Par exemple, pour sauvegarder les valeurs dans une base de données, les gens utilisent généralement un framework de couche de service métier tel que EJB qui, à son tour, utilise un framework de couche de persistance tel que JPA. Certaines personnes utilisent même JDBC "plain vanilla" pour cela. Pour plus de liens vers des exemples concrets, commencez ici: JSF Controller, Service and DAO.

+0

Si nous supposons qu'il y avait une classe d'entité qui a des getters/setters de texte et de nombres, comment est-il possible d'utiliser cette entité au lieu de définir à nouveau les getters/setters? – hallaji

+0

@hallaji Continuez le dernier lien dans la réponse. – BalusC