Validation 仅在提交时需要使用JSF2进行验证

Validation 仅在提交时需要使用JSF2进行验证,validation,jsf,primefaces,Validation,Jsf,Primefaces,我对验证有一个问题,因为我只希望在屏幕上单击submit按钮时进行验证,而不是在单击其他按钮时进行验证 在显示的页面option1.faces中是主文件option1.xhtml和几个包含的文件。以下是主页的代码片段和两个包含的文件: option1.xhtml中的代码: <h:inputText size="4" maxlen="5" id="teff1" value="#{option1.teff1}"> <f:validateDoubleRange minimum="#{

我对验证有一个问题,因为我只希望在屏幕上单击submit按钮时进行验证,而不是在单击其他按钮时进行验证

在显示的页面option1.faces中是主文件option1.xhtml和几个包含的文件。以下是主页的代码片段和两个包含的文件:

option1.xhtml中的代码:

<h:inputText size="4" maxlen="5" id="teff1" value="#{option1.teff1}">
<f:validateDoubleRange minimum="#{option1.teff1Min}" maximum="#{option1.teff1Max}"
    disabled="#{simulator.validate}"/>
</h:inputText>
<h:selectOneMenu id="abundanceSet0" value="#{abundance.abunSet0}" style="height:25px; width:180px;">
<f:selectItems value="#{abundance.abunSetMap}"/>
</h:selectOneMenu>
<p:spacer width="37" height="0"/>
<p:commandButton value="Select Set" actionListener="#{abundance.selectSet0}" update="abundances0"/>
<h:message for="teff1" style="color:red"/>

<h:commandButton value="Submit" disabled="#{!login.loggedIn}" action="#{simulator.submit}" onclick="resetForm()"
actionListener="#{simulator.validate}" class="button"/>
八角豆:

@ManagedBean(name="abundance")
@SessionScoped
public class MyAbundanceBean implements Serializable {

// Lots of other private variables and objects


public String getAbunSet0() {
    return abunSet[0];
}

public void setAbunSet0(String abunSet) {
    this.abunSet[0] = abunSet;
}


public Map<String,String> getAbunSetMap() {
    return abunSetMap;
}


public void selectSet0(ActionEvent e) {
    selectSet(0);
}

// Lots of getters, setters, methods, etc.

}
选项1(xhtml和bean文件)中,用户为
teff1
输入一个值,该值必须介于从属性文件获得的
teff1Min
teff1Max
之间。这可以正常工作,如果未给出
teff1
的值或该值超出范围,则单击“Submit”按钮(如
footerButtons.xhtml
中给出的),提交失败,并且
标记显示错误

但是,在单击“Submit”之前,如果
teff1
的输入字段为空或值错误, 包含的
丰度0.xhtml
中的
不起作用。它应该用选定的菜单更新显示,否则它就会更新。我设置了
立即
的属性设置为
true
,但它仍然不起作用。我只希望在单击“提交”按钮时进行验证,而不希望其他任何操作

我尝试了另一种方法:模拟器bean中的标志
validate
用于禁用验证,直到需要为止。也就是说,当访问
选项1
页面时,它是
,禁用是
,并且在单击提交按钮之前不会进行任何验证,此时它被设置为
,因此禁用是
。不幸的是,这不起作用,因为JSF认为页面是有效的,并在执行验证之前离开页面。尽管在模拟器bean中,
validate()
是在
submit()
之前执行的。这可以通过在每一条语句中插入打印语句来确认

有人知道发生了什么吗?有没有一种简单的方法可以确保验证只在单击提交按钮时进行?否则显示器会被锁定,我无法让其他按钮工作


非常感谢你的澄清,我完全按照你的建议做了。我做了以下工作:

首先,我在命令按钮中输入immediate=“true”,该按钮在我的Abundantances0.xhtml文件中选择一个菜单:

<p:commandButton value="Select Set" actionListener="#{abundance.selectSet0}" update="abundances0" immediate="true"/>
但它仍然不起作用。如果我单击该按钮,除非在option1.xhtml文件开头的teff1输入字段中已经存在有效值,否则不会发生任何事情。我需要这个按钮与其他类似的按钮一起工作,不管输入字段中有什么,直到单击submit按钮。就我所知,我做的每件事都是正确的


首先,我将JSF 2.0与PrimeFaces 3.4.2和Eclipse Indigo一起使用。

首先,JSF中的验证是在Faces生命周期中的一个阶段执行的,更具体地说,它是在
过程验证
阶段完成的。跳过验证的唯一方法是指示面生命周期跳过该阶段

在JSF中,输入和命令组件有一个
immediate
属性,这意味着那些具有
true
值的组件将在
APPLY\u REQUEST\u VALUES
阶段进行处理,而不是在整个脸的生命周期中进行处理

根据组件的类型,行为略有不同:

  • 带有
    immediate=“true”
    的输入组件将在
    APPLY\u REQUEST\u VALUES
    阶段进行验证,而不是在
    过程验证阶段进行验证
  • 带有
    immediate=“true”
    的命令组件将在
    APPLY\u REQUEST\u value
    阶段执行,而不是在
    INVOKE\u应用程序
    阶段执行
因此,要跳过验证,一种可能的方法是使用
immediate=“true”
调用
,然后在后台bean端调用
FacesContext.getCurrentInstance().renderResponse()
FacesContext.getCurrentInstance().requestComplete()
告诉Faces跳过剩余的生命周期阶段

因此,在
中选择0
方法应为:

public void selectSet0(ActionEvent e) {
    selectSet(0);
    FacesContext.getCurrentInstance().renderResponse(); // skip the remaining phases and go straight to RENDER_RESPONSE
}

注意:请记住,当使用immediate命令提交表单时,将触发该表单所有即时输入中的验证。

首先,JSF中的验证是在一个Faces生命周期中执行的,更具体地说,它是在
过程验证
阶段完成的。跳过验证的唯一方法是指示面生命周期跳过该阶段

在JSF中,输入和命令组件有一个
immediate
属性,这意味着那些具有
true
值的组件将在
APPLY\u REQUEST\u VALUES
阶段进行处理,而不是在整个脸的生命周期中进行处理

根据组件的类型,行为略有不同:

  • 带有
    immediate=“true”
    的输入组件将在
    APPLY\u REQUEST\u VALUES
    阶段进行验证,而不是在
    过程验证阶段进行验证
  • 带有
    immediate=“true”
    的命令组件将在
    APPLY\u REQUEST\u value
    阶段执行,而不是在
    INVOKE\u应用程序
    阶段执行
因此,要跳过验证,一种可能的方法是使用
immediate=“true”
调用
,然后在后台bean端调用
FacesContext.getCurrentInstance().renderResponse()
FacesContext.getCurrentInstance().requestComplete()
<p:commandButton value="Select Set" actionListener="#{abundance.selectSet0}" update="abundances0" immediate="true"/>
public void selectSet0(ActionEvent e) {
    selectSet(0);
    FacesContext.getCurrentInstance().renderResponse(); 
}
public void selectSet0(ActionEvent e) {
    selectSet(0);
    FacesContext.getCurrentInstance().renderResponse(); // skip the remaining phases and go straight to RENDER_RESPONSE
}
<p:commandButton ... process="@this" />