私の問題に対する3つの解決策を見つけました。1 つ目は を使用PrimeFacesし、2 つ目は を使用MyFaces Tomahawkし、3 つ目はJSF Verbatim UI component文字列入力で a を使用します。コード サンプルとソリューション間の相違点を簡単にリストアップします。
1 プライムフェイス
PrimeFaces コンポーネント スイート (および Apache Commons FileUpload 依存関係) を含めると、Fieldset クラスを使用して、プログラムでフィールドセットをオンザフライで作成できます。その悪い点は、PrimeFaces Fieldset コンポーネントが PrimeFaces JavaScript ファイルに依存しているため、単純なフィールドセットの代わりに、フィールドセットと JavaScript インクルードが多すぎることです。
import org.primefaces.component.fieldset.Fieldset;
...
form.getChildren().add(new Fieldset());
2 MyFaces トマホーク
UI コンポーネント セット Tomahawk には、HTML フィールドセットをプログラムで作成するために使用できる Fieldset コンポーネントも付属しています。Tomahawk の Fieldset が使用される場合、プレーンで見栄えの良い fieldset タグが取得されます。ここでの悪い点は、Tomahawk が MyFaces の拡張機能であり、MyFaces 自体が JavaServer Faces の完全な実装であるため、標準の JSF と一緒に使用してはならないことです。
import org.apache.myfaces.custom.fieldset.Fieldset
...
form.getChildren().add(new Fieldset());
3 JSF Verbatim UI コンポーネント
標準化されたハックな方法は、JSF Verbatim UI コンポーネントを使用することです。verbatim コンポーネント内には、必要な HTML を配置できます。この小さなトリックを使用して、そのままのタグを作成できます。
UIOutput fieldset = new UIOutput();
fieldset.setRendererType("javax.faces.Text");
fieldset.getAttributes().put("escape", false);
fieldset.setValue("<fieldset></fieldset>");
上記のコードは fieldset HTML 要素をレンダリングしますが、これは文字列であり、文字列内のタグが閉じられているため、プログラムでそのタグに何かを追加することはできず、これは機能しません:
form.getChildren().add(fieldset);
要素のネストに使用できる HTML タグを生成するには、各開始タグと終了タグを独自の Varbatim コンポーネントに配置する必要があるため、このソリューションは非常にテキストが重くなります。
UIOutput fieldsetStart = new UIOutput();
fieldsetStart.setRendererType("javax.faces.Text");
fieldsetStart.getAttributes().put("escape", false);
fieldsetStart.setValue("<fieldset>");
UIOutput fieldsetClose = new UIOutput();
fieldsetClose.setRendererType("javax.faces.Text");
fieldsetClose.getAttributes().put("escape", false);
fieldsetClose.setValue("</fieldset>");
HtmlInputText inputText = (HtmlInputText) app.createComponent(HtmlInputText.COMPONENT_TYPE);
form.getChildren().add(fieldsetStart);
form.getChildren().add(inputText);
form.getChildren().add(fieldsetClose);
結論:
示されているソリューションはどれも本当にエレガントではありません。PrimeFaces と MyFaces には大きな依存関係があり、標準的な JEE の方法では実質的に多くの作成作業が必要です。次のような不明な/カスタム HTML 要素を生成するための優れたソリューションを見つけたいと思っていましたdocument.createElement("fieldset");。
誰かがそれを行う方法を知っている場合は、解決策を投稿してください。