2011-04-28 40 views
10

Me gustaría tener un componente ui reutilizable que esté vinculado al modelo.¿Cómo hacer un componente reutilizable en JSF?

Por ejemplo:

  1. tengo un selectonemenu que está encadenado a otro selectonemenu (como departamento -> subdepartamento)
  2. gustaría hacer de este un componente compuesto
  3. Este componente compuesto es va a estar vinculado a un JSF Bean específico

Creo que esta idea funciona si solo estoy usando un componente compuesto.

Pero esto no funcionará si hago uso de más de un compositeComponent del mismo tipo, ya que la de compositeComponent JSF frijol será el mismo (en este ejemplo, im utilizando la vista alcance), y compartirá el estado entre uno o más CompositesComponents.

Este es un ejemplo aproximado que ilustra mi confusión. En este caso, Page1.xhtml (con el modelo principal de Page1Bean.java), hace uso de 2 compositeComponents (que es manejado por el JSF haba de MyCompositeComponent.java)

El componente compuesto será algo como:

<!-- 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> 

Y del componente compuesto JSF frijol será como:

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

Este es un ejemplo 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 --> 
.... 

Y el Page1Bean (JSF principal de la haba por 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; 
    ... 
} 

¿Es posible lograr este tipo de reutilización?

Gracias.

Respuesta

4

Por qué no utilizan este tipo de enfoque.

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

Puede usar el atributo compuesto.

... 
<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> 

Recuerdos.

2

En JSF 2.0, la creación de componentes compuestos es muy fácil. Aquí es un buen tutorial: http://weblogs.java.net/blog/driscoll/archive/2008/11/writing_a_simpl.html

+1

Hola, gracias por la respuesta. Todavía no tengo las dificultades técnicas para desarrollar un componente compuesto, pero se trata más de cómo hacer que este componente compuesto sea reutilizable junto con JSF Bean, que se puede usar varias veces en una sola página. – bertie

+0

Hola Albert, puedes utilizar el componente compuesto como la masa que quieras en una sola página (incluso si realmente no entiendo la necesidad). –

3

Dependiendo de lo que está tratando de poner en práctica, se podría utilizar un poco de "componente de copia de seguridad" (= una clase java asociado a su componente compuesto facelet). Ver este post: http://weblogs.java.net/blog/cayhorstmann/archive/2010/01/30/composite-input-components-jsf

Aún así, tal vez, dependiendo de lo que están haciendo en realidad, es probable que mejor podría definir sus componentes compuestos, principalmente utilizando más parámetros y un mejor modelo para los valores que pasa (si es necesario). Me falta algo de conocimiento de tu aplicación para dar un mejor consejo.

+0

Me doy cuenta de que mi publicación original aún falta. Voy a construir un simple ejemplo claro para demostrar mi pregunta original pronto. Gracias por la sugerencia. – bertie

+0

haciéndole un ejemplo más simple podría ser útil, pero estoy bajo la impresión de que un componente de respaldo debería resolver su problema ;-) – ymajoros

2

No estoy seguro de entenderlo perfectamente, pero es posible que desee pasar un argumento al componenteComposition que construye.

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 --> 

creo que sirve ...

Cuestiones relacionadas