Java 如何在JSF中制作可重用组件?

Java 如何在JSF中制作可重用组件?,java,jsf,jsf-2,primefaces,Java,Jsf,Jsf 2,Primefaces,我希望有一个可重用的ui组件,它与模型相关联 例如: 我有一个selectonemenu链接到另一个selectonemenu(如department->sub department) 希望使其成为复合组件 这个复合组件将绑定到一个特定的JSFbean 我认为如果我只使用一个compositeComponent,这个想法就行了 但是,如果我使用多个相同类型的compositeComponent,这将不起作用,因为compositeComponent的JSF Bean将是相同的(在本例中,我使用视

我希望有一个可重用的ui组件,它与模型相关联

例如:

  • 我有一个selectonemenu链接到另一个selectonemenu(如department->sub department)
  • 希望使其成为复合组件
  • 这个复合组件将绑定到一个特定的JSFbean
  • 我认为如果我只使用一个compositeComponent,这个想法就行了

    但是,如果我使用多个相同类型的compositeComponent,这将不起作用,因为compositeComponent的JSF Bean将是相同的(在本例中,我使用视图范围),并且将在一个或多个compositeComponent之间共享状态

    这是一个粗略的例子,说明了我的困惑。在本例中,Page1.xhtml(主模型为Page1Bean.java)使用了2个compositeComponents(由MyCompositeComponent.java的JSFbean处理)

    复合组件将类似于:

    <!-- 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>
    
    有可能实现这种可重用性吗


    谢谢。

    在JSF2.0中,创建复合组件很简单。 以下是一个很好的教程:

    根据您试图实现的内容,您可以使用一些“支持组件”(=与facelet复合组件关联的java类)。见此帖:


    不过,根据您的实际操作,您可能可以更好地定义复合组件,主要是使用更多参数和更好的传递值模型(如果需要)。我对您的应用程序缺乏一些知识,无法提供更好的建议。

    我不确定我是否完全理解您,但您可能希望将一个参数传递给您构建的组件组合

        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 -->
    
    主要部门:
    第二部门:
    

    希望它有帮助……

    为什么不使用这种方法呢

    <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)}"  />
    
    
    
    可以使用复合属性

    ...
    <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>
    
    。。。
    ... 在这里定义您的属性
    //如果需要,请添加转换器
    
    您好,谢谢您的回复。我在开发复合组件方面还没有技术上的困难,但更重要的是如何使这个复合组件与耦合的JSF Bean一起可重用,它可以在一个页面中多次使用。嗨,Albert,你可以在一个页面中随心所欲地使用复合组件(即使我真的不了解需要)。我意识到我原来的帖子仍然缺乏。我将很快构建一个简单清晰的示例来演示我原来的问题。谢谢你的建议。让你的示例更简单可能会有用,但我的印象是,支持组件应该可以解决你的问题;-)
        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 -->
    
    <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)}"  />
    
    ...
    <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>