我有这种形式,当更改范围一时,应该重新生成线组合框。这是使用来自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”
知道为什么我不能调用这个方法吗?