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");
仕事をした。