2011-04-28 26 views
10

我想拥有一个与模型绑定的可重用UI组件。如何在JSF中创建可重用组件?

例如:

  1. 我有一个链接到另一个selectOneMenu用于一个selectOneMenu用于(如部门 - >子部门)
  2. 想使之成为一个复合材料部件
  3. 这种复合组件将被绑定到特定的JSF豆

我认为这个想法的作品,如果即时通讯只使用一个compositeComponent。

但是,如果我使用相同类型的多个compositeComponent的,这不会起作用,因为compositeComponent的JSF豆将是相同的(在这个例子中,即时通讯使用的视图范围内),并且将共享状态在一个或多个复合组件之间。

这是一个粗略的例子,说明了我的困惑。在这种情况下,Page1.xhtml(与Page1Bean.java的主模型),利用了2个compositeComponents(其由MyCompositeComponent.java的JSF豆处理)

的复合元件将是这样的:

<!-- 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豆会像:

// 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(JSF主要为豆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; 
    ... 
} 

是否有可能实现这种重用的?

谢谢。

回答

4

为什么不使用这种方法。

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

此致敬意。

2

在JSF 2.0中,创建复合组件很简单。 这里是一个很好的教程: http://weblogs.java.net/blog/driscoll/archive/2008/11/writing_a_simpl.html

+1

你好,谢谢你的回复。我还没有开发复合组件的技术困难,但更重要的是如何使这个复合组件可重复使用以及它的耦合JSF Bean,它可以在单个页面中多次使用。 – bertie 2011-04-28 12:23:15

+0

嗨,阿尔伯特,你可以在单个页面中使用复合组件(尽管我不太了解需求)。 – 2011-04-28 14:39:27

3

取决于你正在尝试实现,你可以使用一些“支持组件”(=关联到你的facelet复合材料构件的Java类)。看到这篇文章:http://weblogs.java.net/blog/cayhorstmann/archive/2010/01/30/composite-input-components-jsf

也许,根据你真正在做什么,你可能会更好地定义你的复合组件,主要是使用更多的参数和更好的模型来传递值(如果需要)。我缺乏一些关于您的应用程序的知识以提供更好的建议。

+0

我意识到我原来的帖子还是缺乏。我会尽快建立一个简单明了的例子来展示我的原始问题。感谢您的建议。 – bertie 2011-04-29 09:10:34

+0

使您的示例更简单可能会有用,但我的印象是支持组件应该可以解决您的问题;-) – ymajoros 2011-04-29 09:51:57

2

不知道我完全理解你,但你可能想传递一个参数给你构建的componentComposition。

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

希望它可以帮助...

相关问题