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

  林炳文Evankaka原创作品。转自https://blog.csdn.net/Evankaka/article/details/45789283

     服务器端的数据验证,对于一个WEB应用来说是非常重要的,而Spring从3.0开始支持JSR-303规范,它定义了一些标准的验证约束,同时也提供了一个可扩展的自定义方式来满足不同的开发需要,大象以SSM3为基础,结合实例来说明如何通过Spring MVC用自定义约束注解的方式来实现Validator验证。


validation-api是JSR-303规范的标准接口,hibernate-validator则是这套接口的一个实现,而hibernate-validator的实现里面又会用到slf4j,所以还需要加上这两个jar包。有了这些,我们就可以在此基础上实现自定义注解约束扩展了。

本文工程免费下载

一、在eclipse创建web项目

整个工程目录如下:


导入包

2、创建User类

并标注注解

其中@Length、@Email就是 Hibernate-validator中的数据校验注解,还可以用 javax.validation中的注解,比如@NotNull


   
   
  1. package com.mucfc.model;
  2. import org.hibernate.validator.constraints.Email;
  3. import org.hibernate.validator.constraints.Length;
  4. import org.hibernate.validator.constraints.NotEmpty;
  5. /**
  6. *用户格式验证类
  7. *@author linbingwen
  8. *@2015年5月17日15:45:27
  9. */
  10. public class User {
  11. @NotEmpty(message= "用户名不能为空")
  12. private String userName;
  13. @NotEmpty(message= "密码不能为空")
  14. @Length(min= 6,max= 16,message= "密码长度不正确,得在6-16之间")
  15. private String userPassword;
  16. @NotEmpty(message= "邮箱不能为空")
  17. @Email(message= "邮箱格式不正确")
  18. private String userEmail;
  19. public String getUserName() {
  20. return userName;
  21. }
  22. public void setUserName(String userName) {
  23. this.userName = userName;
  24. }
  25. public String getUserPassword() {
  26. return userPassword;
  27. }
  28. public void setUserPassword(String userPassword) {
  29. this.userPassword = userPassword;
  30. }
  31. public String getUserEmail() {
  32. return userEmail;
  33. }
  34. public void setUserEmail(String userEmail) {
  35. this.userEmail = userEmail;
  36. }
  37. }

