2011-04-28 3 views
10

Je voudrais avoir un composant ui réutilisable qui est lié au modèle.Comment faire un composant réutilisable dans JSF?

Par exemple:

  1. j'ai un selectonemenu qui est enchaînée à un autre selectonemenu (comme département -> sous-département)
  2. Aimerait faire une pièce composite
  3. Ce composant composite est Je vais être lié à un Bean JSF spécifique

Je pense que cette idée fonctionne si je n'utilise qu'un composant composite.

Mais cela ne fonctionnera pas si je fais usage de plus d'un compositeComponent du même type, puisque le Bean JSF de compositeComponent sera le même (dans cet exemple, im en utilisant la portée de vue), et partagera l'état entre un ou plusieurs composants composites.

Ceci est un exemple approximatif qui illustre ma confusion. Dans ce cas, Page1.xhtml (avec le modèle principal de Page1Bean.java), fait usage de 2 compositeComponents (qui est gérée par le Bean JSF de MyCompositeComponent.java)

La composante composite sera quelque chose comme:

<!-- one composite component that has 2 chained selectOneMenus --> 
<h:selectOneMenu 
    ... 
    value="#{myCompositeComponentBean.firstComboValue}" 
    valueChangeListener="#{myCompositeComponentBean.yyy}"> 
    <f:ajax event="valueChange" execute="@this" ... /> 
    <f:selectItem itemLabel="Choose one .." noSelectionOption="true" /> 
    <f:selectItems value="#{myCompositeComponentBean.firstComboList}" .... /> 
</h:selectOneMenu> 
<h:selectOneMenu 
    ... 
    value="#{myCompositeComponentBean.secondComboValue}" 
    valueChangeListener="#{myCompositeComponentBean.bbb}"> 
    <f:selectItem itemLabel="Choose one .." noSelectionOption="true" /> 
    <f:selectItems value="#{myCompositeComponentBean.secondComboList}" .... /> 
</h:selectOneMenu> 

Et le JSF du composant composite Bean sera comme:

// this model will serve the composite component 
@Named 
@Scope("view") 
public class MyCompositeComponentBean { 
    private String firstComboValue, secondComboValue; 
    private List<String> firstComboList, secondComboList; 
    ... 
} 

Voici un exemple de Page1.xhtml:

.... 
main department : <my:comboChainComponent /> <!-- 2 select items will be rendered here --> 
secondary department : <my:comboChainComponent /> <!-- another 2 select items will be rendered here --> 
.... 

Et le Page1Bean (Principal JSF Bean pour Page1.xhtml)

@Named 
@Scope("view") 
public class Page1Bean { 
    // inject the first bean for the composite component 1 
    @Inject private MyCompositeComponentBean bean1; 
    @Inject private MyCompositeComponentBean bean2; 
    ... 
} 

Est-il possible de réaliser ce genre de réutilisabilité?

Merci.

Répondre

4

Pourquoi ne pas utiliser ce genre d'approche.

<mytag:combo id="combo1" 
     value="#{bean.firstData}" 
     model="#{globalBean.getList()}" 
     update="form1:combo2" /> 

<mytag:combo id="combo2" 
     value="#{bean.secondData}" 
     model="#{globalBean.getSubList(bean.firstData)}" /> 

Vous pouvez utiliser l'attribut composite.

... 
<composite:interface name="combo"> 
    ... define your attributes here 
</composite:interface> 

<composite:implementation> 
<p:outputPanel id="content"> 
    <p:selectOneMenu id="select_menu_1" value="#{cc.attrs.value}"> 
     <f:selectItems value="#{cc.attrs.model}" /> 
     <p:ajax event="change" process="@this" update="#{cc.attrs.update}" /> 
    //add converter if you want 
    </p:selectOneMenu> 
</p:outputPanel> 
</composite:implementation> 

Cordialement.

2

Dans JSF 2.0, la création de composants composites est un jeu d'enfant. Voici un bon tutoriel: http://weblogs.java.net/blog/driscoll/archive/2008/11/writing_a_simpl.html

+1

Bonjour, merci pour la réponse. Je n'ai pas encore de difficultés techniques dans le développement d'un composant composite, mais plutôt sur la façon de rendre ce composant composite réutilisable avec son bean JSF couplé, qui peut être utilisé plusieurs fois sur une seule page. – bertie

+0

Bonjour Albert, vous pouvez utiliser le composant composite autant que vous le souhaitez sur une seule page (même si je ne comprends pas vraiment le besoin). –

3

Selon ce que vous essayez de mettre en œuvre, vous pouvez utiliser une « composante sauvegarde » (= une classe java associée à votre composant composite Facelet). Voir ce post: http://weblogs.java.net/blog/cayhorstmann/archive/2010/01/30/composite-input-components-jsf

Encore peut-être, en fonction de ce que vous faites réellement, vous pourriez probablement mieux définir vos composants composites, en utilisant principalement plus de paramètres et un meilleur modèle pour passer des valeurs (si nécessaire). Je manque de connaissances sur votre application pour donner un meilleur conseil.

+0

Je me rends compte que mon message original manque encore. Je vais construire un exemple clair simple pour démontrer ma question initiale bientôt. Merci pour la suggestion. – bertie

+0

vous rendre un exemple plus simple pourrait être utile, mais j'ai l'impression qu'un composant de support devrait résoudre votre problème ;-) – ymajoros

2

Je ne suis pas certain de vous avoir parfaitement compris, mais vous voudrez peut-être passer un argument à componentComposition que vous aurez compilé.

main department : <my:comboChainComponent worksOn="#{page1Bean.bean1}" /> <!-- 2 select items will be rendered here --> 
secondary department : <my:comboChainComponent worksOn="#{page1Bean.bean2}"/> <!-- another 2 select items will be rendered here --> 

Hope it helps ...

Questions connexes