Validation JSF验证在行动阶段

Validation JSF验证在行动阶段,validation,jsf,Validation,Jsf,我们有一个基于JSF的web应用程序,它将输入表单数据提交给web服务,然后显示web服务提供的响应 是web服务验证用户输入的输入数据。我不确定如何使用这里的JSF验证。据我所知,JSF验证视图中的各个组件。但是每次发出一个web服务请求将是非常昂贵的操作 相反,当用户提交表单时,我们跳过所有验证,在action方法中发出web服务请求。根据web服务的响应,我们是否可以通过编程判断特定的UI组件无效 你能就此提出你的建议吗 环境:- JSF 2.0 WebSphere Application

我们有一个基于JSF的web应用程序,它将输入表单数据提交给web服务,然后显示web服务提供的响应

是web服务验证用户输入的输入数据。我不确定如何使用这里的
JSF验证。据我所知,JSF验证视图中的各个组件。但是每次发出一个web服务请求将是非常昂贵的操作

相反,当用户提交表单时,我们跳过所有验证,在action方法中发出web服务请求。根据web服务的响应,我们是否可以通过编程判断特定的UI组件无效

你能就此提出你的建议吗

环境:-

JSF 2.0
WebSphere Application Server 8.5
请参阅“手动验证”部分

这可能就是你想要实现的目标

手动验证

  • 为bean使用字符串属性(使用try/catch块处理非法数据)
  • 在setter方法和/或动作控制器中进行验证
  • 返回null以重新显示表单
  • 创建自定义错误消息并存储在FacesMessage中
  • 使用h:messages显示错误消息列表(如果没有消息,则不会输出任何内容)
例如,在bean中:

public void setBidAmount(String bidAmount) {
    this.bidAmount = bidAmount;
    try {
        numericBidAmount = Double.parseDouble(bidAmount);
    } catch(NumberFormatException nfe) {}
}
行动方法:

public String doBid() {
    FacesContext context = FacesContext.getCurrentInstance();
    if (getNumericBidAmount() <= 0.10) {
        context.addMessage(null, 
        new FacesMessage("Bid amount must be at least $0.10."));
    }
    ...
    if (context.getMessageList().size() > 0) {
        return(null);
    } else {
        doBusinessLogicForValidData();
        return("show-bid1");
    }
}
公共字符串doBid(){
FacesContext context=FacesContext.getCurrentInstance();
如果(getNumericBidAmount()0){
返回(空);
}否则{
doBusinessLogicForValidData();
退货(“show-bid1”);
}
}
根据web服务的响应,我们是否可以通过编程判断特定的UI组件无效

是的,您可以通过调用并传递
false
来实现。以下是完整的部分:

FacesContext context = FacesContext.getCurrentInstance();
UIInput input = (UIInput) context.getViewRoot().findComponent("form:input");
input.setValid(false);
context.addMessage(input.getClientId(context), message);
context.validationFailed();

顺便说一句,
FacesContext#validationFailed()
不需要按每个输入调用。

这并不是OP具体要求的。只需一个快速评论。我找不到context.setValidationFailed(布尔值),而是context.setValidationFailed()。@BalusC为什么需要调用
context.validationFailed()
?@Geek:出于注意中提到的确切原因,当抛出带有消息的
Validator异常时,此操作已隐式完成,但当您手动设置消息时,此消息不会以任何方式通知JSF验证失败。@BalusC我们使用的是JSF 1.2。编译器找不到
FacesContext#validationFailed()
。JSF1.2实现这一点的方法是什么?@BalusC您在评论中说“……当您手动设置消息时,会抛出消息,但不会以任何方式通知JSF验证失败。”,我还看到了,但不是
input.setValid(false)足够吗?提前谢谢