Spring MVC Annotation验证的方法

简介说明

使用Spring MVC的Annotation验证可以直接对view model的简单数据验证,注意,这里是简单的,如果model的数据验证需要有一些比较复杂的业务逻辑性在里头,只是使用annotation做验证是比较难的。

以下是使用Spring MVC自带的annotation验证,加上自定义的一个@Tel的annotation验证例子,此例子具有:

1、支持多语言(国际化)

2、对默认数据先进行转化,比如int、date类型如果传入空值时,会抛异常,默认给定值

先看配置:

1、web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <display-name>Test Spring MVC - 1</display-name>

  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring.xml</param-value>
  </context-param>
  <servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value></param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>

</web-app>

这里没什么好说的,只是把spring.xml配置加入到contextConfigLocation中

2、spring.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:tx="http://www.springframework.org/schema/tx"
  xmlns:context="http://www.springframework.org/schema/context"
  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/tx
  http://www.springframework.org/schema/tx/spring-tx-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/mvc
  http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

  <!--注解说明 -->
  <context:annotation-config />

  <!-- 默认的注解映射的支持 -->
  <mvc:annotation-driven validator="validator" conversion-service="conversionService" />

  <!-- 把标记了@Controller注解的类转换为bean -->
  <context:component-scan base-package="com.my" />

  <!-- 视图解释类 -->
  <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/"/>
    <property name="suffix" value=".jsp"/><!--可为空,方便实现自已的依据扩展名来选择视图解释类的逻辑 -->
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
  </bean>

  <!-- 资源文件:messages.properties -->
  <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basenames">
      <list>
        <value>messages</value>
      </list>
    </property>
  </bean>
  <!-- 验证器 -->
  <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
    <property name="validationMessageSource" ref="messageSource"/>
  </bean>

  <!-- 自定义数据类型转换器 -->
  <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    <property name="converters">
      <list>
        <bean class="com.my.controller.converter.IntConverter" />
        <bean class="com.my.controller.converter.DateConverter" />
      </list>
    </property>
  </bean>
</beans>

在<mvc:annotation-driven/>中加入conversion-service,然后在conversion-service中加入系统默认的转换器,如上有IntConverter和DateConverter,当然,也可以是自定的别的类型,这是全局的。

在validator验证器中加入了支持多语言的properties,当然,spring的多语言是基于http header的accept-language。

3、Controller

package com.my.controller;
import java.util.List;
import javax.validation.Valid;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
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.my.controller.bean.User4;

@Controller
@RequestMapping(value="av")
public class TestAnnotationValidController {

  @RequestMapping
  public ModelAndView index() {
    ModelAndView view = new ModelAndView("/TestAnnotationValid/index", "user4", new User4());
    return view;
  }

  @RequestMapping(value="/add", method=RequestMethod.POST)
  public ModelAndView add(@ModelAttribute @Valid User4 user, BindingResult result) {
    ModelAndView view = new ModelAndView("/TestAnnotationValid/index");
    view.addObject("user4", user);

    if(result.hasErrors()) {
      List<FieldError> errors = result.getFieldErrors();
      for(FieldError err : errors) {
        System.out.println("ObjectName:" + err.getObjectName() + "\tFieldName:" + err.getField()
            + "\tFieldValue:" + err.getRejectedValue() + "\tMessage:" + err.getDefaultMessage() + "\tCode:");
      }
    }

    return view;
  }
}

这是一个简单的controller,在add中,有一个@Valid的annotation,这是必需的,不加这个,annotation验证将不起作用

4、User4.java model实体类

package com.my.controller.bean;
import java.util.Date;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Past;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotBlank;
public class User4 {

  private long id;

  @NotBlank(message="{valid.name}")
  private String name;

  @Length(min=4, max=20, message="{valid.password}")
  private String password;

  @NotBlank(message="{valid.required}")
  @Email(message="{valid.email}")
  private String email;

  @NotNull(message="{valid.required}")
  private boolean married;

  @Min(value=18, message="{valid.ageMin}")
  @Max(value=100, message="{valid.ageMax}")
  private int age;

  @NotNull(message="{valid.required}")
  @Past(message="{valid.birthday}")
  private Date birthday;

  @Pattern(regexp="^[a-zA-Z]{2,}$", message="{valid.address}")
  private String address;

  @Size(min=1, message="{valid.likesMin}")
  private String[] likes;

  @com.my.controller.validator.Tel(message="{valid.tel}", min=3)
  private String tel;

