3

JSF ツリーでコンポーネントを見つけるのに問題があります。次のテンプレートがあるとします。

<a4j:form id="someForm">
<a4j:outputPanel id="somePanel">
    <a4j:repeat id="people" value="#{bean.people}" rowKeyVar="_row" var="_data" stateVar="_state">
        <s:decorate id="personPanel" template="edit.xhtml">

            <h:outputLabel for="personAge" value="Choose your age:" />

            <h:selectOneMenu id="personAge" value="#{_data.age}">
                <s:selectItems var="_item" value="#{ageValues}" label="#{_item.description}" />
            </h:selectOneMenu>

        </s:decorate>
    </a4j:repeat>
</a4j:outputPanel>
</a4j:form>

名前空間は次のように定義されます。

xmlns:a4j="http://richfaces.org/a4j"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:s="http://jboss.com/products/seam/taglib"

ご覧のとおり、a4j:repeatタグがあるため、ページ上にレンダリングされたn 個の選択入力が存在する可能性があります。サーバー側の JSF ツリーでn番目のコンポーネントを見つけるにはどうすればよいですか? クライアント側では、コンポーネントは次のようにレンダリングされますsomeForm:somePanel:0:personPanel:personAge。私はこの方法でコンポーネントを見つけようとしています:

UIViewRoot root = FacesContext.getCurrentInstance().getViewRoot();
UIInput ageInput = (UIInput) root.findComponent("someForm:somePanel:0:personPanel:personAge");

しかし、それは見つかりませんでした。ツリーを確認しましたが、その ID を持つコンポーネントが存在しないようです。

では、どうすればこのコンポーネントを入手できますか? それを達成する方法はありますか?


編集:

私はいくつかの回避策を見つけました。実際には、コンポーネントではなく、その値が必要でした。値は、その名前でリクエストから取得できます。次のコード:

FacesContext facesContext = FacesContext.getCurrentInstance();
String ageValue = facesContext.getExternalContext().getRequestParameterMap().get("someForm:somePanel:0:personPanel:personAge");

仕事をした。

4

1 に答える 1

3

a4j:repeatは、反復ごとに専用のコンポーネントを作成するタグハンドラーではありません。むしろ、JSFライフサイクルの各フェーズで子コンポーネントに繰り返しアクセスするようになります。つまり、各行に専用のコンポーネントはありません。

タグハンドラとコンポーネントの違いの詳細については、 https ://rogerkeays.com/jsf-c-foreach-vs-ui-repeatを参照してください。

通常、Java側でコンポーネントを名前で検索することは避けられます。なぜこれを行おうとしているのかを教えていただければ、別の方法を提案するかもしれません。

編集:JSFでの検証は通常、バリデーターによって、または(複雑な場合は)アクションメソッドで、バッキングBeanのデータを直接操作し、FacesMessageをFacesContextに手動で配置することによって行われます。検証にコンポーネントが必要な理由がわかりませんか?

于 2011-03-09T13:45:49.763 に答える