外化到facelet组件中的表单不能调用bean方法

时间:2012-07-12 09:03:22

标签: model-view-controller java-ee jsf-2 richfaces

我有这种形式,更改范围一时,行comboBox可以重新生成。 这是通过richfaces的a4j完成的。

The form

它工作正常,直到我把它变成了facelet组件,这是我的代码:

@Getter
@Setter
@ManagedBean(name = "creerProduit")
@SessionScoped
public class CreerProduitBean implements Serializable {
    /** serial uid genere par eclipse */
    private static final long serialVersionUID = 7901115336087748268L;

    /** contenu des comboBox */
    private List<Gamme> listeGammesAffichables;// ce que contient la combox
    private List<Famille> listeFamillesAffichables;// ce que contient la combobox
    private List<Fournisseur> listeFournisseurAffichables;// ce que contient la combobox

    /** liste de toute les familles pour nos calculs */
    private List<Famille> listeFamilles;// la liste de toutes les famille (pour calculs)

    /** resultat du form*/
    private String nomFournisseur;
    private String nomFamille;
    private String nomGamme;
    private String designation;
    private String txRecu;
    private String txVerseCGP;
    private String txVerseDR;
    private String txIncompressible;
    private String indications;

    /**
     * Constructeur
     * Creates a new {@link CreerProduitBean} instance.
     * @throws Exception
     */
    public CreerProduitBean() throws Exception {
        ProduitDelegateImpl d = new ProduitDelegateImpl();
        // recuperation de toute les gamme et famille afin de
        // populer les comboBox
        listeGammesAffichables = d.readAll(Gamme.class);
        listeFournisseurAffichables = d.readAll(Fournisseur.class);
        listeFamilles = d.readAll(Famille.class);

        //permet de faire sauter le validator JSF
       // listeFamillesAffichables = d.readAll(Famille.class);
    }

    /**
     * fabrique le produit a partir des donnée affiché puis le sauvgarde
     * @return
     * @throws Exception
     */
    public String submit() throws Exception {
       ProduitDelegateImpl d = new ProduitDelegateImpl();

       Produit p = new Produit();
       p.setDesignation(designation);
       p.setRecu(Double.parseDouble(txRecu));
       p.setIncompressible(Double.parseDouble(txIncompressible));
       p.setVerseeAuCgp(Double.parseDouble(txVerseCGP));
       p.setVerseeAuDr(Double.parseDouble(txVerseDR));

       Famille f = new Famille();
       Gamme g = new Gamme();

       for (int i=0; i<listeGammesAffichables.size(); i++){
           if (listeGammesAffichables.get(i).getLibelle().equals(nomGamme)){
               g = listeGammesAffichables.get(i);
           }
       }

       for (int i=0; i<listeFamillesAffichables.size(); i++){
           if (listeFamillesAffichables.get(i).getLibelle().equals(nomFamille)){
               f = listeFamillesAffichables.get(i);
           }
       }

       f.setGamme(g);
       p.setFamille(f);

       d.create(p);

       return "../vues/rechercherProduit.xhtml";    
    }

    /**
     * Retourne la liste des famille disponible dans la gamme selectionée
     * @param event
     */
    public void filterFamily(javax.faces.event.ValueChangeEvent event){
        listeFamillesAffichables = new ArrayList<Famille>();
        for (int i=0; i<listeFamilles.size(); i++){
            if (listeFamilles.get(i).getGamme().getLibelle().equals((String)event.getNewValue())){
                listeFamillesAffichables.add(listeFamilles.get(i));
            }
        }
    }
}

