2

<fieldset>Java コードで、JSF フォームで使用できるタグをプログラムで作成したいと考えています。

私のフォームのセットアップは次のようになります。

Application app = FacesContext.getCurrentInstance().getApplication();

HtmlForm form = (HtmlForm) app.createComponent(HtmlForm.COMPONENT_TYPE);
form.setStyleClass("pure-form pure-form-stacked");

ご覧のとおりHtmlForm.COMPONENT_TYPE、JSF UI コンポーネントの識別子として使用していますが、フィールドセットの識別子が見つからないため、次のことを試しました。

UIComponent fieldset = app.createComponent("fieldset");
form.getChildren().add(fieldset);

残念ながら、これは機能していないため、別の解決策を考え出す必要があります。あなたはなにか考えはありますか?

HTML タグ (JSF コンテキストでは不明) を作成する一般的な方法はありますか?

4

2 に答える 2

4

私の問題に対する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");

誰かがそれを行う方法を知っている場合は、解決策を投稿してください。

于 2014-03-06T10:29:00.127 に答える
4

次のことを試すことができます。

次のように xhtml で使用するコンポーネントが呼び出さ<f:verbatim>れます。

<f:verbatim escape="false">
    <fieldset id="blah"></fieldset>
</f:verbatim>

プログラムでそれを実現するには、次のようにこのコンポーネントを追加できます。

String fieldsetHTMLText ="<fieldset id=\"blah\"></fieldset>";

UIOutput verbatim = new UIOutput();
verbatim.setRendererType("javax.faces.Text");
verbatim.getAttributes().put("escape", false);
verbatim.setValue(fieldsetHTMLText);
于 2014-03-05T14:50:52.350 に答える