既存のJSFコンポーネントを独自のカスタムコンポーネントに追加する方法

StackOverflow https://stackoverflow.com/questions/654284

  •  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が内部で行うことです。 )

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top