Как сделать многоразовый компонент в JSF? - PullRequest
10 голосов
/ 28 апреля 2011

Я хотел бы иметь многократно используемый компонент пользовательского интерфейса, связанный с моделью.

Например:

  1. У меня есть selectonemenu, которое связано с другим selectonemenu (например, отдел -> подразделение)
  2. Хотел бы сделать это составным компонентом
  3. Этот составной компонент будет привязан к определенному компоненту JSF

Я думаю, что эта идея работает, если я использую только один композитный компонент.

Но это не сработает, если я буду использовать более одного составного компонента одного и того же типа, поскольку JSF-компонент составного компонента будет одинаковым (в этом примере я использую область видимости) и будет делить состояние между одним или несколькими составными компонентами.

Это один грубый пример, который иллюстрирует мое замешательство. В этом случае Page1.xhtml (с основной моделью Page1Bean.java) использует 2 CompositeComponents (который обрабатывается компонентом JSF MyCompositeComponent.java)

Композитный компонент будет выглядеть примерно так:

<!-- 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 Bean составного компонента будет выглядеть так:

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

4 голосов
/ 10 мая 2011

Почему бы не использовать такой подход.

<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>
3 голосов
/ 29 апреля 2011

В зависимости от того, что вы пытаетесь реализовать, вы можете использовать некоторый «компонент поддержки» (= класс Java, связанный с вашим составным компонентом лицевой стороны). Смотрите это сообщение: http://weblogs.java.net/blog/cayhorstmann/archive/2010/01/30/composite-input-components-jsf

Тем не менее, возможно, в зависимости от того, что вы действительно делаете, вы могли бы лучше определить ваши составные компоненты, в основном используя больше параметров и лучшую модель для передачи значений (если это необходимо). Мне не хватает некоторых знаний о вашем приложении, чтобы дать лучший совет.

2 голосов
/ 04 мая 2011

Не уверен, что я вас прекрасно понимаю, но вы, возможно, захотите передать аргумент компоненту Композиция, которую вы строите.

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

Надеюсь, это поможет ...

2 голосов
/ 28 апреля 2011

В JSF 2.0 создание составных компонентов совсем несложно. Вот хороший урок: http://weblogs.java.net/blog/driscoll/archive/2008/11/writing_a_simpl.html

...