既存のJSFコンポーネントを独自のカスタムコンポーネントに追加する方法
-
19-08-2019 - |
質問
UIComponentとUIOutputを拡張するタグクラスがあります。このクラスには、encodeBeginとencodeEndがあります。これをcontextWriterを使用して、writer.startElement(<!> quot; div <!> quot ;, myComponent)などを使用して、必要なHTMLタグを出力することもできます。
今の問題は、writer.startElementを使用する代わりに、たとえばaを挿入する必要があることです。これを行うには、getChildren()。add(HtmlCommandButton button = new HtmlCommandButton());を実行します。しかし、そのようにすると、write.startElementでできるように、表示したいコンポーネントを出力できないようです。
richfacesタグ、JSFタグなどを自分のタグライブラリで活用する方法について、良い解決策はありますか?手短に言えば、私が本当にやりたいことは、encodeBegin内です:
writer.startElement("a4j:commandButton", myComponent);
writer.writeAttribite("action", "#{Handler.myAction}", null);
writer.endElement("a4j:commandButton");
事前に感謝します
解決
必要に応じて ResponseWriter を使用することはできません。プログラムで子コントロールを追加する方法について考えることができる2つの方法は、 binding 属性(この回答を参照)またはコントロールが通常作成される場所(JSPでは、タグクラス)。
JSFコンポーネントに他のコントロールを含めるには、子としてまたは名前付きファセットとして2つの方法があります。コンポーネントは、ファセットのレンダリング方法を常に制御します。子をレンダリングする場合、 getRendersChildren 。
これはテストされていないコードですが、シーケンスは次のようになります。
@Override
public boolean getRendersChildren() {
return true;
}
@Override
public void encodeBegin(FacesContext context)
throws IOException {
// should really delegate to a renderer, but this is only demo code
ResponseWriter writer = context.getResponseWriter();
writer.startElement("span", this);
String styleClass = getStyleClass();
writer
.writeAttribute("class", styleClass, "styleClass");
UIComponent headerComponent = getFacet("header");
if (headerComponent != null) {
headerComponent.encodeAll(context);
}
writer.startElement("hr", null);
}
@Override
public void encodeChildren(FacesContext context)
throws IOException {
ResponseWriter writer = context.getResponseWriter();
for (UIComponent kid : getChildren()) {
kid.encodeAll(context);
writer.startElement("br", null);
}
}
@Override
public void encodeEnd(FacesContext context)
throws IOException {
ResponseWriter writer = context.getResponseWriter();
writer.endElement("span");
}
他のヒント
実際には答えではなく、推測にすぎませんが、おそらくfaceletsコントロールの1つを拡張できますか?
別の方法として、faceletsを直接使用することもできます-私はそれを自分で使用したことはありませんが、まさにあなたが本当に欲しいもののようです。または、HTMLを表示したい場所にUIOutputコントロールを追加し、それぞれの値を表示したいHTMLに設定することができます-これは、f:verbatimが内部で行うことです。 )