2012-06-04 2 views
2

in my .jsp 시작/종료 연도를 지정하는 두 개의 selectOneMenu 항목이 있습니다. 이제 선택한 시작 연도가 끝나는 연도보다 큰 경우 오류 메시지가 표시됩니다. 어떻게 해결할 수 있습니까?JSF selectOneMenu : 두 개의 드롭 다운 메뉴 확인

<h:selectOneMenu id="minYear" value="#{statistics.minYear}" style="width: 75px"> 
    <f:selectItems value="#{statistics.yearValues}" /> 
</h:selectOneMenu> 

<h:selectOneMenu id="maxYear" value="#{statistics.maxYear}" style="width: 75px"> 
    <f:selectItems value="#{statistics.yearValues}"/> 
</h:selectOneMenu> 

범위를 유효하거나 틀리면 내 backing bean에 true/false를 반환하는 메서드가 있습니다.

public boolean isYearValid() { 
    return (getMaxYear() >= getMinYear()); 
} 

답변

4

JSF의 일반 유효성 검사는 단일 요소의 유효성을 검사 할 수 있으므로이 제한 사항을 우회해야합니다. JSF로 교차 필드 검증을 수행하는 적어도 두 가지 방법이 있습니다.

  1. 당신은 마지막 요소 (또는 지난 뒤에 숨겨진 요소)에 대한 검증을 aply 사용자 정의 유효성 검사기/방법을 정의하는 요소를 조회하고 검증 할 수 있습니다.

  2. PostValidateEvent에 대한 청취자를 <f:event type="postValidate" listener="#{myValidationBean.validateDates}"/>으로 등록하십시오. 나머지 과정은 정확히 검증 방법

1. 요소 룩업 같다 : 원소

액세스 값 :

int minYear = ((Integer)minInput.getLocalValue()).intValue(); 
int maxYear = ((Integer)maxInput.getLocalValue()).intValue(); 

EDIT : 죄송 확인 메시지 부분을 잊어 버렸습니다.

String valMsg = "maxYear cannot be less than minYear"; 
FacesContext.getCurrentInstance().addMessage(source.getClientId(), new FacesMessage(valMsg, valMsg)); 

EDIT2 : 당신이 이벤트 리스너를 사용하여 검증하고 검증이 실패 할 경우, 즉시 응답 렌더링 단계로 진행 모델에 설정되는 유효하지 않은 데이터를 피하기 위해 좋은 생각입니다. 이렇게하려면 오류 메시지를 보내고 context.renderResponse();으로 전화하십시오.

EDIT3 : 시스템 이벤트가 JSF2에서 소개되었지만 첫 번째 방법은 JSF 1.x에서 가능해야합니다. 조회 및 JSF에 의해 유효성 검사 메소드에 전달 된 컴포넌트를 얻으면 메시지 디스패치에서 세부 사항이 약간 다릅니다.

public void validateMulti(FacesContext context, UIComponent component, Object value){ 
    ... 
    UIInput minInput = (UIInput) component.findComponent("minYear"); 
    ... 
    context.addMessage("minYear", new FacesMessage(valMsg, valMsg)); 
    ... 
+0

나는 이 JSF2에만 해당한다고 생각합니다. 불행히도 JSF1을 사용하고 있습니다. – Qowaz

+0

예, JSF 2에서 시스템 이벤트가 소개되었습니다. JSF 1.x에 대한 자세한 내용을 편집했습니다. – kostja