0

我有这种形式,当更改范围一时,应该重新生成线组合框。这是使用来自richfaces 的a4j 完成的。

表格

在我把它做成一个 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));
            }
        }
    }
}

小面组件:

<!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 会这样说:

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

知道为什么我不能调用这个方法吗?

4

1 回答 1

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)" />

也可以看看:

于 2012-07-13T03:22:24.317 回答