JSF复合传递所有事件

JSF复合传递所有事件,jsf,events,inheritance,primefaces,composite-component,Jsf,Events,Inheritance,Primefaces,Composite Component,我想用JSF(带primefaces)创建我的定制复合组件,它在输入前显示一个标签,并在最后添加一条消息 为此,以下是我的源代码: 复合材料: <?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"&g

我想用JSF(带primefaces)创建我的定制复合组件,它在输入前显示一个标签,并在最后添加一条消息

为此,以下是我的源代码:

复合材料:

<?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:p="http://primefaces.org/ui"
      xmlns:composite="http://java.sun.com/jsf/composite">
    <composite:interface componentType="customInput">
        <composite:attribute name="label" />
        <composite:attribute name="value" />
    </composite:interface>

    <composite:implementation>
        <h:panelGrid columns="3">
            <h:outputText value="#{cc.attrs.label}:" />
            <p:inputText id="abcde" value="#{cc.attrs.value}" />
            <p:message for="abcde" />
        </h:panelGrid>
    </composite:implementation>
</html>
到目前为止,一切顺利。现在我想使用p:inputText组件继承的事件。例如:

<pch2:PchInputText2 label="Name" id="test2" value="#{testBean.test}">
    <p:ajax event="blur" listener="#{chantierFormBean.updateMap()}" />
    <p:ajax event="change" listener="#{chantierFormBean.updateMap()}" />
</pch2:PchInputText2>

我知道我可以通过添加

<composite:clientBehavior name="change" event="change" targets="abcde" />

对于composite:interface部分,但是我必须为每个事件(将来)添加一个客户端行为。是否有一种方法可以传递primefaces inputtext继承的所有事件

提前谢谢

这是不可能的

首先,组合不是此作业的正确工具。它的主要目的不是使重复的XHTML代码干涸和重构。它旨在创建一个与单个模型值关联的全新(输入)组件。例如,将
绑定到单个
com.example.Image
属性。或者将三个
绑定到一个
java.time.LocalDate
属性

改为使用标记文件

<ui:composition ...>
    <h:outputLabel for="#{id}" value="#{label}:" />
    <p:inputText id="#{id}" value="#{value}">
        <ui:insert />
    </p:inputText>
    <p:message for="#{id}" />
</ui:composition>

另见:

谢谢您的回答。我将尝试使用标记文件使其工作。有人知道用这种方法是否可以保持primefaces inputtext的功能吗?我将保留p:inputtext的属性,而不重新定义它们(如“rendered”、“disbled”、…)。您不需要在taglib.xml中显式定义属性。只有IDE自动完成会遇到这种情况。我的意思是,当我使用您的示例合成代码并希望像这样使用它时:如果不在合成中指定“rendered=false”,我就不能添加“rendered=false”属性。有没有一种方法可以“传递”所有已经指定的属性?没有,只需使用
rendered=“#{rendered ne false}”
。在复合中没有什么不同,只有tagfile不需要像样板一样的
。是的,但是我必须为我想要使用的每个属性都这样做。我希望有一种更简单的方法来继承所有属性。我想我必须重新定义所有属性。谢谢你的帮助
<ui:composition ...>
    <h:outputLabel for="#{id}" value="#{label}:" />
    <p:inputText id="#{id}" value="#{value}">
        <ui:insert />
    </p:inputText>
    <p:message for="#{id}" />
</ui:composition>