2009-12-23 5 views
1

복합 키가있는 업데이트 양식이 있습니다. 각 복합 키에 숨겨진 필드가 있으므로 모든 복합 키가 outputbox에 표시됩니다. 이러한 출력 상자 값은 유효성 검사 오류 후 비어 있습니다. 이 문제를 어떻게 해결합니까? 나는 같은 페이지에 있으므로 가치가 없어야한다.JSF 유효성 검사 오류, 분실 값

답변

2

이것은 사실 h:inputHidden의 비 직관적 인 행동입니다. (저는 Mojarra 문제 목록에서 issue을 제출했습니다.하지만 아무 것도하지 않는 것 같습니다.) 전체 문제는 구성 요소의 값이 불필요하게 이고이 전체 유효성 검사주기를 거친 반면 사용자가 입력 할 수있는 방법이 없다는 것입니다. 유효성 검사가 실패하면 잃어 버리게됩니다. 이 직관적이지 않은 동작을 수정하는 데는 최소한 세 가지 방법이 있습니다.

첫 번째 방법은 대신 h:inputHiddenbinding을 사용하는 것입니다

<h:inputHidden binding="#{bean.hidden}" /> 

이런 식으로 값이 불필요한 검증주기를 받아야하지 않습니다. 그러나 이것은 백킹 빈 코드의 값을 얻거나 설정하는 방법을 변경해야합니다. 예를 들어 (그리고 IMHO 바람직한 방법)

private HtmlInputHidden hidden = new HtmlInputHidden(); // +getter +setter. 

public void setHiddenValue(Object hiddenValue) { 
    hidden.setValue(hiddenValue); 
} 

public Object getHiddenValue() { 
    return hidden.getValue(); 
} 

둘째 Tomahawkt:saveState 대신 사용한다.

<t:saveState value="#{bean.property}" /> 

가장 큰 이점은 백업 빈 코드에서 아무 것도 변경할 필요가 없다는 것입니다. 적용 요청 값 단계 이전에 값을 일찍 복원합니다. 아직 라이브러리를 추가하지 않으면 라이브러리를 추가해야하지만 Tomahawk는 기본 JSF 구현에 누락 된 구성 요소/기능 인 t:inputFileUpload, t:dataList, t:dataTable preserveDataModel="true", t:selectOneRadio layout="spread" 등의 것보다 t:saveState뿐 아니라 훨씬 더 많은 이점을 제공합니다. 노력.

세 번째 방법은 세션 범위가있는 bean에 저장하는 것이지만, 실제로 요청 범위 변수에 대해서는 원하지 않습니다. 그것은 단지 "wtf"를 줄 것입니다. 최종 사용자가 동일한 세션에서 여러 개의 탭/창을 열었을 때 경험합니다.