Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JSF selectOneMenu:两个下拉菜单的验证_Java_Jsf_Selectonemenu - Fatal编程技术网

Java JSF selectOneMenu:两个下拉菜单的验证

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

在my.jsp中,我有两个SelectOne菜单项,它们为我提供了开始/结束年份。 现在,如果选择的开始年份大于结束年份,我想显示一条错误消息。 我怎样才能解决这个问题

<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编辑了答案,并提供了详细信息