spring mvc 中使用spring的validator

来源:互联网 发布:ab plc编程软件中文版 编辑:程序博客网 时间:2024/05/21 07:49

前面完成了mvc基本框架,现在学习一下对表单输入的验证:
目前我所知道的带表单验证功能的是一个协议JSR303,包括EJP、hibernate、spring和apache都有类似库
1.使用spring自带的Validator:
<1>建立一个"Validator" (如果验证的类中的属性是一个需要验证的类,可以将它的validator嵌入到这里,详见reference)
<2>使用spring mvc3的validator需要在xxx-servlet.xml中做一行配置

<context:component-scan base-package="com.smvc"/>

@Valid需要validation-api-xxxx.jar这个包只是一个协议,还需要加一个实现包,hibernate可以作为实现包hibernate-validator-xxxx.jar否则报:org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.validation.beanvalidation.LocalValidatorFactoryBean#0': Invocation of init method failed; nested exception is javax.validation.ValidationException: Unable to find a default provider
可以实现验证了,但是报错No message found under code 'name.empty.student.name' for locale 'zh_CN'.
应该是跟错误消息提示的本地化有关系
<3>建立信息提示文档,本地环境是中文的需要在classpath下建立一个messages_zh_CN.properties,这个可以在配置文件中xml设置
<4>在xml做出如下配置
 <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
  <property name="basename" value="messages"/>
 </bean>
<5>ValidationUtils.rejectIfEmpty(e, "name", "name.empty");当name属性为空或者空格时候,name的错误提示为配置文件中name.empty.name,也就是在第三个参数后面加上.属性名
Errors的rejectValue(参数1,参数2).参数1是存储在errors中的名字的键值,参数2是messages_zh_CN.properties的键值,如
 e.reject("age", "young");则会到messages_zh_CN.properties中查找young.age作为提示语,如果没有,则会使用young作为关键字查找,如果还是没有,则会找到age.int作为键值
<6>messages_zh_CN.properties中的汉字需要使用unicode码,否则会显示乱码,转化的方法是:
运行native2ascii,然后输入需要转换的汉字,就会显示相应的unicode码,
对于类型不匹配的异常,会使用typeMismatch.student.age这样格式的信息键值
需要搞清的概念field,errorcode,defaultMessage
使用spring提供的验证处理比较简单,而且功能也比较强大

StudentValidator.java

[java] view plaincopy
  1. package com.smvc.annonation.validator;  
  2.   
  3. import org.springframework.validation.Errors;  
  4. import org.springframework.validation.ValidationUtils;  
  5. import org.springframework.validation.Validator;  
  6.   
  7. import com.smvc.annonation.bean.Student;  
  8. public class StudentValidator implements Validator{  
  9.   
  10.     public boolean supports(Class<?> clazz) {  
  11.         return Student.class.equals(clazz);  
  12.     }  
  13.   
  14.     public void validate(Object obj, Errors e) {  
  15.         ValidationUtils.rejectIfEmpty(e, "name""name.empty");  
  16.         ValidationUtils.rejectIfEmpty(e, "gender""null");  
  17.         ValidationUtils.rejectIfEmpty(e, "age""null");  
  18.         Student s = (Student)obj;  
  19.         if(s.getAge() < 18){  
  20.             e.rejectValue("age","young");  
  21.         }else if(s.getAge() > 50){  
  22.             //e.reject("age", "old");  
  23.         }  
  24.         /* 
  25.         if(s.getName().length() < 1){ 
  26.             e.reject("name", "short"); 
  27.         }else if(s.getName().length() > 10){ 
  28.             e.reject("name", "long"); 
  29.         } 
  30.         */  
  31.     }  
  32.       
  33. }  


StudentController.java

