Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 将EL方法表达式作为自定义Facelets标记文件的属性传递_Jsf_Jsf 2_Facelets_Tagfile_Methodexpression - Fatal编程技术网

Jsf 将EL方法表达式作为自定义Facelets标记文件的属性传递

Jsf 将EL方法表达式作为自定义Facelets标记文件的属性传递,jsf,jsf-2,facelets,tagfile,methodexpression,Jsf,Jsf 2,Facelets,Tagfile,Methodexpression,我创建了一个自定义JSF标记: <ui:composition> <h:panelGroup> <rich:dataScroller id="#{id}" for="#{table}" execute="#{table}" page="#{scrollerPage}" render="#{table}-sc1" maxPages="5" fastControls="hide" oncomplet

我创建了一个自定义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方法,我使用了一个非常古老的解决方案:


我的问题是:这是最好的方法吗?如何使该方法成为可选的

非常感谢你的帮助!再见

我的问题是:这是最好的方法吗

无论如何,这是唯一的方法,前提是您只能使用标准JSF/EL工具,并且不能创建自定义标记处理程序

但是,您可以创建一个自定义标记处理程序,将值表达式转换为方法表达式。JSF实用程序库中有一个
,正好用于此目的。另见

你可能会这样结束:

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


另见:

如何使该方法成为可选的

理论上,可以使用JSTL标记有条件地构建视图。比如:

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

但这是在特殊方法表达式侦听器属性的特殊情况下,不幸的是,这是不可能的。没有像
这样的东西,也没有允许您将RichFaces特定的
滚动侦听器作为单独的标记绑定到
的东西。在不创建自定义标记处理程序的情况下,最好的方法是在两个
中复制整个
(或一个
);一个带滚动监听器,另一个不带滚动监听器。这太笨拙了。您最好为此创建一个自定义的
标记处理程序,然后将其放入

<o:methodParam name="scrollListenerMethod" value="#{scrollListener}" />
<rich:dataScroller ... scrollListener="#{scrollListenerMethod}" />
<h:someComponent>
    <c:if test="#{not empty fooAttribute}">
        <f:attribute name="foo" value="#{fooAttriubte}" />
    </c:if>
</h:someComponent>