行动阶段的JSF验证

时间:2012-12-23 15:33:15

标签: validation jsf

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

Web服务验证用户输入的输入数据。我不确定我们如何在这里使用JSF validation。根据我的理解,JSF验证视图中的各个组件。但每次发出Web服务请求都会非常昂贵。

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

请您就此提出建议吗?

环境: -

JSF 2.0
WebSphere Application Server 8.5

2 个答案:

答案 0 :(得分:18)

  

根据来自Web服务的响应,我们能否以编程方式告知特定UI组件无效?

是的,你可以通过调用UIInput#setValid(),传递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()不需要按输入调用。

答案 1 :(得分:2)

查看this tutorial - “手动验证”部分。

这可能是你想要完成的事情。

手动验证

  • 使用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");
    }
}