3

我一直在玩复合组件,但遇到了一些我无法弄清楚的事情。如果不使用复合组件,我会有这样的东西:

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

注意:显然这两个不起作用,否则我不会问这个问题。

4

1 回答 1

2

真正的问题是是否有一种方法可以传递选项而不必使用支持 bean?我猜是这样的:

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

您可以使用 JSTLfn: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> 
于 2011-06-09T20:50:41.703 回答