Jsf 如何在复合组件中使用f:attribute标记传递commandButton的操作字符串

Jsf 如何在复合组件中使用f:attribute标记传递commandButton的操作字符串,jsf,jsf-2,composite-component,Jsf,Jsf 2,Composite Component,我正在用JSF开发复合组件。这样,我就可以按以下方式将方法名作为参数传递 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/x

我正在用JSF开发复合组件。这样,我就可以按以下方式将方法名作为参数传递

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:c="http://java.sun.com/jsp/jstl/core"
    xmlns:fn="http://java.sun.com/jsp/jstl/functions"
    xmlns:p="http://primefaces.org/ui"
    xmlns:composite="http://java.sun.com/jsf/composite">

    <!-- INTERFACE -->
    <composite:interface>
        <composite:attribute name="noOfButtons"  type="java.lang.Integer" required="true"/>
        <composite:attribute name="actionOnly"  type="java.lang.Boolean" required="true"/>
        <composite:attribute name="myBean" required="true" type="com.jsf.CRUDBean"/>
        <composite:attribute name="myIcons"  type="java.lang.String" required="true"/>
        <composite:attribute name="myAction" type="java.lang.String" required="true"/>
        <composite:attribute name="myDesc" type="java.lang.String" required="true"/>

    </composite:interface>

    <!-- IMPLEMENTATION -->
<composite:implementation>

            <c:forEach begin="0" end="#{cc.attrs.noOfmys - 1}" var="counter"
                varStatus="status">

                <h:commandButton id="myButton_${counter}"
                    action="#{cc.attrs.myBean[fn:split(cc.attrs.myAction, ',')[status.index]]}"
                    image="#{request.contextPath}/resources/images/#{fn:split(cc.attrs.myIcons, ',')[status.index]}"
                    title="#{fn:split(cc.attrs.myDesc, ',')[status.index]}"
                    style="padding:2px">
                <p:spacer width="5px;" />
            </c:forEach>

</composite:implementation>
</html>
<c:forEach begin="0" end="#{cc.attrs.noOfmys - 1}" var="counter"
                varStatus="status">

                <h:commandButton id="myButton_${counter}"

                    image="#{request.contextPath}/resources/images/#{fn:split(cc.attrs.myIcons, ',')[status.index]}"
                    title="#{fn:split(cc.attrs.myDesc, ',')[status.index]}"
                    style="padding:2px">
                        <f:attribute name="action" value="#{cc.attrs.myBean[fn:split(cc.attrs.myAction, ',')[status.index]]}" />

            </h:commandButton>

                <p:spacer width="5px;" />
            </c:forEach>

这是完美的。但在我的情况下,我需要以以下方式通过操作

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:c="http://java.sun.com/jsp/jstl/core"
    xmlns:fn="http://java.sun.com/jsp/jstl/functions"
    xmlns:p="http://primefaces.org/ui"
    xmlns:composite="http://java.sun.com/jsf/composite">

    <!-- INTERFACE -->
    <composite:interface>
        <composite:attribute name="noOfButtons"  type="java.lang.Integer" required="true"/>
        <composite:attribute name="actionOnly"  type="java.lang.Boolean" required="true"/>
        <composite:attribute name="myBean" required="true" type="com.jsf.CRUDBean"/>
        <composite:attribute name="myIcons"  type="java.lang.String" required="true"/>
        <composite:attribute name="myAction" type="java.lang.String" required="true"/>
        <composite:attribute name="myDesc" type="java.lang.String" required="true"/>

    </composite:interface>

    <!-- IMPLEMENTATION -->
<composite:implementation>

            <c:forEach begin="0" end="#{cc.attrs.noOfmys - 1}" var="counter"
                varStatus="status">

                <h:commandButton id="myButton_${counter}"
                    action="#{cc.attrs.myBean[fn:split(cc.attrs.myAction, ',')[status.index]]}"
                    image="#{request.contextPath}/resources/images/#{fn:split(cc.attrs.myIcons, ',')[status.index]}"
                    title="#{fn:split(cc.attrs.myDesc, ',')[status.index]}"
                    style="padding:2px">
                <p:spacer width="5px;" />
            </c:forEach>

</composite:implementation>
</html>
<c:forEach begin="0" end="#{cc.attrs.noOfmys - 1}" var="counter"
                varStatus="status">

                <h:commandButton id="myButton_${counter}"

                    image="#{request.contextPath}/resources/images/#{fn:split(cc.attrs.myIcons, ',')[status.index]}"
                    title="#{fn:split(cc.attrs.myDesc, ',')[status.index]}"
                    style="padding:2px">
                        <f:attribute name="action" value="#{cc.attrs.myBean[fn:split(cc.attrs.myAction, ',')[status.index]]}" />

            </h:commandButton>

                <p:spacer width="5px;" />
            </c:forEach>


但这在我的应用程序中不起作用。每当我从页面中单击commandButton时,在用户级别不会发生任何事情。任何帮助都将不胜感激。

谢谢@BalusC。在JSF中有没有其他方法来实现这一点?很抱歉@BalusC。就连我也不明白商业逻辑。我刚收到关于我必须做什么的指示。谢谢@BalusC。在JSF中有没有其他方法来实现这一点?很抱歉@BalusC。就连我也不明白商业逻辑。我刚接到指示,要做什么。