facelet组件:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <!-- 
    prend en parametre :
    nomGamme
    listeGammesAffichables
    nomFamille
    listeFamillesAffichables
    nomFournisseur
    listeFournisseurAffichables
    designation
    txRecu
    txVerseCGP
    txVerseDR
    txIncompressible
    indications
    >>>methode<<<<
    filterFamily
     -->
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:mytaglib="http://mytaglib.com/facelets"
    xmlns:rich="http://richfaces.org/rich"
    xmlns:a4j="http://richfaces.org/a4j">

        <h:panelGrid columns="4" width="800">
            <h:column>
                <h:outputText value="#{msg['Gamme']}" />:
            </h:column>
            <h:column>
                <h:selectOneMenu value="#{nomGamme}"
                valueChangeListener="#{filterFamily}">
                <f:selectItem itemLabel="-" itemValue="-" />
                <f:selectItems value="#{listeGammesAffichables}" var="g"
                itemValue="#{g.libelle}" itemLabel="#{g.libelle}" />
                <a4j:ajax event="valueChange" render="second" execute="@this" />
                </h:selectOneMenu>
            </h:column>
            <h:column>
                <h:outputText value="#{msg['Famille']}" />:
            </h:column>
            <h:column>
                <a4j:outputPanel id="second">
                <h:selectOneMenu value="#{nomFamille}">
                <f:selectItem itemLabel="-" itemValue="-" />
                <f:selectItems value="#{listeFamillesAffichables}" var="f"
                itemValue="#{f.libelle}" itemLabel="#{f.libelle}" />
                </h:selectOneMenu>
                </a4j:outputPanel>
            </h:column>
            <h:column>
                <h:outputText value="#{msg['Fournisseur']}" />: *
            </h:column>
            <h:column>
                <h:selectOneMenu value="#{nomFournisseur}">
                <f:selectItem itemLabel="-" itemValue="-" />
                <f:selectItems value="#{listeFournisseurAffichables}" var="g"
                itemValue="#{g.libelle}" itemLabel="#{g.libelle}" />
                </h:selectOneMenu>
            </h:column>
            <h:column>
            </h:column>
        </h:panelGrid>
        <br />
        <br />
        <h:outputText value="#{msg['DesignationProduit']}" />
        : *
        <br />
        <br />
        <h:inputText value="#{designation}" id="designation"
        style="#{component.valid ? '' : 'border-color:red;border-width:2px'}">
        <f:validateRegex pattern="^([a-zA-Z'àâéèêôùûçÀÂÉÈÔÙÛÇ0-9\s-]{1,30})$"></f:validateRegex>
        <rich:validator />
        </h:inputText>
        <h:message for="designation" />
        <br />
        <br />
        <h:outputText value="#{msg['TauxDeComission']}" />
        : *
        <br />
        <br />
        <h:panelGrid  columns="4" headerClass="heading"
        rowClasses="row1,row2">
        <h:column>
            <h:outputText value="#{msg['TxRecu']}" />
        </h:column>
        <h:column>
            <h:inputText value="#{txRecu}"
            style="#{component.valid ? '' : 'border-color:red;border-width:2px'}"
            id="TxRecu">
            <f:validateRegex pattern="^[0-9]*.?[0-9]+$"></f:validateRegex>
            <rich:validator />
            </h:inputText>
        </h:column>
        <h:column>
            <h:outputText value="#{msg['TxVerseCGP']}" />
        </h:column>
        <h:column>
            <h:inputText value="#{txVerseCGP}"
            style="#{component.valid ? '' : 'border-color:red;border-width:2px'}"
            id="TxVerseCGP">
            <f:validateRegex pattern="^[0-9]*.?[0-9]+$"></f:validateRegex>
            <rich:validator />
            </h:inputText>
        </h:column>
        <h:column>
            <h:outputText value="#{msg['TxVerseDR']}" />
        </h:column>
        <h:column>
            <h:inputText value="#{txVerseDR}"
            style="#{component.valid ? '' : 'border-color:red;border-width:2px'}"
            id="TxVerseDR">
            <f:validateRegex pattern="^[0-9]*.?[0-9]+$"></f:validateRegex>
            <rich:validator />
            </h:inputText>
        </h:column>
        <h:column>
            <h:outputText value="#{msg['TxIncompressible']}" />
        </h:column>
        <h:column>
            <h:inputText value="#{txIncompressible}"
            style="#{component.valid ? '' : 'border-color:red;border-width:2px'}"
            id="TxIncompressible">
            <f:validateRegex pattern="^[0-9]*.?[0-9]+$"></f:validateRegex>
            <rich:validator />
            </h:inputText>
        </h:column>
    </h:panelGrid>
    <br />
    <br />
    <h:outputText value="#{msg['Indications']}" />
    : *
    <br />
    <br />
    <h:inputTextarea value="#{indications}" cols="113"
        rows="10"
        style="#{component.valid ? '' : 'border-color:red;border-width:2px'}"
        id="indications">
        <f:validateRegex pattern="^([a-zA-Z'àâéèêôùûçÀÂÉÈÔÙÛÇ0-9\s-]{1,1000})$"></f:validateRegex>
        <rich:validator />
    </h:inputTextarea>
