我有这种形式,更改范围一时,行comboBox可以重新生成。 这是通过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));
}
}
}
}
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'
知道为什么我不能称这种方法吗?
答案 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)" />