JSF 2.0验证控制器

时间:2010-08-19 16:37:20

标签: java jsf jsf-2

我是JSF / Java的新手,但我想知道是否有人知道创建自定义验证控制器的好方法。我的Web应用程序中有很多表单,其中的字段重叠,如名字,SSN或电子邮件。我想创建一个能够处理所有这些验证和消息的Controller。

这是个好主意吗?我一直在网上查看文档,但看起来我发现他们将验证方法放在特定的bean而不是控制器中的每个例子。

任何关于实现类似内容的好方法的示例/建议的示例/链接都会很棒。

我正在使用JSF 2.0

4 个答案:

答案 0 :(得分:6)

这不是正常的做法。您应该将控制任务委派给FacesServlet。它完美地完成了它的工作。如果你想要的只是从托管bean中解耦验证,那么只需创建一个实现javax.faces.validator.Validator的独立类。要使其自动加载,只需使用相应的@FacesValidator注释进行标记。

这是一个启动示例:

package com.example;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.FacesValidator;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;

@FacesValidator(value="ssnValidator")
public class SSNValidator implements Validator {

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        // Implement as you did originally in the bean method.
    }

}

您可以在任何UIInput组件中将其声明为<f:validator>,如下所示:

<h:inputText value="#{bean.ssn}">
    <f:validator validatorId="ssnValidator" />
</h:inputText>

答案 1 :(得分:2)

JSF验证器是基于每个组件定义的,最好用于阻止垃圾进入您的模型。避免尝试使用它们来执行验证,其中一个组件的值会影响另一个组件的有效性。

如果您使用的是JEE6服务器,请查看JSR 303 Bean Validation

来自JSF 2.0 spec

  

规范的第2版引入了对JSR 303 Bean Validation的支持。一个JSF   如果包含JSF运行时的环境需要JSR 303 Bean Validation,则Implentation必须支持JSR 303 Bean Validation。目前唯一的此类环境是JSF包含在Java EE 6运行时中。

规范继续定义如何以及在哪些阶段执行JSF生命周期bean验证。

答案 2 :(得分:1)

我认为以下示例适用于您:http://viralpatel.net/blogs/2009/02/javaserver-faces-jsf-validation-tutorial-error-handling-jsf-validator.html。它甚至以电子邮件地址验证器为例。

例如,从该页面开始:

通过实现Validator接口编写验证器:

package net.viralpatel.jsf.helloworld;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;

public class EmailValidator implements Validator{
    public void validate(FacesContext context, UIComponent component, Object value)
            throws ValidatorException {

        String email = (String) value;

        if(!email.contains("@")) {
            FacesMessage message = new FacesMessage();
            message.setSeverity(FacesMessage.SEVERITY_ERROR);
            message.setSummary("Email is not valid.");
            message.setDetail("Email is not valid.");
            context.addMessage("userForm:Email", message);
            throw new ValidatorException(message);
        }
    }
}

然后,您需要在faces-config.xml

中引用此验证器
    <validator>
        <validator-id>emailValidator</validator-id>
        <validator-class>net.viralpatel.jsf.helloworld.EmailValidator</validator-class>
    </validator>

然后,使用它!

<h:inputText id="Email" value="#{userBean.email}" required="true">
    <f:validator validatorId="emailValidator" />
</h:inputText>

答案 3 :(得分:0)

如果您想拥有多个验证器/类怎么办?

例如:

public class UserValidator implements Validator {

    public void oneMoreValidator(FacesContext context, UIComponent component, Object value)
            throws ValidatorException {

        if(username.equals("erik") {
            // some code here...        
            throw new ValidatorException("No Eriks is allowed here..");
        }
    }

    public void validate(FacesContext context, UIComponent component, Object value)
            throws ValidatorException {

        String email = (String) value;

        if(!email.contains("@")) {
            FacesMessage message = new FacesMessage();
            message.setSeverity(FacesMessage.SEVERITY_ERROR);
            message.setSummary("Email is not valid.");
            message.setDetail("Email is not valid.");
            context.addMessage("userForm:Email", message);
            throw new ValidatorException(message);
        }
    }
}

感谢您的帮助=)

相关问题