2012-06-04 73 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