2009-06-11 11 views
0

동적으로 생성 된 데이터 테이블 (UIData)의 바닥 글 열 (UIColumn)에 (UIInput)을 추가했습니다. UIData는 jsp의 datatable 태그에 바인딩됩니다. 데이터 테이블에서 헤더 및 꼬리말에 편집 가능한 텍스트 상자에 해당 값이있는 머리글과 바닥 글이 있습니다. 값을 변경하고 commandButton을 사용하여 폼을 전송할 때 액션 메서드에서 .getValue()를 사용하여 UIInput 값에 액세스하려고하면 페이지에서 업데이트 된 값이 아니라 이전 값을 가져옵니다. 나는 그것을 backing 빈의 속성에 바인딩하고 setter에 설정된 값을 검사 해 보았습니다. 이전 값이 설정되고 페이지에서 업데이트 한 값이 작업 메서드 나 설정자에 반영되지 않습니다. .getValue, .getLocalValue, .getSubmittedValue를 사용해 보았습니다. 이들 중 어느 것도 새로운 가치를 부여하지 못합니다. 나는 worng을하고 있을지도 모른다라고하는 어떤 제안?DataTable 바닥 글의 JSF UIInput


requestParameterMap에서 값을 가져 와서 해결할 수있었습니다. 문제의 수정 사항이있는 경우 알려주십시오. 맥도웰 - 입력 해 주셔서 감사합니다.

+0

문제를 재현하는 매우 간단한 페이지와 빈을 제공 할 수 있습니까? 문제를 좁히는 데 도움이 될 것입니다. – McDowell

답변

0

실제 코드는 몇 가지 다른 처리를 수행하지만 아래 코드는 문제를 복제하는 데 도움이됩니다. 아래 코드에서 TestString이 페이지에서 수정 된 값을 출력 할 것으로 기대합니다. 그러나 단지 오래된 값을 반환합니다.

package test.jsf; 

import java.io.IOException; 

import javax.faces.component.UIColumn; 
import javax.faces.component.UIData; 
import javax.faces.component.UIInput; 
import javax.faces.component.UIOutput; 
import javax.faces.context.FacesContext; 

public class TestPageBackingBean { 

    private UIData headerDataTable = new UIData(); 

    public TestPageBackingBean() { 

    } 

    public UIData getHeaderDataTable() 
    {  
      return getHeaderTable(headerDataTable); 
    }  

    public UIData getHeaderTable(UIData dataTable) 
    {  
     for (int i=0;i<10;++i) 
     { 
      dataTable.getChildren().add(getColumn(i)); 
     } 
     return dataTable; 
    } 

    private UIColumn getColumn(int i) 
    { 
    UIOutput outputLabelText = new UIOutput(); 
     UIInput inputFieldText = new UIInput(); 
     UIColumn column = new UIColumn(); 

     outputLabelText.setValue("Label" + i); 
     inputFieldText.setValue("test input" + i); 

     column.setHeader(outputLabelText); 
     column.setFooter(inputFieldText); 
     return column; 
    } 

    public String save() throws IOException { 
      String TestString = ""; 
      FacesContext ctx = FacesContext.getCurrentInstance(); 
      if (!ctx.getResponseComplete()) { 
       for (int i=0; i<headerDataTable.getChildren().size();++i) 
       { 
        TestString = TestString + (String)((UIInput)((UIColumn) headerDataTable.getChildren().get(i)).getFooter()).getValue(); 
       } 
      System.out.println(TestString); 
      } 
      return "save"; 
     } 

    public void setHeaderDataTable(UIData headerDataTable) { 
     this.headerDataTable = headerDataTable; 
    } 
} 
1

내가에서 MyFaces 1.2.3에서 your demo code 코드를 실행하는 시도 : 아래

<managed-bean> 
    <managed-bean-name>TestPageBackingBean</managed-bean-name> 
    <managed-bean-class>test.jsf.TestPageBackingBean</managed-bean-class> 
    <managed-bean-scope>session</managed-bean-scope> 
</managed-bean> 

등판 빈 코드 :

다음
<%@taglib uri="http://java.sun.com/jsf/core" prefix="f"%> 
<%@taglib uri="http://java.sun.com/jsf/html" prefix="h"%> 
<html> 
<head> 
</head> 
<f:view> 
    <body> 
     <h:form styleClass="form" id="form1"> 
      <h:commandButton value="Save" action="#{TestPageBackingBean.save}" styleClass="commandExButton"/> 
      <h:outputText styleClass="label" value="Header Table"/> 
      <h:dataTable binding="#{TestPageBackingBean.headerDataTable}"></h:dataTable> 
     </h:form> 
    </body> 
</f:view> 
</html> 

는 얼굴의 설정입니다 : 아래 은 JSP입니다 Glassfish에서 Mojarra 2.0.0 Beta를 사용했지만 문제를 재현하지 못했습니다. save() 메소드는 필드에 입력 한 값을 인쇄했습니다.

는 (에서 MyFaces를 사용하려면, 나는 아마도 그들이 테이블 렌더러를 구현하는 방법에) 새로운 HtmlDataTable()새 인 UIData을 (변경했다,하지만 작은 변화이다.)

나는 콩에 대해 몇 가지를주의 할 것이다

:

  • 테이블 게터는 열을가 호출 될 때마다 계속 추가됩니다 -
  • 유지를 저장하는 서버 측 상태 페이지 새로 고침에 같은를 세션빈의 UIComponent에 대한 참조는 일반적으로 좋은 생각이 아닙니다. (나는 모두가이 작업을 수행 실현하지만) 당신은 직렬화를 구현 해야하는 구성 요소 바인딩
    • 세션 Bean의 요청 범위를 사용하여 더 나을 것이고, UIComponents의는
    • 이 구성 요소가있는 경우 여러 뷰에 끝낼 수 있습니다 직렬화 할 수 없습니다 사용자가 두 번 페이지를 엽니 다 - 동시 처리 문제 spec에 따라
    • : JSF가 뷰를 만들 때 getter를 통해 바인딩 된 구성 요소를 사용합니다. 이 (제출에) 뷰를 복원 할 때하지만, 그렇게 참조를 유지 세터를 통해 구성 요소를 설정합니다입니다 (고작) 중복
당신은 같은에 게터를 변경할 수 있습니다

이 :

private UIData headerDataTable; 

public UIData getHeaderDataTable() { 
    if (headerDataTable == null) { 
     headerDataTable = new UIData(); 
     getHeaderTable(headerDataTable); 
    } 
    return headerDataTable; 
} 

나는 이러한 변화하지만, 문제가 해결 것이라고 확신하지 않다 - 당신이 계속 문제가 발생하는 경우, 자세한 내용은 다시 시도 - 당신의 JSF 구현, 버전 및 javax.faces.STATE_SAVING_METHOD의 값을 매개 변수는 입니다. web.xml (있는 경우).

0

문제가 아직 완전히 해결되지 않았습니다.

WAS 6.0에서 IBM JSF - Base Faces Support 7.0 및 Enhanced Faces Components 7.0과 함께 RSA 7을 사용합니다. javax.faces.STATE_SAVING_METHOD는 기본적으로 '서버'였습니다.

STATE_SAVING_METHOD을 '클라이언트'로 변경해 보았습니다. 변경된 값을 출력에 인쇄했지만 label4 대신에 label4로 수정했습니다. 다음 제출시 label4에서 label8로 값이 이동했습니다. 일치하지 않는 것 같았습니다.