<br />
<br />
        <div class="boutons">
                <span><h:commandButton type="submit"
                        value="#{msg['Enregistrer']}" action="#{creerProduit.submit}" /></span> <span><h:commandButton
                        value="#{msg['Reinitialiser']}" type="reset" /></span> <span><h:commandButton
                        value="#{msg['Annuler']}" action="rechercherProduit.xhtml"
                        onclick="return confirm('#{msg['ConfirmerAnnulation']}');"
                        immediate="true" /></span>
            </div>
</ui:composition>

以下是我在jsf页面中调用它的方式:

<mytaglib:cmProduit 
                nomGamme="#{creerProduit.nomGamme}"
                listeGammesAffichables="#{creerProduit.listeGammesAffichables}"
                nomFamille="#{creerProduit.nomFamille}"
                listeFamillesAffichables="#{creerProduit.listeFamillesAffichables}"
                nomFournisseur="#{creerProduit.nomFournisseur}"
                listeFournisseurAffichables="#{creerProduit.listeFournisseurAffichables}"
                designation="#{creerProduit.designation}"
                txRecu="#{creerProduit.txRecu}"
                txVerseCGP="#{creerProduit.txVerseCGP}"
                txVerseDR="#{creerProduit.txVerseDR}"
                txIncompressible="#{creerProduit.txIncompressible}"
                indications="#{creerProduit.indications}"
                filterFamily="#{creerProduit.filterFamily}"
                 />

当我重新定义范围时,我的tomcat就是这样说的:

GRAVE:/WEB-INF/forms/formProduit.xhtml @ 34,43 valueChangeListener =“#{filterFamily}”:/ vues / sparkProduit.xhtml @ 56,8 filterFamily =“#{creerProduit.filterFamily}”:Property在com.me.web.beans.produit.CreerProduitBean类型中找不到'filterFamily' javax.faces.event.AbortProcessingException:/WEB-INF/forms/formProduit.xhtml @ 34,43 valueChangeListener =“#{filterFamily}”:/ vues / sparkProduit.xhtml @ 56,8 filterFamily =“#{creerProduit.filterFamily} “:在com.me.web.beans.produit.CreerProduitBean类型中找不到属性'filterFamily'

知道为什么我不能称这种方法吗?

1 个答案:

答案 0 :(得分:1)

那不是复合组件。那也不是一个自定义组件。这是一个标签文件。您需要使用<method-signature>文件中的.taglib.xml将该属性声明为方法表达式。否则,它将默认为值表达式,该表达式需要具有getter / setter的属性。

<attribute>
    <name>filterFamily</name>
    <method-signature>void method(javax.faces.event.ValueChangeEvent)</method-signature>
</attribute>

真实的复合组件中,您可以将其声明为<cc:attribute method-signature>

<cc:attribute name="filterFamily" method-signature="void method(javax.faces.event.ValueChangeEvent)" />

另见: