2011-03-09 24 views
3

JSFツリーでコンポーネントを検索する際に問題があります。私は次のテンプレートがあるとします。JSFツリーのa4j:repeatタグにネストされたn番目のコンポーネントの検索

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レンダリング選択入力があることができます:

<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> 

名前空間は以下のように定義されています。サーバー側の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"); 

作業をしました。

+0

'a:'としてマップしたタグライブラリ(xml名前空間)はどれですか? – meriton

+0

投稿を更新しました。それはxmlns:a = "http://richfaces.org/a4j。 –

答えて

3

a4j:repeatは、繰り返しごとに専用のコンポーネントを作成するタグハンドラではありません。むしろ、JSFライフサイクルの各段階で子コンポーネントが繰り返し訪問されるようにします。つまり、各行に専用のコンポーネントはありません。

タグハンドラとコンポーネント間の違いの詳細については、以下を参照してください。 http://www.ilikespam.com/blog/c:foreach-vs-ui:repeat-in-facelets

通常のJava側の名前でコンポーネントを検索するために回避することができます。なぜあなたがこれをやろうとしているのかを教えてくれたら、代替案を提案するかもしれません。

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

+0

私は検証のためにサーバー側でこれらのコンポーネントを見つける必要があります。その理由を尋ねないでください。あなたは恋人を見ますか? –

関連する問題