微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – 如何使JSF中的可重用组件?

我想有一个可重用的ui组件,与模型有关.

例如 :

>我有一个选择菜单链接到另一个选择菜单(像部门 – >子部门)
想把这个复合组件
>这个复合组件将绑定到特定的JSF Bean

我认为这个想法是有效的,如果我只使用一个复合组件.

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

这是一个粗略的例子,说明我的困惑.在这种情况下,Page1.xhtml(具有Page1Bean.java的主要模型)使用2个compositeComponents(由MyCompositeComponent.java的JSF Bean处理)

复合组件将类似于:

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

而复合组件的JSF Bean将如下所示:

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

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

而Page1Bean(用于Page1.xhtml的主要JSF Bean)

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

是否可以实现这种可重用性?

谢谢.

解决方法

为什么不使用这种方法.
<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>

最好的祝福.

原文地址:https://www.jb51.cc/java/125010.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