【问题标题】:JSF lifecycle process validation phaseJSF 生命周期过程验证阶段
【发布时间】:2015-08-08 08:32:45
【问题描述】:

我编写了一个带有两个验证器的简单 JSF 应用程序来了解 JSF 流程验证阶段。以下是验证器:

@FacesValidator("second")
public class AnotherValidator implements Validator{
    public void validate(FacesContext arg0, UIComponent arg1, Object arg2)
            throws ValidatorException {
        System.out.println("Validation phase, the second");
        FacesContext.getCurrentInstance().renderResponse();
        throw new ValidatorException(new FacesMessage("The second"));
    }
}

@FacesValidator("first")
public class ProducerValidator implements Validator{
    public void validate(FacesContext arg0, UIComponent arg1, Object arg2)
            throws ValidatorException {
        System.out.println("Validation phase, the first");
        FacesContext.getCurrentInstance().renderResponse();
        throw new ValidatorException(new FacesMessage("The first"));
    }
}

我认为如果我们从validate 方法调用renderResponse 方法,JSF 实现应该跳到渲染响应阶段。但实际上我有以下控制台输出:

Validation phase, the first
Validation phase, the second

尽管从第一个验证器调用了renderResponse,第二个验证器还是被调用了……为什么? Facelets 标记:

<h:inputText value="#{helloBean.p}" converter="conv">
    <f:validator validatorId="first"/>
    <f:validator validatorId="second" />
</h:inputText> 

【问题讨论】:

  • @Tiny 对我来说,通过facesContext.addMessage(String, FacesMessage) 发布特定组件的验证消息并使用&lt;h:messages for="id" /&gt; 似乎更清楚...
  • @Tiny BTW,我试图避免在不指定组件 ID 或 globalOnly 的情况下使用 &lt;h:messages /&gt;,这是真的吗?

标签: validation jsf jsf-2 lifecycle


【解决方案1】:

这是指定的行为。来自FacesContext#renderResponse() javadoc

通知 JavaServer 面临的实现,一旦请求处理生命周期的当前阶段完成,控制权应该传递到呈现响应阶段,绕过任何尚未执行的阶段还没有。

因此,它不会像您预期的那样突然中止当前阶段。它将完成当前阶段,然后进入渲染响应阶段。

只有当你从验证器中抛出 ValidatorException 时,默认情况下它已经这样做了。所以,两者都做是没有必要的。

【讨论】:

  • 我只是想,如果我想为特定组件发布验证错误消息,是否可以在验证方法中执行以下操作:facesContext.addMessage(component.getId(), new FacesMessage("Validation error")); facesContext.renderResponse(); 所以,如果某些验证器失败,我们将执行验证的其余部分,然后跳到渲染响应阶段,而不更新调用应用程序和更新数据模型阶段。对我来说,它看起来非常好,但也许我失去了一些东西......?
  • Uhmmm 这不是 BalusC 所写的:您想要的行为就是您在示例中获得的行为,但无需调用 facesContext.renderResponse()... 或执行 I 错过了什么?
  • 不要在验证器中手动添加人脸消息,只需将其与验证器异常一起抛出即可。你不需要手动调用FacesContext#renderResponse(),当转换或验证失败时,JSF 已经隐式地这样做了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-18
  • 2014-03-21
  • 2012-06-13
  • 2013-04-22
相关资源
最近更新 更多