对于复杂的实际应用,系统自带的验证注解是不够的。系统自带验证注解在
Javax.validation.constraints包下。
只有最大值,最小值之类的验证。虽然说内建验证支持正则表达式,但是还是远远不够的。
J2EE的验证技术支持各种验证,有扩展内建验证注解,或者说是扩展已有验证注解(包括你自己定义的验证注解)。
核心知识点就在于这个注解@Constraint。
当然一个注解要成为验证注解,除了加上这个注解外,还需要遵守三大规范,其实就是要在注解里定义三大方法:
1 String message() default "";
2 Class<?>[] groups() default {};
3 Class<? extends Payload>[] payload() default {};
理论知识讲完了,就可以直接上代码了。
package cdivalidate;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
import javax.validation.constraints.Max;
@Max(100)
@Constraint(validatedBy = {})
@Documented
@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR,
ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
public @interface Age {
String message() default "";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
这个自定义的注解是利用了内建的@Max注解。
然后我们自定义的@Age注解就可以随便在CDI Bean里面用了。
package cdivalidate;
import javax.enterprise.context.RequestScoped;
@RequestScoped
public class AgeBean {
private int age;
public void setAge(@Age int age){
this.age = age;
}
public String greeting(){
return "Hello, you are "+ age +" years old.";
}
}
然后用servlet,进行测试:
package cdivalidate;
import java.io.IOException;
import javax.inject.Inject;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/age.html")
public class AgeServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Inject
private AgeBean bean;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
int num = Integer.parseInt(req.getParameter("age"));
bean.setAge(num);
resp.getWriter().append(bean.greeting());
}
}
运行结果: