我一直在玩复合材料组件,我碰到了一些我无法弄清楚的东西。如果不使用复合组件,我会这样:
<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>
注意:显然这两个不起作用或者我不会问这个问题。
答案 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>