Передача выражения метода EL в качестве атрибута пользовательского тег-файла Facelets

Я создал собственный тег JSF:

<ui:composition>
    <h:panelGroup>
        <rich:dataScroller id="#{id}" for="#{table}" execute="#{table}"
            page="#{scrollerPage}" render="#{table}-sc1" maxPages="5"
            fastControls="hide" oncomplete="#{onCompl}" scrollListener="#{scrollListenerBean[scrollListenerMethod]}" />
        <h:inputText value="#{scrollerPage}" id="#{table}-sc1" size="2">
            <f:convertNumber integerOnly="true" />
        </h:inputText>
        <h:outputText styleClass="outputText"
            value=" of #{scrollPagesCount}  " />
        <h:commandButton value="GO! " />
    </h:panelGroup>
</ui:composition>

Чтобы передать метод listener, я использовал решение, предложенное в довольно старом блоге:

<my:dataScroller id="idDS1" table="table1"
                    scrollerPage="#{bean.navigationHelper.scrollerPage}"
                    scrollPagesCount="#{bean.navigationHelper.scrollPagesCount}"
                    onCompl="initForm();" 
                    scrollListenerBean="#{bean}"
                    scrollListenerMethod="aMethod" />

Мои вопросы: это лучший способ сделать это? Как я могу сделать метод необязательным?

Большое спасибо за любую помощь! до свидания!

1 ответ

Решение

Мои вопросы: это лучший способ сделать это?

В любом случае, это единственный путь, при условии, что вы можете использовать только стандартные средства JSF/EL и не можете создать собственный обработчик тегов.

Однако вы можете создать собственный обработчик тегов, чтобы преобразовать выражение значения в выражение метода. В служебной библиотеке JSF OmniFaces есть <o:methodParam> именно для этой цели. Смотрите также <o:methodParam> демонстрационная страница

Вы могли бы тогда закончить как:

<my:dataScroller ... scrollListener="#{bean.aMethod}" />

а также

<o:methodParam name="scrollListenerMethod" value="#{scrollListener}" />
<rich:dataScroller ... scrollListener="#{scrollListenerMethod}" />

Как я могу сделать метод необязательным?

Теоретически, вы можете использовать теги JSTL для условного построения представления. Что-то вроде:

<h:someComponent>
    <c:if test="#{not empty fooAttribute}">
        <f:attribute name="foo" value="#{fooAttriubte}" />
    </c:if>
</h:someComponent>

Но это в частном случае специального атрибута слушателя выражения метода, к сожалению, это невозможно. Там нет такого понятия, как <rich:scrollListener> или что-то, что позволяет связывать специфичные для RichFaces scrollListener в качестве отдельного тега к <rich:dataScroller>, Лучшее, что вы могли бы сделать, не создавая собственные обработчики тегов, - это дублировать все <rich:dataScroller> в двоем <c:if>с (или <c:choose>); один с другим scrollListener, Это слишком неуклюже. Вы бы действительно лучше создать кастом <my:richScrollListener> TagHandler для этого, который вы могли бы затем поместить в <c:if>,

Другие вопросы по тегам