我正在尝试创建一系列嵌套组件,其中标准jsf / primefaces组件包装在标准标记中,并且仍然可以接收标准构面属性等
我在以下代码中遇到问题,f:validateLength应用于指定的字段。
<util:reducedwrap id="baz" label="Baz">
<f:validateLength minimum="3" for="value" />
</util:reducedwrap>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:cc="http://java.sun.com/jsf/composite"
xmlns:util="http://java.sun.com/jsf/composite/components/util">
<cc:interface>
<cc:attribute name="id"/>
<cc:attribute name="value"/>
<cc:editableValueHolder name="value" targets="fld" />
<cc:attribute name="label"/>
</cc:interface>
<cc:implementation>
<util:reducedwrapper label="#{cc.attrs.label}">
<h:inputText id="fld" value="#{cc.attrs.value}"/>
</util:reducedwrapper>
</cc:implementation>
</html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:cc="http://java.sun.com/jsf/composite">
<cc:interface>
<cc:attribute name="label"/>
</cc:interface>
<cc:implementation>
<h:outputLabel for="fld" value="#{cc.attrs.label}" />
<cc:insertChildren />
<h:message for="fld" />
</cc:implementation>
</html>
但是,虽然f:validateLength正在运行,因此h:message看不到“fld”,h:outputLabel会执行并最终使用正确生成的for属性输出。 (这让我感到困惑 - 这是对的?两者?)
我用于f:validateLength(或者确实是h:message)的“for”属性的值是错误的吗?如果是这样,应该是什么?
我进一步减少了代码,以便所有嵌套的东西都发生在被调用的组件中(util:reduced)或者直接从它调用(util:reducedsplit)。此代码(以及调用它们的示例页面)在此消息的末尾跟随。
两者都按照我的预期工作,但似乎都不是理想的解决方案。
util:reduce显然要求使用这种模式在任何其他组件中复制代码。
util:reducedsplit有效,虽然我可以在其他组件中插入2个组件,但由于有效性的考虑,我无法将任何包装标记(我确实具有这些标记)移动到组件上。所以在任何情况下都需要重复。
让我回过头来想知道如何制作util:reducewrap work as your want
或者我应该转到自定义组件路线?
缩减代码如下:
<?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:f="http://java.sun.com/jsf/core"
xmlns:util="http://java.sun.com/jsf/composite/components/util">
<h:body>
<h:form id="default">
util:reduced<br />
<util:reduced id="foo" label="Foo">
<f:validateLength minimum="5" for="value" />
</util:reduced>
<hr />
util:reducedsplit<br />
<util:reducedsplit id="bar" label="Bar">
<f:validateLength minimum="4" for="value" />
</util:reducedsplit>
<hr />
util:reducedwrap<br />
<util:reducedwrap id="baz" label="Baz">
<f:validateLength minimum="3" for="value" />
</util:reducedwrap>
<hr />
<h:commandButton value="Do it!" />
</h:form>
</h:body>
</html>
util组件(/ resources / components / util)
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:cc="http://java.sun.com/jsf/composite">
<cc:interface>
<cc:attribute name="id"/>
<cc:attribute name="value"/>
<cc:editableValueHolder name="value" targets="fld" />
<cc:attribute name="label"/>
</cc:interface>
<cc:implementation>
<h:outputLabel for="fld" value="#{cc.attrs.label}" />
<h:inputText id="fld" value="#{cc.attrs.value}"/>
<h:message for="fld" />
</cc:implementation>
</html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:cc="http://java.sun.com/jsf/composite"
xmlns:util="http://java.sun.com/jsf/composite/components/util">
<cc:interface>
<cc:attribute name="id"/>
<cc:attribute name="value"/>
<cc:editableValueHolder name="value" targets="fld" />
<cc:attribute name="label"/>
</cc:interface>
<cc:implementation>
<util:reducedlabel label="#{cc.attrs.label}" />
<h:inputText id="fld" value="#{cc.attrs.value}"/>
<util:reducedmessage />
</cc:implementation>
</html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:cc="http://java.sun.com/jsf/composite" >
<cc:interface>
<cc:attribute name="label"/>
</cc:interface>
<cc:implementation>
<h:outputLabel for="fld" value="#{cc.attrs.label}" />
</cc:implementation>
</html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:cc="http://java.sun.com/jsf/composite" >
<cc:interface>
</cc:interface>
<cc:implementation>
<h:message for="fld" />
</cc:implementation>
</html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:cc="http://java.sun.com/jsf/composite"
xmlns:util="http://java.sun.com/jsf/composite/components/util">
<cc:interface>
<cc:attribute name="id"/>
<cc:attribute name="value"/>
<cc:editableValueHolder name="value" targets="fld" />
<cc:attribute name="label"/>
</cc:interface>
<cc:implementation>
<util:reducedwrapper label="#{cc.attrs.label}">
<h:inputText id="fld" value="#{cc.attrs.value}"/>
</util:reducedwrapper>
</cc:implementation>
</html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:cc="http://java.sun.com/jsf/composite">
<cc:interface>
<cc:attribute name="label"/>
</cc:interface>
<cc:implementation>
<h:outputLabel for="fld" value="#{cc.attrs.label}" />
<cc:insertChildren />
<h:message for="fld" />
</cc:implementation>
</html>
答案 0 :(得分:0)
迟到总比没有好,你需要这个:
<composite:interface>
...
<composite:editableValueHolder name="value" targets="inputText" />
...
</composite:interface>
<composite:implementation>
...
<h:inputText id="inputText" value="#{cc.attrs.value}" />
...
</composite:implementation>
假设组件名为“inputText”,您将以传统方式使用它:
<util:inputText value="#{beanName.valueForInput}">
<f:validateLength minimum="10" />
</util:inputText>