[java] view plaincopy
  1. package com.smvc.annonation.controller;  
  2.   
  3. import java.text.SimpleDateFormat;  
  4. import java.util.Date;  
  5.   
  6. import javax.servlet.http.HttpServletRequest;  
  7. import javax.validation.Valid;  
  8. import org.apache.commons.logging.Log;  
  9. import org.apache.commons.logging.LogFactory;  
  10. import org.springframework.beans.propertyeditors.CustomDateEditor;  
  11. import org.springframework.stereotype.Controller;  
  12. import org.springframework.validation.BindingResult;  
  13. import org.springframework.web.bind.WebDataBinder;  
  14. import org.springframework.web.bind.annotation.InitBinder;  
  15. import org.springframework.web.bind.annotation.ModelAttribute;  
  16. import org.springframework.web.bind.annotation.RequestMapping;  
  17. import org.springframework.web.bind.annotation.RequestMethod;  
  18. import org.springframework.web.servlet.ModelAndView;  
  19. import com.smvc.annonation.bean.Student;  
  20. import com.smvc.annonation.validator.StudentValidator;  
  21.   
  22. @Controller  
  23. public class StudentController {  
  24.     protected final Log logger = LogFactory.getLog(getClass());  
  25.       
  26.     @InitBinder  
  27.     public void initBinder(WebDataBinder binder) {  
  28.         //添加一个日期类型编辑器,也就是需要日期类型的时候,怎么把字符串转化为日期类型  
  29.         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");  
  30.         dateFormat.setLenient(false);  
  31.         binder.registerCustomEditor(Date.classnew CustomDateEditor(dateFormat, true));  
  32.         //添加一个spring自带的validator  
  33.         binder.setValidator(new StudentValidator());  
  34.     }  
  35.       
  36.     /* 
  37.      * 会将一个新的Student增加到modelattribute中,名字为st2,在视图中可以使用,也许可以用在编辑页面 
  38.     @ModelAttribute("st2") 
  39.     public Student getStudent(){ 
  40.         System.out.println("In modelAttribute"); 
  41.         Student re = new Student(); 
  42.         re.setName("Haha"); 
  43.         re.setAge(30); 
  44.         re.setGender("male"); 
  45.         return re; 
  46.     } 
  47.     */  
  48.       
  49.     @RequestMapping(value="/get",method=RequestMethod.GET)  
  50.     public ModelAndView get(Student t) {  
  51.         if(t.getId() > 0) {  
  52.             //t = studentService.get(t.getId());  
  53.         }  
  54.         t.setBirthday(new Date());  
  55.         return new ModelAndView("edit");  
  56.     }  
  57.       
  58.     @RequestMapping(value="/studentAdd")  
  59.     public ModelAndView studentAdd(@Valid @ModelAttribute Student student, BindingResult br, HttpServletRequest requset){  
  60.         System.out.println(student);      
  61.         if(br.hasErrors()) {  
  62.                 System.out.println(br);  
  63.                 return new ModelAndView("edit");  
  64.             }  
  65.         System.out.println(br);  
  66.             return new ModelAndView("aa");  
  67.     }  
  68. }  


study-servlet.xml

[html] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  4.     xmlns:p="http://www.springframework.org/schema/p"  
  5.     xmlns:context="http://www.springframework.org/schema/context"  
  6.     xmlns:task="http://www.springframework.org/schema/task"  
  7.     xmlns:mvc="http://www.springframework.org/schema/mvc"  
  8.     xsi:schemaLocation="  
  9.         http://www.springframework.org/schema/beans  
  10.         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
  11.         http://www.springframework.org/schema/context  
  12.         http://www.springframework.org/schema/context/spring-context-3.0.xsd  
  13.         http://www.springframework.org/schema/task  
  14.         http://www.springframework.org/schema/task/spring-task-3.0.xsd  
  15.         http://www.springframework.org/schema/mvc  
  16.         http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">  
  17.           
  18.     <mvc:annotation-driven />  
  19.       
  20.     <context:component-scan base-package="com.smvc"/>  
  21.       
  22.     <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">  
  23.         <property name="basename" value="messages"/>  
  24.     </bean>    
  25.       
  26.     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"   
  27.         p:prefix="/WEB-INF/jsp/" p:suffix=".jsp"/>  
  28.     <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>  
  29. </beans>  


messages_zh_CN.properties

[html] view plaincopy
  1. name.empty.name=\u540d\u79f0\u4e0d\u80fd\u4e3a\u7a7a  
  2. null.gender=gender not null  
  3. null.age=nian ling bu neng wei kong  
  4. student.age=not good value  
  5. typeMismatch.student.age=typeMismatch.student.age  
  6. young.int=iiiii  
  7. old.age=age too old  
  8. short.name=name too short  
  9. long.name=name too long  

2012-02-14编辑

使用spring提供的org.springframework.validation.Validator的时候,在注册的验证器的时候注意写明这个验证器是是为哪个对象提供验证的,否则默认为所有@ModelAttribute提供验证,如果不支持(supports方法)就会报错误(类似org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalStateException: Invalid target for Validator [com.smvc.annonation.validator.StudentValidator@2585e]: com.smvc.annonation.utils.ResultFilter@c378f6),但是并不会对没有标注为@Valid的@ModelAttribute进行真正的验证。

[java] view plaincopy
  1. @InitBinder("student")  
  2.     public void initBinder(WebDataBinder binder) {  
  3.         //添加一个日期类型编辑器,也就是需要日期类型的时候,怎么把字符串转化为日期类型  
  4.         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");  
  5.         dateFormat.setLenient(false);  
  6.         binder.registerCustomEditor(Date.classnew CustomDateEditor(dateFormat, true));  
  7.         //添加一个spring自带的validator  
  8.         binder.setValidator(new StudentValidator());  
  9.     }  

如果没有标注@Valid就不会进行任何验证

0 0
原创粉丝点击