`

SpringMVC使用@Valid注解进行数据验证

 
阅读更多

我们在做Form表单提交的时候,只在前端做数据校验是不够安全的,所以有时候我们需要在后端同样做数据的校验。好在SpringMVC在后台验证给我们提供了一个比较好的支持。那就是使用Valid接口的实现类做数据校验。在这之前我们先做一下准备的工作。

添加相关的Maven依赖

我们先把需要的jar包添加进来。
		<dependency>
			<groupId>javax.validation</groupId>
			<artifactId>validation-api</artifactId>
			<version>1.1.0.Final</version>
		</dependency>
		<dependency>
			<groupId>org.apache.bval</groupId>
			<artifactId>bval-jsr303</artifactId>
			<version>0.5</version>
		</dependency>

实现Validator接口

接下来的第一 步我们需要写一个类来实现Validator接口。在这个类里我们需要定义它支持校验的JavaBean,实现validate方法,用来进行相关的校验。具体的实现类如下:
package com.zkn.learnspringmvc.validtor;

import com.zkn.learnspringmvc.scope.PersonScope;
import org.springframework.util.StringUtils;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;

/**
 * Created by wb-zhangkenan on 2016/9/2.
 */
public class PersonalValidtor implements Validator{

    /**
     * 判断支持的JavaBean类型
     * @param aClass
     * @return
     */
    @Override
    public boolean supports(Class<?> aClass) {
        return PersonScope.class.equals(aClass);
    }

    /**
     * 实现Validator中的validate接口
     * @param obj
     * @param errors
     */
    @Override
    public void validate(Object obj, Errors errors) {
        //把校验信息注册到Error的实现类里
        ValidationUtils.rejectIfEmpty(errors,"name",null,"姓名不能为空!");
        PersonScope personScope = (PersonScope) obj;
        if(StringUtils.isEmpty(personScope.getAddress())){
            errors.rejectValue("address",null,"家庭地址不能为空!!!!");
        }
    }
}

使用Validtor的校验实现类

我们需要在Controller的类里使用刚才写的Validtor的校验实现类来进行表单数据的校验。我们需要在Controller里用@InitBinder注解把刚才的校验类绑定到WebDataBinder类里。写法如下:
    //绑定PersonalValidator
    @InitBinder
    public void initBinder(WebDataBinder webDataBinder){
        webDataBinder.addValidators(new PersonalValidtor());
    }
接下来我们需要在@RequestMapping这个注解所在的方法上使用@Valid注解进行数据的校验。
    @RequestMapping(value = "testPersonalValidtor.do")
    @ResponseBody
    //直接返回对象
    public Object testPersonalValidtor(@Valid PersonScope personScope, BindingResult bindingResult){
        if(bindingResult.hasErrors()){
            StringBuffer sb = new StringBuffer();
            for(ObjectError objectError : bindingResult.getAllErrors()){
                sb.append(((FieldError)objectError).getField() +" : ").append(objectError.getDefaultMessage());
            }
            return sb.toString();
        }else{
            return personScope;
        }
    }
接下来我们来看一下效果:
请求:http://localhost:8081/testPersonalValidtor.do
结果:
请求:http://localhost:8081/testPersonalValidtor.do?name=张三&address=三元桥
结果:
具体Controller类代码如下:

package com.zkn.learnspringmvc.news.controller;

import com.alibaba.fastjson.JSON;
import com.zkn.learnspringmvc.scope.PersonScope;
import com.zkn.learnspringmvc.validtor.PersonalValidtor;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;

/**
 * 用来测试PersonalValidator的控制器
 * Created by wb-zhangkenan on 2016/9/2.
 */
@Controller
public class TestPersonlalValidtorController {

    //绑定PersonalValidator
    @InitBinder
    public void initBinder(WebDataBinder webDataBinder){
        webDataBinder.addValidators(new PersonalValidtor());
    }

    @RequestMapping(value = "testPersonalValidtor.do")
    @ResponseBody
    //直接返回对象
    public Object testPersonalValidtor(@Valid PersonScope personScope, BindingResult bindingResult){
        if(bindingResult.hasErrors()){
            StringBuffer sb = new StringBuffer();
            for(ObjectError objectError : bindingResult.getAllErrors()){
                sb.append(((FieldError)objectError).getField() +" : ").append(objectError.getDefaultMessage());
            }
            return sb.toString();
        }else{
            return personScope;
        }
    }
}
PersonScope实体类:
package com.zkn.learnspringmvc.scope;

import java.io.Serializable;

/**
 * Person对象
 * @author zkn
 *
 */

public class PersonScope implements Serializable{

	/**
	 * 序列
	 */
	private static final long serialVersionUID = 1L;
	/**
	 * 姓名
	 */
	private String name;
	/**
	 * 年龄
	 */
	private Integer age;
	/**
	 * 家庭地址
	 */
	private String address;

	private StudentScope studentScope;

	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public Integer getAge() {
		return age;
	}
	
	public void setAge(Integer age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "PersonDomain [name=" + name + ", age=" + age + "]";
	}

	public StudentScope getStudentScope() {
		return studentScope;
	}

	public void setStudentScope(StudentScope studentScope) {
		this.studentScope = studentScope;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}
}
这里需要注意的是:@Valid要紧挨着JavaBean(即PersonScope),要不然不会生效的。
另外需要注意的是:这里的校验是哪个请求需要校验,就写在哪个请求上。如果需要配置全局的校验的话,可以在<mvc:annotation-driven/>中配置validator。写法如下:
 <mvc:annotation-driven validator="personalValidtor">
  <bean id="personalValidtor" class="com.zkn.learnspringmvc.validtor.PersonalValidtor"/>

使用<form:errors />标签

上面的错误信息的展示是我们自己来展示的错误信息,但是SpringMVC还给我们提供了一个<form:errors />标签来展示错误信息。例子如下:
    @RequestMapping(value = "testPersonalValidtor02.do")
    public Object testPersonalValidtor01(@Valid PersonScope personScope, BindingResult bindingResult){
        if(bindingResult.hasErrors()){
            return "error";
        }else{
            return "home";
        }
    }
jsp页面内容如下:
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@page pageEncoding="utf-8" contentType="text/html;utf-8"%>

<form:errors path="personScope.name"/>
注意:<form:errors />标签是SpringMVC提供的,所以我们得引入这个标签库。<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
效果如下:








分享到:
评论

相关推荐

    SpringMVC使用@Valid注解进行数据验证的方法

    @Valid注解是Spring MVC提供的一种便捷的数据校验方式,它结合了JSR-303(Java Bean Validation)规范,使得开发者能够方便地在后端进行表单数据验证。 首先,要使用@Valid注解,我们需要引入相应的依赖。在Maven...

    springmvc的@Validated注解使用

    使用@Validated注解验证Bean对象十分简单,我们只需要在Controller方法中使用@Validated注解标记需要验证的参数,并将BindingResult对象作为参数,用于接收验证错误信息。下面是一个基本的示例代码: ```java @...

    SpringMVC入门很简单之数据验证

    SpringMVC提供了多种方式进行数据验证,包括使用JSR-303/JSR-349(Bean Validation)标准以及自定义验证注解。 1. **使用JSR-303/JSR-349 (Bean Validation)** Bean Validation 提供了一种统一的验证API,允许在...

    SpringMVC使用JSR-303进行验证Bean.docx

    为了在SpringMVC中使用这些注解进行验证,我们需要在配置中开启`@Valid`支持。这可以通过在Spring的配置文件中添加`&lt;mvc:annotation-driven&gt;`标签实现,如下所示: ```xml ``` 然后,我们可以在Controller的方法...

    springmvc数据验证

    在Spring MVC中,只需在控制器方法的参数上添加`@Valid`注解,Spring就会自动调用对应的验证器进行验证。如果验证失败,Spring会将错误信息自动绑定到模型中,供视图层展示。 2. **自定义Validator**:对于更复杂...

    SpringMVC全注解配置

    7. **数据绑定和验证**:`@Valid`注解结合JSR 303/349提供的bean验证,可以在处理请求时自动进行数据验证。 8. **拦截器**:`@AspectJ`风格的切面注解,如`@Before`和`@After`,可以创建拦截器,实现请求前后的处理...

    跟开涛学SpringMVC(7.3)SpringMVC数据

    在SpringMVC中,数据验证通常通过使用JSR-303/JSR-349(Bean Validation)规范实现,该规范定义了一套标准的注解,如`@NotNull`、`@Size`、`@Pattern`等,用于验证对象属性。开发者可以在模型类的字段上添加这些注解...

    SpringMVC数据验证——注册用户格式的验证实例

    在`@PostMapping`的方法中,使用`@Valid`注解来触发验证,如果数据无效,Spring MVC会自动将错误消息存储在`BindingResult`对象中: ```java @PostMapping("/register") public String register(@Valid User user, ...

    springmvc 其他引用资源(reference)

    - 数据验证:使用 @Valid 和 Validation 对象进行客户端和服务器端的数据验证。 - 模型属性:@ModelAttribute 注解用于在请求之间共享数据,支持绑定请求参数到对象。 5. **视图解析**: - 视图解析器...

    springmvc注解实现用户注册验证

    Spring MVC提供了一种强大的基于注解的数据验证机制,通过`@Valid`和`@NotBlank`、`@Size`、`@Email`等验证注解。在`User`类中,你可以为用户名、密码、邮箱等字段添加这些验证规则,如: ```java public class ...

    SpringMVC杂记(五) JSR303数据验证

    在本篇《SpringMVC杂记(五) JSR303数据验证》中,我们将深入探讨SpringMVC框架如何集成并使用JSR303(JavaBeans Validation)来进行数据验证,这是一种强大的验证机制,可以确保应用程序接收到的数据是合法且符合...

    SpringMVC注解开发的详解.doc

    在数据校验方面,SpringMVC支持使用Hibernate Validator进行服务端验证。这通常在控制器的处理方法中进行,以确保传入的参数符合业务规则。例如,我们可以使用`@NotNull`、`@Size`等注解来约束参数: ```java @...

    SpringMVC 使用JSR-303进行校验 @Valid示例

    3. 校验方法:在控制器的处理器方法中,使用@Valid注解来触发校验过程,并紧随其后添加一个BindingResult参数以接收校验的结果。若校验未通过,BindingResult将包含相关的错误信息。 4. 使用Spring的标签库:在JSP...

    SpringMVC完整使用教程

    通过 `@Valid` 注解和自定义校验注解,可以在服务端进行表单验证。 ### 第 8 章 文件上传与下载 SpringMVC 支持文件上传和下载功能,通过 `MultipartFile` 类处理文件上传,而文件下载可以通过设置响应头和流操作来...

    springMVC Validator表单验证

    3. **自定义注解**:SpringMVC允许开发者创建自定义的数据验证注解,比如`@Validated`,它可以应用于控制器方法的参数上,指示Spring进行验证。这些注解可以与JSR-303/JSR-349标准的注解(如`@NotNull`, `@Size`, `@...

    PNC_Lab04:Ingreso产品@Valid @ModelAttribute和BindingResult。 SpringMVC

    `@Valid`是Java Bean Validation规范的一部分,它与Spring MVC结合使用,允许我们在控制器方法的参数上进行数据验证。当请求被处理时,Spring MVC会自动调用相应的验证规则,这些规则通常在实体类的属性上定义(如...

    看透springMvc源代码分析与实践.pdf

    8. **验证**:通过@Valid注解和Validator接口,SpringMVC提供了一种便捷的数据验证机制。 9. **拦截器**:允许自定义拦截逻辑,如日志记录、权限检查等,通过实现HandlerInterceptor接口或者使用@Interceptor注解。...

    springMVC注解开发代码

    8. **Validation 验证**:通过 `@Valid` 和 `javax.validation` 注解,可以在处理请求时对输入数据进行验证。 9. **配置类**:Spring 4.0 引入了 Java 配置,允许开发者用类代替 XML 配置。`@Configuration` 和 `@...

    SpringMVC框架实例

    可以使用@Valid和BindingResult注解来进行数据验证,Spring会自动调用JavaBeans的Validator接口来执行验证规则。若验证失败,BindingResult对象可以提供错误信息。 本地化和国际化支持允许开发者为不同地区的用户...

Global site tag (gtag.js) - Google Analytics