2013-09-02 4 views
3

<h:dataTable> 내에 목록을 반복하여 체크 박스, 일부 텍스트 및 텍스트 상자가 포함 된 일부 행을 표시하는 JSF 페이지가 있습니다.JSF Managed Bean에서 동적 UIComponents에 액세스

<h:dataTable>의 유효성을 검사해야 사용자가 확인란을 선택하면 입력란에 텍스트를 입력해야합니다.

이것은 내 JSF 페이지입니다.

<h:form prependId="false" id="form"> 
    <h:dataTable id="rm" width="100%" cellspacing="4" 
    value="#{controller.alertTriggers}" var="alt" 
     columnClasses="c1,c2,c3,c4">      


      <h:column> 
       <h:selectBooleanCheckbox value="#{alt.checkValue}" id="checkbox"/> 
      </h:column> 
      <h:column> 
       <h:outputText value="#{alt.id}" />          
      </h:column> 
      <h:column> 
       <h:outputFormat value="#{alt.msg1}" />        
      </h:column> 
      <h:column>            
       <h:message for="emailID" id="email" styleClass="validation-error"/> 
       <h:inputText value="#{alt.mailId}" id="emailID" style="width: 87%;" /> 

      </h:column>           

    </h:dataTable>           
</h:form>          

나는 emailID 모든 텍스트 상자의 checkbox 및 ID를 모든 체크 박스의 ID를 부여했다. 페이지가 렌더링 될 때 페이지 소스를 확인할 때 'rm : 0 : checkbox', 'rm : 1 : checkbox'... 및 'text : rm : 0 : EMAILID ','RM : 1 : EMAILID '.. 컨트롤러에서

, 나는 이러한 동적 텍스트 상자를 액세스하고 난 다음 코드를 사용하는 상자를 확인하려면 :

FacesContext context = FacesContext. getCurrentInstance(); 


        for (int i=0;i<9;i++){ 
         UIInput u=(UIInput) FacesContext.getCurrentInstance().getViewRoot().findComponent("form:rm:" +i+":checkbox"); 
         if ((Boolean) u.getValue()){ 
           UIInput ui=(UIInput) FacesContext.getCurrentInstance().getViewRoot().findComponent("form:rm:" +i+":emailID"); 

           //code 

         } 
       } 

을하지만이주고있다 java.lang.NullPointerException이

심지어 코드를 사용하여 :

UIInput u=(UIInput) FacesContext.getCurrentInstance().getViewRoot(). 
    findComponent("form:rm:0:checkbox"); gives the same exception. 

그러나 나는 널 포인터 예외를 제공하지 않습니다하지만 난있는 체크 박스의 값이 제공 유무를 알 수없는

 UIInput u=(UIInput) FacesContext.getCurrentInstance().getViewRoot(). 
     findComponent("form:rm:checkbox"); 

를 사용하는 경우. 1 : 체크 박스, RM : 2 :

그래서, 요약,

JSF는 RM과 같은 식별자 생성 체크 박스 등,하지만 JSF 페이지에서이 UI 구성 요소에 액세스하려고 할 때, 나는 수 없습니다입니다 그것을하기 위해.

나는 뭔가를 놓친가요?

답변

3

FacesContext#getViewRoot()은 JSF 구성 요소 트리를 반환합니다. 이것은 모두 taghandlers (JSTL, <ui:include> 등)을 생각한 후에 XHTML 소스 코드로 표현 된 나무와 정확히 같습니다. 하나만<h:selectBooleanCheckbox id="checkbox">이라는 것을 알아야합니다. 정확하게 해당 ID "form:rm:checkbox"에 의해 UIViewRoot#findComponent()에 있습니다.

부모의 현재 반복 라운드에 따라 여러 번 재생성되는 HTML 표현입니다. <h:dataTable>. 이렇게 생성 된 HTML 표현에는 현재 행 인덱스가 인라인 된 클라이언트 ID가 차례로 있습니다. 이 HTML 표현은 분명히 구성 요소 트리에서 사용할 수 없습니다.

구성 요소의 상태 (제출 된 값 등)는 중에는 이며 <h:dataTable>을 반복하는 동안에는 사용할 수 없으며 이전 또는 이후에는 사용할 수 없습니다. 본질적으로, 콩의 액션 메소드에서 컴포넌트의 값에 액세스하려고 시도하는 동안 <h:dataTable> 컴포넌트가 반복하지 않으므로 값은 항상 null을 반환합니다.

당신이 원하는 값을 수집 할 수 있도록 프로그래밍 <h:dataTable> 반복을 시뮬레이션하기 위해, 당신은 UIComponent#visitTree()으로 <h:dataTable>를 방문하여 VisitCallback 구현에 대한 관심의 정보를 수집 할 필요가있다.


그러나

UIData table = (UIData) viewRoot.findComponent("form:rm"); 
table.visitTree(VisitContext.createVisitContext(FacesContext.getCurrentInstance()), new VisitCallback() { 
    @Override 
    public VisitResult visit(VisitContext context, UIComponent target) { 
     if (target instanceof HtmlSelectBooleanCheckbox) { 
      HtmlSelectBooleanCheckbox checkbox = (HtmlSelectBooleanCheckbox) target; 
      System.out.println("id: " + checkbox.getId()); 
      System.out.println("value: " + checkbox.getValue()); 
      // Collect them in an arraylist orso. 
     } 

     return VisitResult.ACCEPT; 
    } 
}); 

, 당신은 구체적인 문제를 해결하는 등 완전히 잘못된 방향으로 가고 있습니다. 작업 방법이 아닌 유효성을 검사 할 입력 구성 요소와 연결된 유효성 검사기에서 유효성 검사를 수행해야합니다. 여기에 같은 행의 체크 박스가 체크되어있는 경우에만이 required으로 입력 필드의 유효성을 검사하는 특정 구체적인 기능 요구 사항을 해결할 수있는 방법은 다음과 같습니다 전부

<h:column> 
    <h:selectBooleanCheckbox binding="#{checkbox}" ... /> 
</h:column> 
<h:column>            
    <h:inputText ... required="#{checkbox.value}" /> 
</h:column> 

합니다. 또 다른 장점은 유효성 검사기가 인 반면<h:dataTable>이 반복되므로 모두 visitTree() 코드가 필요하지 않습니다.

+0

도움 주셔서 감사합니다. 내 새로운 질문은 아래 링크에서 찾을 수 있습니다 : (http://stackoverflow.com/questions/18594896/switch-off-validations-during-ajax-call) –

관련 문제