  public long getId() {
    return id;
  }
  public void setId(long id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public String getPassword() {
    return password;
  }
  public void setPassword(String password) {
    this.password = password;
  }
  public String getEmail() {
    return email;
  }
  public void setEmail(String email) {
    this.email = email;
  }
  public boolean isMarried() {
    return married;
  }
  public void setMarried(boolean married) {
    this.married = married;
  }
  public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age = age;
  }
  public Date getBirthday() {
    return birthday;
  }
  public void setBirthday(Date birthday) {
    this.birthday = birthday;
  }
  public String getAddress() {
    return address;
  }
  public void setAddress(String address) {
    this.address = address;
  }
  public String[] getLikes() {
    return likes;
  }
  public void setLikes(String[] likes) {
    this.likes = likes;
  }
  public String getTel() {
    return tel;
  }
  public void setTel(String tel) {
    this.tel = tel;
  }
}

除了@Tel之外,其它都是spring自带的annotation,当然还有别的,自行搜索下

5、message.properties

valid.required=字段值不能为空
valid.name=用户名不能为空
valid.password=密码最小4位
valid.ageMin=年龄不能小于{1}岁
valid.ageMax=年龄不能大于{1}岁
valid.email=邮箱格式不正确
valid.address=联系地址不正确
valid.birthday=生日不能大于今天
valid.likesMin=喜好最小不能小于1个
valid.tel=手机号码不能小于{min}位

对应的是User4 model的annotation的message值。如果需要国际化的多语言,只需要加入多一个messages_en_US.properties这样名字的文件即可。

6、@Tel

package com.my.controller.validator;
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;
@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy=TelValidator.class)
public @interface Tel {
  int min() default 0;
  String message();
  Class<?>[] groups() default {};
  Class<? extends Payload>[] payload() default {};
}

新建一个interface,注意,annotation的interface java是这样写的:@interface

TelValidator:

package com.my.controller.validator;
import javax.annotation.Resource;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import org.springframework.context.support.ResourceBundleMessageSource;
public class TelValidator implements ConstraintValidator<Tel, String> {
  @Resource
  private ResourceBundleMessageSource messageSource;
  private Tel tel;
  @Override
  public void initialize(Tel tel) {
    this.tel = tel;
  }

  @Override
  public boolean isValid(String value, ConstraintValidatorContext constraintContext) {
    boolean isValid;

    if(value != null && value.length() >= tel.min()) {
      isValid = true;
    }
    else {
      isValid = false;
    }

    if(!isValid) {
      constraintContext.disableDefaultConstraintViolation();
      constraintContext.buildConstraintViolationWithTemplate(tel.message()).addConstraintViolation();
    }
    return isValid;
  }
}

这是@Tel的验证实现方法。

7、Converter

package com.my.controller.converter;
import org.springframework.core.convert.converter.Converter;
public class IntConverter implements Converter<String, Integer> {
  @Override
  public Integer convert(String text) {
    if (text == null || "".equals(text)) {
      return 0;
    } else {
      try {
        Integer value = Integer.parseInt(text);
        return value;
      } catch (Exception e) {
        return 0;
      }
    }
  }
}
package com.my.controller.converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.core.convert.converter.Converter;

public class DateConverter implements Converter<String, Date> {

  @Override
  public Date convert(String text) {
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    dateFormat.setLenient(false);
    try {
      return dateFormat.parse(text);
    } catch (ParseException e) {
      e.printStackTrace();
    }
    return null;
  }
}

这两个是全局的类型默认转换器。

8、测试JSP

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ taglib prefix="st" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Index</title>
</head>
<body>
  <sf:form action="${pageContext.request.contextPath}/av/add" method="post" modelAttribute="user4">
    User name:<sf:input path="name"/><sf:errors path="name" /><br/>
    Password:<sf:input path="password"/><sf:errors path="password" /><br/>
    E-mail:<sf:input path="email"/><sf:errors path="email" /><br/>
    Age:<sf:input path="age"/><sf:errors path="age" /><br/>
    Birthday:<sf:input path="birthday"/><sf:errors path="birthday" /><br/>
    Address:<sf:input path="address"/><sf:errors path="address" /><br/>
    Married:
      <sf:radiobutton path="married" label="Yes" value="true"/>
      <sf:radiobutton path="married" label="No" value="false"/>
      <sf:errors path="married" /><br/>
    Likes:
      <sf:checkbox path="likes" label="Football" value="Football"/>
      <sf:checkbox path="likes" label="Badminton" value="Badminton"/>
      <sf:checkbox path="likes" label="Pingpong" value="Pingpong"/>
      <sf:errors path="likes" /><br/>
    Tel:<sf:input path="tel"/><sf:errors path="tel" /><br/>
    <input type="submit" value="Add" />
    <hr/>
    Errors:<br/><sf:errors path="*"></sf:errors>
    <hr/>
    Likes:<c:forEach items="${user4.likes}" var="item">${item},</c:forEach>
  </sf:form>
</body>
</html>

注意,在form中的modelAttribute属性值,它对应的是User4类名,小写开头,否则会出错

9、页面UI结果:

