2012-06-04 75 views
2

在我的.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> 

在我的支持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(); 

編輯:糟糕,忘了驗證消息部分。

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

EDIT2:如果您驗證使用事件偵聽器和驗證失敗,這是一個好主意,繼續響應呈現階段馬上要避免造成對模型設定無效數據。爲此,請在分發錯誤消息後致電context.renderResponse();。編輯3:儘管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