Динамическая загрузка Java Facelets и атрибуты составного компонента - PullRequest
3 голосов
/ 30 января 2011

В настоящее время я пытаюсь реализовать технологию webpart с JavaServer Faces 2.0 с технологией просмотра Facelets для образовательных целей. Я создал шаблоны Facelet, пользовательские компоненты Facelet и создал несколько шаблонных клиентов Facelet. Но в одном я застрял. Я не могу динамически загрузить элементы управления и поставить их cc:attributes.

Если у меня есть страница, например, со статическим текстом или связать ее с ManagedBean, свойство ui:include все работает хорошо.

<ui:define name="right-column">
    right-column asd
    <h:link outcome="asdf" value="link_get">
        <f:param name="aa" value="123" />
        <f:param name="a" value="123 dd + 20" />
    </h:link>
    <h:commandLink action="asdf?faces-redirect=true" value="asdf">
        <f:param name="aa" value="123" />
    </h:commandLink><br />
    <ui:include src="./resources/Controls/CategoryTree.xhtml"/><br />
    This works even if I put src with MenageBean property.
    <ui:include src="#{browseProducts.incudePath}"/>
</ui:define>

Вот мой элемент управления Facelet (привязка данных находится внутри этого элемента управления в #{TreeBean.root}:

<!-- NO INTERFACE -->
<cc:interface>
</cc:interface>

<!-- IMPLEMENTATION -->
<cc:implementation>
<!--    This is a very simply scaffolding for Category Three Control.
    -->
    <p:tree value="#{TreeBean.root}" var="node"
            expandAnim="FADE_IN" collapseAnim="FADE_OUT">
        <p:treeNode>
            <h:outputText value="#{node}" />
        </p:treeNode>
    </p:tree>

</cc:implementation>

Но у меня проблема, когда ui:include указывает на элемент управления с cc:attribute. Я не знаю, как инициализировать этот атрибут из бэк-компонента и делать «вещи».

Например, у меня есть эта страница:

<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
                template="./resources/layout/Template.xhtml"
                xmlns:sc="http://java.sun.com/jsf/composite/Controls">

    <ui:define name="right-column">
        <sc:dummy ItemCount="10" />
        <ui:include src="./resources/Controls/dummy.xhtml" />
    </ui:define>
</ui:composition>

А вот и композитный элемент управления:

<cc:interface>
        <cc:attribute name="ItemCount" required="true"
                      shortDescription="This attribute is meaningful "  />
    </cc:interface>
    <!-- IMPLEMENTATION -->
    <cc:implementation>
    <!-- How to pass ItemCount to my dummy bean to create so many items in
    list as ItemCount value -->
        <ui:repeat value="#{dummy.dummyList}" var="dummyItem">
            <h:outputText value="#{dummyItem}" />
        </ui:repeat>
    </cc:implementation>

И код бобов:

public ArrayList<String> getDummyList() {
    //Here I try to get dummy list work.
    dummyList = new ArrayList<String>(getDummyCount());
    for (int i=0;i< getDummyCount();i++){
        dummyList.add(i + "" + i);
    }
    return dummyList;
}

Как это можно сделать?

1 Ответ

0 голосов
/ 09 мая 2011

Я думаю, что у вас есть две проблемы:

  1. вызов метода с параметром из составного компонента
  2. указание какого-либо параметра для включенной страницы

Для 1., так как jsf 2, вы можете вызвать метод напрямую, указав параметр (который должен быть частью сигнатуры метода):

        <ui:repeat value="#{dummy.getDummyList(cc.attrs.dummyCode)}" var="dummyItem">
            <h:outputText value="#{dummyItem}" />
        </ui:repeat>

Но я подозреваю, что вы пытаетесь использовать поддержку для чего-то, чтоэто не предназначено для.Возможно, вам будет интересно написать бэк-код Java для вашего составного компонента, который отличается.Трудно освоить, если вы новичок, хотя.Сначала я бы попытался по-разному оформить свои страницы и взаимодействие между компонентами.Я не знаю, какую проблему вы пытаетесь решить, но на первый взгляд, это решение выглядит слишком сложным.

Для 2. вам следует взглянуть на ui: param.Быстрый поиск в Google дает мне это: http://www.jsfcentral.com/articles/facelets_3.html

...