標準の jsf/primefaces コンポーネントが標準のマークアップでラップされ、標準のファセット属性などを受け取ることができる、一連のネストされたコンポーネントを作成しようとしています。
f:validateLength が指定されたフィールドに適用される次のコードで問題が発生しています。
<util:reducedwrap id="baz" label="Baz">
<f:validateLength minimum="3" for="value" />
</util:reducedwrap>
reducewrap.xhtml
<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>
reducewrapper.xhtml
<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:reduced は明らかに、このパターンを使用するその他のコンポーネントでコードの複製を要求します。
util:reducedsplit は機能し、さらにコンポーネントに 2 つのコンポーネントを挿入しても問題ありませんが、妥当性を考慮して、ラッピング マークアップ (実際に持っているもの) をコンポーネントに移動することはできません。そのため、いずれにしても複製する必要があります。
util:reducedwrap を思い通りに動作させるにはどうすればよいかという疑問に戻ります
または、カスタム コンポーネント ルートに移動する必要がありますか?
削減されたコードは次のとおりです。
縮小されたcomposite.xhtml
<?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>
ユーティリティ コンポーネント (/resources/components/util)
縮小.xhtml
<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>
Reducedsplit.xhtml
<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>
縮小されたlabel.xhtml
<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>
縮小メッセージ.xhtml
<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>
reducewrap.xhtml
<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>
reducewrapper.xhtml
<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>