ui:param无法在复合组件内的actionListener中求值

时间:2019-01-15 12:49:44

标签: jsf

如果我将表达式传递给像这样的复合组件

<My:myButton action="#{bean.myaction()" value="#{bean.buttText()}"

并尝试在其中使用

<cc:implementation>
 <h:commandButton actionListener="#{cc.attrs.action} value="#{cc.attrs.value}...

我得到一个异常“ 无法到达目标,标识符'bean'解析为空”。

但仅,如果bean是模板中的<ui:param name="bean" value="#{myRealBean}"/>。该错误仅在actionListener中发生。将显示以相同方式从同一bean解析的按钮文本。

这个旧的question似乎有相同的问题,但没有答案。

如果我将参数拆分为

<My:myButton bean="#{bean}" method="myaction" value="#{bean.buttText()}"

并使用

<cc:implementation>
<h:commandButton actionListener="#{cc.attrs.bean[cc.attrs.method]()} ...

没有错误,一切正常。

如何在复合组件(其中bean是<ui:param)中的actionListener中使用函数表达式?

Glassfish 4.1.1, Mojarra 2.2.12

现在,MCVE

一个豆子:

package beans;

import java.io.Serializable;
import javax.faces.view.ViewScoped;
import javax.inject.Named;

@Named
@ViewScoped
public class Testbean implements Serializable {
    public String getButtText() { return "Submit"; }
    public void doAction() { System.out.println("Ajax was here."); }
}

一页

<!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:ui="http://xmlns.jcp.org/jsf/facelets" xmlns:h="http://xmlns.jcp.org/jsf/html"
         xmlns:ST="http://java.sun.com/jsf/composite/softeam" >
<h:head>
</h:head>
<h:body>
    <h:form id="testform">
        <h:panelGrid columns="1">
            <ui:include src="testtemplate.xhtml">
                <ui:param name="bean" value="#{testbean}"/>
            </ui:include>
            <ST:testButt text="#{testbean.buttText}" action="#{testbean.doAction()}"/>
            <h:commandButton value="#{testbean.buttText}" actionListener="#{testbean.doAction()}"/>
        </h:panelGrid>
    </h:form>
</h:body>
</html>

和模板

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:ST="http://java.sun.com/jsf/composite/softeam">

        <ST:testButt text="#{bean.buttText}" action="#{bean.doAction()}"/>
        <h:commandButton value="#{bean.buttText}" action="#{bean.doAction()}" />
</ui:composition>

和组件

<!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:S="http://xmlns.jcp.org/jsf/composite" >
    <S:interface>
        <S:attribute name="action" method-signature="void action()"/>
        <S:attribute name="text"   type="java.lang.String"/>
    </S:interface>

    <S:implementation>
        <h:commandButton style="display:inline-block"
                         value="#{cc.attrs.text}"
                         actionListener="#{cc.attrs.action}"
        />
    </S:implementation>
</html>

将显示所有按钮(带有bean.buttText()),但是只有第二,第三和第四个会调用该动作。单击第一个按钮会引发异常。

编辑:示例简化为JSF,没有PrimeFaces组件。

0 个答案:

没有答案