JSF Composite组件和selectItems

时间:2011-06-09 19:33:40

标签: java jsf-2 composite-component

我一直在玩复合材料组件,我碰到了一些我无法弄清楚的东西。如果不使用复合组件,我会这样:

<h:outputText value="Some Label:"/>
<h:selectOneMenu">
  <f:selectItem itemLabel="Item 1"/>
  <f:selectItem itemLabel="Item 2"/>
  <f:selectItem itemLabel="Item 3"/>
</h:selectOneMenu>

我基本上将该代码段转换为复合组件:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"  
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:composite="http://java.sun.com/jsf/composite">

  <!-- INTERFACE -->
  <composite:interface>
    <composite:attribute name="label" required="true"/>
    <composite:attribute name="options" required="true"/>      
  </composite:interface>

  <!-- IMPLEMENTATION -->          
  <composite:implementation>
    <h:outputText value="#{cc.attrs.label}"/>
    <h:selectOneMenu style="width:140px;">
        <f:selectItem value="#{cc.attrs.options}" />
    </h:selectOneMenu>  
  </composite:implementation>
</html>

现在这里是我难倒的地方。我知道我可以把我想要在组件中使用的项目列表放在一个支持bean中,并像这样使用它:

<util:dropdown label="Some Label:" options="#{backingBean.list}"/>

真正的问题是,是否有办法传递选项而不必使用支持bean?我猜是这样的:

<util:dropdown label="Some Label:" options="Item 1, Item 2, Item 3"/>

或者

<util:dropdown label="Some Label:" options="#{backingBean.list}">
     <f:selectItem itemLabel="Item 1"/>
     <f:selectItem itemLabel="Item 2"/>
     <f:selectItem itemLabel="Item 3"/>
</util:dropdown>

注意:显然这两个不起作用或者我不会问这个问题。

1 个答案:

答案 0 :(得分:2)

  

真正的问题是,是否有办法传递选项而不必使用支持bean?我猜是这样的:

     
<util:dropdown label="Some Label:" options="Item 1, Item 2, Item 3"/>

您可以使用JSTL fn:split()将其拆分为String[]<f:selectItems>也接受value。我只删除options属性中逗号周围的空格。

xmlns:fn="http://java.sun.com/jsp/jstl/functions"
...

<h:selectOneMenu>
    <f:selectItems value="#{fn:split(cc.attrs.options, ',')}" />
</h:selectOneMenu> 

  

或者

     
<util:dropdown label="Some Label:">
    <f:selectItem itemLabel="Item 1"/>
    <f:selectItem itemLabel="Item 2"/>
    <f:selectItem itemLabel="Item 3"/>
</util:dropdown>

您可以在复合组件中使用<composite:insertChildren>来声明复合组件子项必须插入的位置。

<h:selectOneMenu>
    <composite:insertChildren />
</h:selectOneMenu>