3、web.xml中配置控制器


   
   
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns= "http://java.sun.com/xml/ns/javaee" xmlns:web= "http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  4. xsi:schemaLocation= "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  5. id= "WebApp_ID" version= "3.0">
  6. <!-- SpringMVC的前端控制器 -->
  7. <servlet>
  8. <servlet-name>MyDispatcher </servlet-name>
  9. <servlet-class>org.springframework.web.servlet.DispatcherServlet </servlet-class>
  10. <!-- 加载配置文件路径 -->
  11. <init-param>
  12. <param-name>contextConfigLocation </param-name>
  13. <param-value>/WEB-INF/spring-servlet.xml </param-value>
  14. </init-param>
  15. <!-- 何时启动 大于0的值表示容器启动时初始化此servlet,正值越小优先级越高 -->
  16. <load-on-startup>1 </load-on-startup>
  17. </servlet>
  18. <!-- Spring MVC配置文件结束 -->
  19. <!-- SpringMVC拦截设置 -->
  20. <servlet-mapping>
  21. <servlet-name>MyDispatcher </servlet-name>
  22. <!-- 由SpringMVC拦截所有请求 -->
  23. <url-pattern>/ </url-pattern>
  24. </servlet-mapping>
  25. <!-- SpringMVC拦截设置结束 -->
  26. <!--解决中文乱码问题 -->
  27. <filter>
  28. <filter-name>CharacterEncodingFilter </filter-name>
  29. <filter-class>org.springframework.web.filter.CharacterEncodingFilter </filter-class>
  30. <init-param>
  31. <param-name>encoding </param-name>
  32. <param-value>UTF-8 </param-value>
  33. </init-param>
  34. </filter>
  35. <filter-mapping>
  36. <filter-name>CharacterEncodingFilter </filter-name>
  37. <url-pattern>/* </url-pattern>
  38. </filter-mapping>
  39. </web-app>

4、控制器配置文件

在Spring MVC配置文件中添加配置:

添加以下mvc的注解驱动配置,一切变成“自动化”

<mvc:annotation-driven />


   
   
  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2. xmlns:context= "http://www.springframework.org/schema/context"
  3. xmlns:util= "http://www.springframework.org/schema/util" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:p= "http://www.springframework.org/schema/p" xmlns:mvc= "http://www.springframework.org/schema/mvc"
  5. xsi:schemaLocation= "
  6. http://www.springframework.org/schema/util
  7. http://www.springframework.org/schema/util/spring-util-3.2.xsd
  8. http://www.springframework.org/schema/mvc
  9. http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
  10. http://www.springframework.org/schema/beans
  11. http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
  12. http://www.springframework.org/schema/context
  13. http://www.springframework.org/schema/context/spring-context-3.2.xsd">
  14. <mvc:annotation-driven/>
  15. <!-- 把标记了@Controller注解的类转换为bean -->
  16. <context:component-scan base-package="com.mucfc" />
  17. <!-- 对模型视图名称的解析,即在模型视图名称添加前后缀 -->
  18. <bean
  19. class= "org.springframework.web.servlet.view.InternalResourceViewResolver"
  20. p:prefix= "/WEB-INF/views/" p:suffix= ".jsp" />
  21. </beans>

5、注解Controller的类

       首先,要在需要进行校验的Bean前面加上@Valid注解,告诉SpringMVC框架这个Bean需要进行校验;同时,还要在需要校验的Bean前面加上@ModelAttribute注解,从而将Bean暴露给视图,并且指定名字,这有两个作用,第一是显示校验错误需要使用这个名字,第二个是返回原来的页面以后,前面输入的所有值还要显示出来;

       其次,每个需要校验的Bean后面紧跟一个BindingResult,SpringMVC框架会将校验结果保存在它里面,通过hasErrors方法可以判断是否有校验错误;

      最后,当返回到原页面以后,SpringMVC框架还会将所有校验错误信息保存在上下文中,供页面上取得校验错误,Spring提供了一套JSP自定义标签。



   
   
  1. package com.mucfc.controller;
  2. import javax.servlet.http.HttpServletRequest;
  3. import javax.servlet.http.HttpServletResponse;
  4. import javax.validation.Valid;
  5. import org.springframework.stereotype.Controller;
  6. import org.springframework.ui.Model;
  7. import org.springframework.validation.BindingResult;
  8. import org.springframework.web.bind.annotation.ModelAttribute;
  9. import org.springframework.web.bind.annotation.RequestMapping;
  10. import org.springframework.web.bind.annotation.RequestMethod;
  11. import com.mucfc.model.User;
  12. @Controller
  13. public class UserControllers {
  14. @RequestMapping(value = "/register", method = {RequestMethod.POST})
  15. public String registerCheck(Model model, @Valid @ModelAttribute("user")User user,
  16. BindingResult result) {
  17. if (result.hasErrors())
  18. return "register";
  19. else{
  20. model.addAttribute( "userName", user.getUserName());
  21. return "forward:/success";
  22. }
  23. }
  24. @ModelAttribute( "user")
  25. public User getUser(){
  26. User user= new User();
  27. return user;
  28. }
  29. @RequestMapping(value = "/register", method = {RequestMethod.GET})
  30. public String register() {
  31. return "register";
  32. }
  33. @RequestMapping(value = "/success")
  34. public String success(HttpServletRequest request,HttpServletResponse response) {
  35. String str=(String)request.getAttribute( "userName");
  36. if(str== null||str.equals( "")){
  37. return "redirect:/register";
  38. }
  39. return "success";
  40. }
  41. }

6、WEB-INF新建文件夹

(1)首先是用户数据输入register.jsp


   
   
  1. <%@ page language="java" contentType="text/html; charset=utf-8"
  2. pageEncoding= "utf-8"%>
  3. <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
  4. <%
  5. String path = request.getContextPath();
  6. String basePath = request.getScheme() + "://"
  7. + request.getServerName() + ":" + request.getServerPort()
  8. + path + "/";
  9. %>
  10. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  11. <html>
  12. <head>
  13. <title>用户信息注册页面 </title>
  14. <base href="<%=basePath%>">
  15. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  16. </head>
  17. <body>
  18. <center>
  19. <h1>注册新用户 </h1>
  20. <form:form action="register" method="post" modelAttribute="user">
  21. <form:errors path="*"> </form:errors> <br/> <br/>
  22. <tr>
  23. <td> <form:label path="userName">用户名: </form:label> </td>
  24. <td> <form:input path="userName"/> </td> <br/>
  25. <td> <form:errors path="userName"/> </td> <br/>
  26. </tr> <br/>
  27. <tr>
  28. <td> <form:label path="userPassword">密 码:  </form:label> </td>
  29. <td> <form:password path="userPassword"/> </td> <br/>
  30. <td> <form:errors path="userPassword"/> </td> <br/>
  31. </tr> <br/>
  32. <tr>
  33. <td> <form:label path="userEmail">邮 箱:  </form:label> </td>
  34. <td> <form:input path="userEmail"/> </td> <br/>
  35. <td> <form:errors path="userEmail"/> </td> <br/>
  36. </tr> <br/>
  37. <tr>
  38. <td colspan="3"> <input type="submit" value="提交"> </td>
  39. <td colspan="3"> <input type="reset" value="重置"> </td>
  40. </tr>
  41. </form:form>
  42. </center>
  43. </body>
  44. </html>
这里用了SpringMVC的form表单,自动将输入和User注解格式类关联起来,当你输入正确的格式后,才会跳转到其它也页面,否则会要本页面报错误

在JSP页面上显示校验错误信息:

页面头部需要导入Spring的自定义标签库:

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

需要一次性显示全部校验错误:

(commandName的值就是@ModelAttribute注解中指定的值)

<form:form commandName="userDetail">
    <form:errors path="*" cssStyle="color:red"></form:errors>
</form:form>

需要在对应输入框的后面显示单个校验错误:

(通过path指定显示那个具体的校验错误,userDetail正是@ModelAttribute注解中指定的值,点后面的是指定显示Bean中哪个属性的校验错误)

<input type="text" name="userName" value="${userDetail.userName}" >
<form:errors path="userDetail.userName" cssStyle="color:red"></form:errors>

<input type=“text” name=“email” value="KaTeX parse error: Expected 'EOF', got '&' at position 27: ….email}"</span>&̲gt;</span> <spa…{userName}

  • </center>
  • </body>
  • </html>

  • 7、运行后看看结果

    浏览器中输入:http://localhost:8080/SpringMVCLearningChapter3/register

    进入注册页面

    如果什么都不写直接提交,会报出如下错误


    密码和邮箱格式出错

    如果 数据格式都正确,刚会出现如下内容

    二、注解说明

    最后,再加一些注解说明

    @AssertFalse
    验证的数据类型 :Boolean,boolean
    说明 :验证注解的元素值是false
    @AssertTrue
    验证的数据类型 :Boolean,boolean
    说明 :验证注解的元素值是true
    @NotNull
    验证的数据类型 :任意类型 
    说明 :验证注解的元素值不是null
    @Null
    验证的数据类型 :任意类型 
    说明 :验证注解的元素值是null
    @Min(value=值)
    验证的数据类型 :BigDecimal,BigInteger, byte,short, int, long,等任何Number或CharSequence(存储的是数字)子类型 
    说明 :验证注解的元素值大于等于@Min指定的value值
     
    @Max(value=值)
    验证的数据类型 :和@Min要求一样 
    说明 :验证注解的元素值小于等于@Max指定的value值
    @DecimalMin(value=值)
    验证的数据类型 :和@Min要求一样
    说明 :验证注解的元素值大于等于@ DecimalMin指定的value值
    @DecimalMax(value=值)
    验证的数据类型 :和@Min要求一样
    说明 :验证注解的元素值小于等于@ DecimalMax指定的value值
    @Digits(integer=整数位数, fraction=小数位数)
    验证的数据类型 :和@Min要求一样
    说明 :验证注解的元素值的整数位数和小数位数上限
    @Size(min=下限, max=上限)
    验证的数据类型 :字符串、Collection、Map、数组等
    说明 :验证注解的元素值的在min和max(包含)指定区间之内,如字符长度、集合大小
    @Past
    验证的数据类型 :java.util.Date,java.util.Calendar,Joda Time类库的日期类型
    说明 :验证注解的元素值(日期类型)比当前时间早
     
    @Future
    验证的数据类型 :与@Past要求一样
    说明 :验证注解的元素值(日期类型)比当前时间晚
    @NotBlank
    验证的数据类型 :CharSequence子类型
    说明 :验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的首位空格
    @Length(min=下限, max=上限) 
    验证的数据类型 : CharSequence子类型
    说明 :验证注解的元素值长度在min和max区间内
    @NotEmpty
    验证的数据类型 :CharSequence子类型、Collection、Map、数组
    说明 :验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
    @Range(min=最小值, max=最大值)
    验证的数据类型 :BigDecimal,BigInteger,CharSequence, byte, short, int, long等原子类型和包装类型
    说明 :验证注解的元素值在最小值和最大值之间
     
    @Email(regexp=正则表达式,flag=标志的模式)
    验证的数据类型 :CharSequence子类型(如String)
    说明 :验证注解的元素值是Email,也可以通过regexp和flag指定自定义的email格式
    @Pattern(regexp=正则表达式,flag=标志的模式)
    验证的数据类型 :String,任何CharSequence的子类型
    说明 :验证注解的元素值与指定的正则表达式匹配
    @Valid
    验证的数据类型 :任何非原子类型
    说明 :指定递归验证关联的对象;如用户对象中有个地址对象属性,如果想在验证用户对象时一起验证地址对象的话,在地址对象上加@Valid注解即可级联验证
     
    注意:此处只列出Hibernate Validator提供的大部分验证约束注解,请参考hibernate validator官方文档了解其他验证约束注解和进行自定义的验证约束注解定义


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值