将 EL 方法表达式作为自定义 Facelets 标记文件的属性传递
Posted
技术标签:
【中文标题】将 EL 方法表达式作为自定义 Facelets 标记文件的属性传递【英文标题】:Passing EL method expression as attribute of custom Facelets tagfile 【发布时间】:2021-12-21 14:30:48 【问题描述】:我创建了一个自定义 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>
为了传递监听器方法,我使用了一个很老的blog中建议的解决方案:
<my:dataScroller id="idDS1" table="table1"
scrollerPage="#bean.navigationHelper.scrollerPage"
scrollPagesCount="#bean.navigationHelper.scrollPagesCount"
onCompl="initForm();"
scrollListenerBean="#bean"
scrollListenerMethod="aMethod" />
我的问题是:这是最好的方法吗?如何使该方法成为可选方法?
非常感谢您的帮助!再见!
【问题讨论】:
【参考方案1】:我的问题是:这是最好的方法吗?
无论如何,这是唯一的方式,前提是您只能使用标准的 JSF/EL 工具并且不能创建自定义标记处理程序。
但是,您可以创建自定义标记处理程序来将值表达式转换为方法表达式。 OmniFaces JSF 实用程序库有一个 <o:methodParam>
用于此目的。另见the <o:methodParam>
demo page。
然后你可能会变成这样:
<my:dataScroller ... scrollListener="#bean.aMethod" />
和
<o:methodParam name="scrollListenerMethod" value="#scrollListener" />
<rich:dataScroller ... scrollListener="#scrollListenerMethod" />
另见:
Dynamic ui include and commandButton如何使该方法成为可选方法?
理论上,您可以使用 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>
s(或 <c:choose>
);一个有一个没有scrollListener
。这太笨拙了。您最好为此创建一个自定义的<my:richScrollListener>
taghandler,然后您可以将其放置在<c:if>
中。
【讨论】:
以上是关于将 EL 方法表达式作为自定义 Facelets 标记文件的属性传递的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Facelets 的 EL 布尔表达式中使用 &&?
Spring Boot 自定义注解支持EL表达式(基于 MethodBasedEvaluationContext 实现)