Как сделать компонент многократного использования в JSF?

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

Например:

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

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

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

Это один грубый пример, который иллюстрирует мою путаницу. В данном случае Page1.xhtml (с основной моделью Page1Bean.java), использует 2 составных компонента (которые обрабатываются 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-компонент составного компонента будет иметь вид:

// 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;
    ...
}

Можно ли добиться такого повторного использования?

Спасибо.

10
задан abatishchev 29 April 2011 в 08:32
поделиться