spring mvc 中使用spring的validator

 前面完成了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

package com.smvc.annonation.validator;

import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;

import com.smvc.annonation.bean.Student;
public class StudentValidator implements Validator{

	public boolean supports(Class<?> clazz) {
		return Student.class.equals(clazz);
	}

	public void validate(Object obj, Errors e) {
		ValidationUtils.rejectIfEmpty(e, "name", "name.empty");
		ValidationUtils.rejectIfEmpty(e, "gender", "null");
		ValidationUtils.rejectIfEmpty(e, "age", "null");
		Student s = (Student)obj;
		if(s.getAge() < 18){
			e.rejectValue("age","young");
		}else if(s.getAge() > 50){
			//e.reject("age", "old");
		}
		/*
		if(s.getName().length() < 1){
			e.reject("name", "short");
		}else if(s.getName().length() > 10){
			e.reject("name", "long");
		}
		*/
	}
	
}


StudentController.java

package com.smvc.annonation.controller;

import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import com.smvc.annonation.bean.Student;
import com.smvc.annonation.validator.StudentValidator;

@Controller
public class StudentController {
	protected final Log logger = LogFactory.getLog(getClass());
	
	@InitBinder
	public void initBinder(WebDataBinder binder) {
		//添加一个日期类型编辑器,也就是需要日期类型的时候,怎么把字符串转化为日期类型
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
		dateFormat.setLenient(false);
		binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
		//添加一个spring自带的validator
		binder.setValidator(new StudentValidator());
	}
	
	/*
	 * 会将一个新的Student增加到modelattribute中,名字为st2,在视图中可以使用,也许可以用在编辑页面
	@ModelAttribute("st2")
	public Student getStudent(){
		System.out.println("In modelAttribute");
		Student re = new Student();
		re.setName("Haha");
		re.setAge(30);
		re.setGender("male");
		return re;
	}
	*/
	
	@RequestMapping(value="/get",method=RequestMethod.GET)
	public ModelAndView get(Student t) {
		if(t.getId() > 0) {
			//t = studentService.get(t.getId());
		}
		t.setBirthday(new Date());
		return new ModelAndView("edit");
	}
	
	@RequestMapping(value="/studentAdd")
	public ModelAndView studentAdd(@Valid @ModelAttribute Student student, BindingResult br, HttpServletRequest requset){
		System.out.println(student);	
		if(br.hasErrors()) {
				System.out.println(br);
				return new ModelAndView("edit");
			}
		System.out.println(br);
			return new ModelAndView("aa");
	}
}


study-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:task="http://www.springframework.org/schema/task"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/task
        http://www.springframework.org/schema/task/spring-task-3.0.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
        
    <mvc:annotation-driven />
    
    <context:component-scan base-package="com.smvc"/>
    
	<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
		<property name="basename" value="messages"/>
	</bean>  
    
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" 
        p:prefix="/WEB-INF/jsp/" p:suffix=".jsp"/>
	<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>
</beans>


messages_zh_CN.properties

name.empty.name=\u540d\u79f0\u4e0d\u80fd\u4e3a\u7a7a
null.gender=gender not null
null.age=nian ling bu neng wei kong
student.age=not good value
typeMismatch.student.age=typeMismatch.student.age
young.int=iiiii
old.age=age too old
short.name=name too short
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进行真正的验证。

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

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

 

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
Spring MVCSpring框架的一个MVC(Model-View-Controller)架构的Web应用程序框架,它提供了一组组件和API,可以帮助开发者构建具有良好结构和可维护性的Web应用程序。 Spring MVC的实现主要涉及以下几个方面: 1. DispatcherServlet:DispatcherServlet是Spring MVC框架的核心组件,它是一个Servlet,负责处理所有的HTTP请求并将它们分发到相应的处理程序(Controller)。DispatcherServlet还提供了一些基础功能,如数据绑定、属性编辑器支持、参数验证、异常处理等。 2. HandlerMapping:HandlerMapping是Spring MVC框架的组件之一,它负责将请求映射到相应的处理程序(Controller)。HandlerMapping通过使用一组规则将请求映射到处理程序,这个规则可以是基于请求的URL、请求的方法、请求的参数等。 3. Controller:Controller是Spring MVC框架的另一个核心组件,它负责处理业务逻辑以及生成合适的ModelAndView对象。Controller通过在类定义具体的请求处理方法来实现业务逻辑处理,这些处理方法可以接受请求参数以及返回视图名称或者ModelAndView对象。 4. ViewResolver:ViewResolver是Spring MVC框架的组件之一,它负责将视图名称解析为具体的视图。ViewResolver通过使用一组规则将模型数据与视图模板结合在一起,最终生成HTML文本响应。 5. ModelAndView:ModelAndView是Spring MVC框架的一个类,它包含了处理结果的视图名称、模型数据以及其他的处理结果。Controller可以通过返回ModelAndView对象来将处理结果返回到客户端。 6. Interceptor:InterceptorSpring MVC框架的组件之一,它是用来在请求处理期间进行拦截和处理的。Interceptor可以在请求处理之前、之后以及处理过程进行处理,以实现一些通用的功能,例如日志记录、安全认证、缓存处理等。 7. ValidatorValidatorSpring MVC框架的一个类,它用来进行数据验证以及错误处理。Validator可以在请求处理前、处理过程以及请求处理后进行数据验证,以处理请求可能出现的数据错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值