Композитный компонент JSF и элементы выбора - PullRequest
2 голосов
/ 09 июня 2011

Я играл с составными компонентами и столкнулся с чем-то, что я не мог понять. Без использования составного компонента у меня было бы что-то вроде этого:

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

Теперь вот где я в тупике. Я знаю, что мог бы поместить список элементов, которые я хочу использовать в компоненте, в компонент поддержки и использовать его следующим образом:

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

Реальный вопрос заключается в том, есть ли способ передать опции без необходимости использовать вспомогательный компонент? Я думаю, что-то вроде:

<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 Ответ

2 голосов
/ 10 июня 2011

Реальный вопрос заключается в том, есть ли способ передать опции без использования вспомогательного компонента? Я думаю, что-то вроде:

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