我是JSF / Java的新手,但我想知道是否有人知道创建自定义验证控制器的好方法。我的Web应用程序中有很多表单,其中的字段重叠,如名字,SSN或电子邮件。我想创建一个能够处理所有这些验证和消息的Controller。
这是个好主意吗?我一直在网上查看文档,但看起来我发现他们将验证方法放在特定的bean而不是控制器中的每个例子。
任何关于实现类似内容的好方法的示例/建议的示例/链接都会很棒。
我正在使用JSF 2.0
答案 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);
}
}
}
感谢您的帮助=)