Передача выражения метода 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>
,