点击Add button后:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • SpringMVC实现表单验证功能详解
  • SpringMVC下获取验证码实例详解
  • springmvc拦截器登录验证示例
  • 详解SpringMVC验证框架Validation特殊用法
  • springmvc下实现登录验证码功能示例
  • SpringMVC拦截器——实现登录验证拦截器的示例代码
  • SpringMVC使用@Valid注解进行数据验证的方法
  • SpringMVC实现注解式权限验证的实例
  • SpringMVC Validator验证示例
(0)

相关推荐

  • springmvc拦截器登录验证示例

    一开始,学了拦截器与过滤器,咋一看两者有点像,实际上两者有很大的不同.就用拦截器和过滤器分别做了登录验证试验,这次先说拦截器.下面是自己实践的一个实例: 在spring-mvc.xml中配置拦截器: <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/user/*"/> <!-- 定义在mvc:interceptor下面的表示是对特定的请求才进行拦截的 --> <bean

  • SpringMVC实现表单验证功能详解

    本章节内容很丰富,主要有基本的表单操作,数据的格式化,数据的校验,以及提示信息的国际化等实用技能. 首先看效果图 项目结构图 接下来用代码重点学习SpringMVC的表单操作,数据格式化,数据校验以及错误提示信息国际化.请读者将重点放在UserController.java,User.java,input.jsp三个文件中. maven 项目必不可少的pom.xml文件.里面有该功能需要的所有jar包. <?xml version="1.0" encoding="UTF

  • 详解SpringMVC验证框架Validation特殊用法

    基本用法不说了,网上例子很多,这里主要介绍下比较特殊情况下使用的方法. 1. 分组 有的时候,我们对一个实体类需要有多中验证方式,在不同的情况下使用不同验证方式,比如说对于一个实体类来的id来说,保存的时候是不需要的,对于更新时是必须的,可以如下配置: public class UserModel { @NotNull(message = "{id.empty}", groups = { First.class }) private int id; @NotNull(message =

  • SpringMVC Validator验证示例

    SpringMVC服务器验证一种是有两种方式,一种是基于Validator接口,一种是使用Annotaion JSR-303标准的验证,下面主要是学习这两种,工作中推荐后者,方便很多 一.基于Validator接口的验证. 首先创建User实例,并加入几个属性 public class User { private String username; private String password; private String nickname; public String getUsernam

  • SpringMVC拦截器——实现登录验证拦截器的示例代码

    本例实现登陆时的验证拦截,采用SpringMVC拦截器来实现 当用户点击到网站主页时要进行拦截,用户登录了才能进入网站主页,否则进入登陆页面 核心代码 首先是index.jsp,显示链接 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String bas

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

    我们在做Form表单提交的时候,只在前端做数据校验是不够安全的,所以有时候我们需要在后端同样做数据的校验.好在SpringMVC在后台验证给我们提供了一个比较好的支持.那就是使用Valid接口的实现类做数据校验.在这之前我们先做一下准备的工作. 添加相关的Maven依赖 我们先把需要的jar包添加进来. <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api<

  • SpringMVC下获取验证码实例详解

    SpringMVC下获取验证码实例详解 前言: 1.用户一开始登录的时候, 不建议出现验证码, 这一点在很多网站上已经体现的很好了, 只有当用户连续输错三次或者以上才会要求用户输入验证码. 2.记录用户输错次数最好不要使用 session 来记录, 因为 session 是跟客户端浏览器会话有关的, 如果用重启浏览器或者换新的浏览器再来登录或者试错, 就是新的回话了, 原来记录的错误次数就失效了. 建议此处采用缓存机制来实现, 简单处理就是采用 Map<用户登录id, 错误次数> 来实现, 如

  • springmvc下实现登录验证码功能示例

    总体思路,简单讲,就是后台生成图片同时将图片信息保存在session,前端显示图片,输入验证码信息后提交表单到后台,取出存放在session里的验证码信息,与表单提交的验证码信息核对. 点击验证码图片时,通过jquery重新请求后台生成验证码图片方法,更换图片. 首先在后端controller里,有这样一个方法: 路径为http://localhost:8888/RiXiang_blog/login/captcha.form,访问这个路径便可以通过response写入图片. @RequestMa

  • SpringMVC实现注解式权限验证的实例

    对大部分系统来说都需要权限管理来决定不同用户可以看到哪些内容,那么如何在Spring MVC中实现权限验证呢?当然我们可以继续使用servlet中的过滤器Filter来实现.但借助于Spring MVC中的action拦截器我们可以实现注解式的权限验证. 一.首先介绍一下action拦截器: HandlerInterceptor是Spring MVC为我们提供的拦截器接口,来让我们实现自己的处理逻辑,HandlerInterceptor 的内容如下: public interface Handl

  • Spring MVC Annotation验证的方法

    简介说明 使用Spring MVC的Annotation验证可以直接对view model的简单数据验证,注意,这里是简单的,如果model的数据验证需要有一些比较复杂的业务逻辑性在里头,只是使用annotation做验证是比较难的. 以下是使用Spring MVC自带的annotation验证,加上自定义的一个@Tel的annotation验证例子,此例子具有: 1.支持多语言(国际化) 2.对默认数据先进行转化,比如int.date类型如果传入空值时,会抛异常,默认给定值 先看配置: 1.w

  • Spring MVC InitBinder验证方法

    使用InitBinder做验证的情况一般会在此Controller中提交的数据需要有一些是业务性质的,也即比较复杂的验证情况下才会使用.大部份简单的表单验证,使用annotation验证即可以解决. Annotation验证使用方法可参见:http://www.jb51.net/article/136448.htm 这里需要注意的一点:InitBinder和Annotation两种验证只能二选一,如果使用了InitBinder,就不能使用Annotation验证. 前面的web.xml和spri

  • Spring Mvc中传递参数方法之url/requestMapping详解

    前言 相信大家在使用spring的项目中,前台传递参数到后台是经常遇到的事, 我们必须熟练掌握一些常用的参数传递方式和注解的使用,本文将给大家介绍关于Spring Mvc中传递参数方法之url/requestMapping的相关内容,分享出来供大家参考学习,话不多说,直接上正文. 方法如下 1. @requestMapping: 类级别和方法级别的注解, 指明前后台解析的路径. 有value属性(一个参数时默认)指定url路径解析,method属性指定提交方式(默认为get提交) @Reques

  • Spring MVC 框架搭建配置方法及详解

    现在主流的Web MVC框架除了Struts这个主力 外,其次就是Spring MVC了,因此这也是作为一名程序员需要掌握的主流框架,框架选择多了,应对多变的需求和业务时,可实行的方案自然就多了.不过要想灵活运用Spring MVC来应对大多数的Web开发,就必须要掌握它的配置及原理. 一.Spring MVC环境搭建:(Spring 2.5.6 + Hibernate 3.2.0) 1. jar包引入 Spring 2.5.6:spring.jar.spring-webmvc.jar.comm

  • Java环境中MyBatis与Spring或Spring MVC框架的集成方法

    与Spring3集成 Spring作为基础框架,可以集成后端框架,如Hibernate,MyBatis等. 前面是介绍单独使用MyBatis的,大致逻辑是: sqlSessionFactory <- configuration file (包括数据库连接配置) IXxxMapper <- sqlSession <- sqlSessionFactory                      <- mapper interface <- mapper xml 得到IxxMap

  • Spring mvc结果跳转方法详解

    ModelAndView 设置ModelAndView对象 , 根据view的名称 , 和视图解析器跳到指定的页面 . 页面 : {视图解析器前缀} + viewName +{视图解析器后缀} <!-- 视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"&

  • Spring MVC框架配置方法详解

    本文实例为大家分享了Spring MVC框架配置方法,供大家参考,具体内容如下 1.概述 Spring MVC 作用:用来实现前端浏览器与后面程序的交互 Spring MVC 是基于Spring 的MVC框架,所谓MVC(model,controller,view) ,整个Spring MVC 作用就是,基于Spring 将model(数据)在controller(后台程序) ,view(前端浏览器)之间交互 至于Spring MVC优点缺点,了解不深 不作评价, 2.引用的jar包 既然是基于

  • Spring MVC的文件上传和下载以及拦截器的使用实例

    Spring MVC会根据请求方法的签名不同,将请求消息中的信息以一定的方式转换并绑定到请求方法的参数中. 1.文件上传 文件上传,必须将表单的method设置为POST,并将enctype设置为multipart/form-data.只有这样,才能将文件的二进制数据发送给服务器. Spring 3.0规范提供了方法来处理文件上传,但是这种上传需要在Servlet中完成.而Spring MVC封装了上传功能,使用了Apache Commons FileUpload技术来实现了一个Multipar

  • Spring MVC 基于URL的映射规则(注解版)

    好几天没有跟进Spring MVC的学习了,之前看了点源码都忘的差不多了.这次就跟着之前的问题,继续总结下Spring MVC中的小知识. url-pattern 如果看过前一篇入门的帖子,应该了解到spring mvc在启动前必须要在web.xml中配置servlet,这样才能拦截到想要映射的url地址. <servlet> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springfr

  • Spring MVC+ajax进行信息验证的方法

    本文是一个ajax结合Spring MVC使用的入门,首先我们来了解一下什么是Ajax AJAX 不是新的编程语言,而是一种使用现有标准的新方法.AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容.所以ajax对于提升用户体验十分重要 XMLHttpRequest 是 AJAX 的基础. 主要的方法有两种: var xmlhttp=new XMLHttpRequest(); xmlhttp.open(method,url,async) xmlhttp.se

随机推荐