Java JSF selectOneMenu:两个下拉菜单的验证
在my.jsp中,我有两个SelectOne菜单项,它们为我提供了开始/结束年份。 现在,如果选择的开始年份大于结束年份,我想显示一条错误消息。 我怎样才能解决这个问题Java JSF selectOneMenu:两个下拉菜单的验证,java,jsf,selectonemenu,Java,Jsf,Selectonemenu,在my.jsp中,我有两个SelectOne菜单项,它们为我提供了开始/结束年份。 现在,如果选择的开始年份大于结束年份,我想显示一条错误消息。 我怎样才能解决这个问题 <h:selectOneMenu id="minYear" value="#{statistics.minYear}" style="width: 75px"> <f:selectItems value="#{statistics.yearValues}" /> </h:selectOneM
<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>
JSF中的普通验证只能验证单个元素,因此需要绕过此限制。使用JSF进行跨域验证至少有两种方法
PostValidateEvent
注册侦听器,如下所示:
。程序的其余部分与第1部分完全相同UIComponent source = event.getComponent();
UIInput minInput = (UIInput) source.findComponent("minYear");
UIInput maxInput = (UIInput) source.findComponent("maxYear");
访问元素的值:
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()代码>在发送错误消息后
EDIT3:虽然JSF2引入了系统事件,但第一种方法在JSF1.x中应该是可行的。当JSF将上下文和组件传递给验证方法时,在查找和消息分派时,细节略有不同
public void validateMulti(FacesContext context, UIComponent component, Object value){
...
UIInput minInput = (UIInput) component.findComponent("minYear");
...
context.addMessage("minYear", new FacesMessage(valMsg, valMsg));
...
JSF中的普通验证只能验证单个元素,因此需要绕过此限制。使用JSF进行跨域验证至少有两种方法
您可以将验证器应用到最后一个元素(或最后一个元素后面的隐藏元素)定义自定义验证器/方法,查找元素并进行验证
为PostValidateEvent
注册侦听器,如下所示:
。程序的其余部分与第1部分完全相同
验证方法中的元素查找:
UIComponent source = event.getComponent();
UIInput minInput = (UIInput) source.findComponent("minYear");
UIInput maxInput = (UIInput) source.findComponent("maxYear");
访问元素的值:
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()代码>在发送错误消息后
EDIT3:虽然JSF2引入了系统事件,但第一种方法在JSF1.x中应该是可行的。当JSF将上下文和组件传递给验证方法时,在查找和消息分派时,细节略有不同
public void validateMulti(FacesContext context, UIComponent component, Object value){
...
UIInput minInput = (UIInput) component.findComponent("minYear");
...
context.addMessage("minYear", new FacesMessage(valMsg, valMsg));
...
我认为这只适用于JSF2。不幸的是,我们使用的是JSF1。是的,JSF2引入了系统事件。我已经编辑了关于JSF1.XI的答案,只针对JSF2。不幸的是,我们使用的是JSF1。是的,JSF2引入了系统事件。我已经为JSF1.x编辑了答案,并提供了详细信息