Java JSF2.0验证控制器

Java JSF2.0验证控制器,java,jsf,jsf-2,Java,Jsf,Jsf 2,我对JSF/Java非常陌生,但我想知道是否有人知道创建自定义验证控制器的好方法。我的web应用程序中有很多表单,其中的字段重叠,例如名字、SSN或电子邮件。我想创建一个控制器来处理所有这些验证和消息 这是个好主意吗?我一直在网上查看文档,但我发现的每个示例似乎都将验证方法放在特定的bean中,而不是控制器中 任何示例/示例链接/关于实现类似内容的好方法的建议都非常好 我使用的是JSF2.0,我认为下面的例子对您来说很有用:。它甚至有一个电子邮件地址验证器作为例子 e、 g.从该页: 通过实现验

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

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

任何示例/示例链接/关于实现类似内容的好方法的建议都非常好


我使用的是JSF2.0,我认为下面的例子对您来说很有用:。它甚至有一个电子邮件地址验证器作为例子

e、 g.从该页:

通过实现
验证程序
接口编写验证程序:

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> 电子邮件验证程序 net.viralpatel.jsf.helloworld.EmailValidator 然后,使用它

<h:inputText id="Email" value="#{userBean.email}" required="true"> <f:validator validatorId="emailValidator" /> </h:inputText>
我认为下面的例子对您有用:。它甚至有一个电子邮件地址验证器作为例子

e、 g.从该页:

通过实现
验证程序
接口编写验证程序:

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> 电子邮件验证程序 net.viralpatel.jsf.helloworld.EmailValidator 然后,使用它

<h:inputText id="Email" value="#{userBean.email}" required="true"> <f:validator validatorId="emailValidator" /> </h:inputText>
这不是正常的做法。您应该将控制任务委托给
FacesServlet
。它的工作做得非常好。如果您想要的只是将验证与托管bean分离,那么只需创建一个独立类来实现。要使其自动加载,只需使用适当的注释对其进行标记

以下是一个启动示例:

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
组件中声明它,如下所示:

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

这不是正常的方法。您应该将控制任务委托给
FacesServlet
。它的工作做得非常好。如果您想要的只是将验证与托管bean分离,那么只需创建一个独立类来实现。要使其自动加载,只需使用适当的注释对其进行标记

以下是一个启动示例:

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
组件中声明它,如下所示:

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

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

如果您使用的是JEE6服务器,请查看

从:

规范的第2版引入了对JSR303bean验证的支持。JSF 如果包含JSF运行时的环境需要JSR303bean验证,那么实现必须支持JSR303bean验证。目前唯一这样的环境是当JSF包含在JavaEE6运行时中时


规范接着定义了JSF生命周期bean验证的执行方式和阶段。

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

如果您使用的是JEE6服务器,请查看

从:

规范的第2版引入了对JSR303bean验证的支持。JSF 如果包含JSF运行时的环境需要JSR303bean验证,那么实现必须支持JSR303bean验证。目前唯一这样的环境是当JSF包含在JavaEE6运行时中时


该规范接着定义了JSF生命周期bean验证的执行方式和阶段。

如果您希望有多个验证程序/类,该怎么办

例如:

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);
        }
    }
}

谢谢你的帮助=)

如果你想有多个验证器/类呢

例如:

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);
        }
    }
}

感谢您的帮助=)

如果您使用的是JSF>=2.0,我建议使用BalusC方法,因为您不必修改
faces config.xml
文件。然而,如果您在使用JSF>=2.0时仍然坚持使用JSF,我建议使用BalusC方法,因为您不必修改
faces config.xml
文件。然而,如果你被JSF困住了,欢迎来到Stackoverflow!这似乎是一个问题而不是答案。如果您确实有问题,请按右上方的
提问
按钮,而不是底部的
发布您的答案
按钮:)欢迎来到Stackoverflow!这似乎是一个问题而不是答案。如果您确实有问题,请按右上方的
提问
按钮,而不是底部的
发布您的答案
按钮:)