http://blog.csdn.net/daryl715/article/details/1645880

http://blog.csdn.net/shuwei003/article/details/7213662

上面两篇文章文笔比较混乱,但能看出大概的过程。

个人实践:

1、概述:主要用到以下几个要素:一个与表单内容对应的JavaBean类,一个用来验证这个Bean的Validator类,一个调用这个Validator的Controller类。

所以,Validator需要知道JavaBean,Controller需要知道Validator。

剩下的都是细节。

2、例子:

(1) JavaBean

public class User {
private Integer userId; private Integer parentId; private String userName; private String password; private String tel; private String email; private String qq; private String webChat; private Integer groupId; private Boolean state; private Date createTime; private Date lastTime;
}

getter和setter省略了。

(2)、表单jsp页面


<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="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>添加用户</title>
<link href="/Public/media/css/new/page.css" rel="stylesheet"
type="text/css" />
<style type="text/css">
.errormsg {
font-family: "微软雅黑";
color: #F30;
}
</style>
</head>
<body>

<form:form action="${pageContext.request.contextPath}/userConfig/addDA" method="post" commandName="user">
<div class="formDiv">
<table width="1020" border="0">
<tr>
<td align="right">用户名:</td>
<td align="left"><form:input path="userName"/><span class="errormsg"><form:errors path="userName"/></span></td>
</tr>
<tr>
<td align="right">密码:</td>
<td align="left"><form:password path="password"/><span class="errormsg"><form:errors path="password"/></span></td>
</tr>
<tr>
<td align="right">电话:</td>
<td align="left"><form:input path="tel"/><span class="errormsg"><form:errors path="tel"/></span></td>
</tr>
<tr>
<td align="right">邮件:</td>
<td align="left"><form:input path="email"/><span class="errormsg"><form:errors path="email"/></span></td>
</tr>
<tr>
<td align="right">QQ:</td>
<td align="left"><form:input path="qq"/><span class="errormsg"><form:errors path="qq"/></span></td>
</tr>
<tr>
<td align="right">微信:</td>
<td align="left"><form:input path="webChat"/><span class="errormsg"><form:errors path="webChat"/></span></td>
</tr>
<tr>
<td align="right">状态:</td>
<td align="left"><table width="200">
<tr>
<td><label> <input type="radio"
name="StatusRadioGroup" value="禁用" id="StatusRadioGroup_0" />
禁用
</label></td>
</tr>
<tr>
<td><label> <input type="radio"
name="StatusRadioGroup" value="生效" id="StatusRadioGroup_1" />
生效
</label></td>
</tr>
</table></td>
</tr>
<tr>
<td></td>
<td><input name="" type="submit" value="提交" /></td>
</tr> </table>
</div>
</form:form>

</body>
</html>

 

想要详细了解这里用到的springmvc form标签的意思,需要先学习相应知识:http://haohaoxuexi.iteye.com/blog/1807330

关键点:

a、commandName属性指定了后台Model中与表单对应的对象的名字,需要在后台modelAndView.setObject("user",user);如果不写该属性,默认key是"command",那在后台就要

modelAndView.setObject("command",user)。

b、<form:input和<form:errors标签中使用path属性指定该表单项对应的user的属性名。

c、注意引入springmvc的form标签<%@taglib uri="http://www.springframework.org/tags/form" prefix="form" %>

(3)Validator代码


package com.leslie;

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


import com.leslie.User;

public class UserValidator implements Validator{

    @Override
public boolean supports(Class<?> clazz) {
return User.class.equals(clazz);
} @Override
public void validate(Object obj, Errors e) {
// ValidationUtils.rejectIfEmpty(e, "name", "name.empty");
// ValidationUtils.rejectIfEmpty(e, "gender", "null");
// ValidationUtils.rejectIfEmpty(e, "age", "null");
// User s = (User)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");
// }
ValidationUtils.rejectIfEmpty(e, "userName", null, "用户名不能为空");
ValidationUtils.rejectIfEmpty(e, "password", null, "密码不能为空");
} }

关键点:

a、supports方法中指定了对哪个类进行验证。

b、ValidationUtils是springmvc的工具类,你可以方便地使用它进行常用的判断,你也可以直接使用e.rejectValue定义你自己的判断信息,

注释掉的语句列出了常用的用法。

c、rejectIfEmpty方法第三个参数是国际化properties文件中的key值,由于我没有使用国际化,此处使用了第四个参数,也就是默认值。

(4) Controller实现

@Controller
@RequestMapping("/userConfig")
public class SJUserConfigController {

@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setValidator(new UserValidator());
}


  @RequestMapping("/openAddUser")
public ModelAndView openAddUser() {
ModelAndView mv = new ModelAndView();
User u = new User();
mv.addObject("user",u);
mv.setViewName("addUser");
return mv;
} @RequestMapping("/addUser")
public ModelAndView addUser(@Valid @ModelAttribute User user, BindingResult br,
HttpServletRequest requset) {
ModelAndView mv = new ModelAndView();
mv.addObject("user", user);
if (br.hasErrors()) {
mv.setViewName("addUser");
} else {
mv.setViewName("success");
}
return mv;
}
}

关键点:

a、@InitBinder指定了Validator。

b、注意openAddUser这个方法,这个方法执行以后首次打开表单页供用户填写信息,mv.addObject("user",u);这句非常必要,u不能为null,否则jsp报错。

c、addUser方法处理表单提交上来的内容,@Valid指定了要对其修饰的对象进行验证,如果没有这个注解,springmvc就不会对表单进行验证。

3、后记

使用了上述的验证机制以后,虽然经过测试,可以正常验证表单,但后台服务器报

javax.validation.ValidationException: Unable to create a Configuration, because no Bean Validation provider could be found.

加入hibernate-validator.jar(以及其依赖的jboss-logging.jar和classmate.jar)以后就正常了,具体Jar的版本号此处略去。

4、后记的后记:一个巨大的坑和巨大的潜规则--commandName与@ModelAttribute必须配合默契否则不报错但就是不显示错误信息

什么意思呢?说明如下。

在前面的例子中,我很巧合地将页面的commandName值赋为"user",而我的表单对应Java类刚好也是叫User,而且我直接这样@ModelAttribute使用了注解,并没有指定@ModelAttribute("xxxx"),结果

一切顺利,但这只是一种巧合情况。

好,那下面我总结一下我实验出的最后结论:

1、如果你直接使用@ModelAttribute,并没有指定其value,那对不起,你页面中的commandName的值必须是你的表单对应类的类名的小写!最恶心的是,如果你不知道这一点,

随意地给commandName起名字的话,validator会正确验证表单,controller会正确跳转,一切都正常,就是页面中不显示错误信息!而且不报任何错误!

2、如果你这样使用@ModelAttribute注解,比如@ModelAttribute("abcdef"),那么你页面中的commandName也必须等于"abcdef",二者匹配起来用,这样,你才可能达到自己给commandName

起名字的目的!

后记的后记二:

如果一个controller中的方法处理两个及两个以上的form表单,比如,方法A()接收并处理用户注册信息,而方法B()接收并处理定单查询条件,由于controller只能绑定一个validator,没有与validator匹配的那个

表单在被提交之后也会被validator验证并报错,即使你没加@Valid也会。目前没有解决的办法,只能将这种情况拆开两个controller处理。

springmvc表单验证的更多相关文章

  1. SpringMVC 表单验证

    SpringMVC 表单验证 本章节内容很丰富,主要有基本的表单操作,数据的格式化,数据的校验,以及提示信息的国际化等实用技能. 首先看效果图 项目结构图 接下来用代码重点学习SpringMVC的表单 ...

  2. SpringMVC表单验证器

    本章讲解SpringMVC中怎么通过注解对表单参数进行验证. SpringBoot配置 使用springboot,spring-boot-starter-web会自动引入hiberante-valid ...

  3. SpringMVC表单验证与Velocity整合

    阅读本文约“1.2分钟” 定义表单类 以Login为例,有username和password两个字段 import javax.validation.constraints.NotNull; impo ...

  4. @valid表单验证demo

    springMVC 表单验证demo  视图层使用的是jsp

  5. (转载)SPRINGMVC表单标签简介

    SpringMVC表单标签简介 在使用SpringMVC的时候我们可以使用Spring封装的一系列表单标签,这些标签都可以访问到ModelMap中的内容.下面将对这些标签一一介绍. 在正式介绍Spri ...

  6. SpringMVC表单标签简介

    在使用SpringMVC的时候我们可以使用Spring封装的一系列表单标签,这些标签都可以访问到ModelMap中的内容.下面将对这些标签一一介绍. 在正式介绍SpringMVC的表单标签之前,我们需 ...

  7. 【转载】springMVC表单校验+全注解

    在这篇文章中,我们将学习如何使用Spring表单标签, 表单验证使用 JSR303 的验证注解,hibernate-validators,提供了使用MessageSource和访问静态资源(如CSS, ...

  8. spring mvc:练习:表单验证(javaConfig配置和注解)

    使用Spring表单标签, 表单验证使用 JSR303 的验证注解,hibernate-validators,提供了使用MessageSource和访问静态资源(如CSS,JavaScript,图片) ...

  9. Spring4 MVC表单验证

    在这篇文章中,我们将学习如何使用Spring表单标签, 表单验证使用 JSR303 的验证注解,hibernate-validators,提供了使用MessageSource和访问静态资源(如CSS, ...

随机推荐

  1. 【Android】Android6.0发送短信Demo

    整理一下使用SmsManager类发送短信的方法. https://developer.android.com/reference/android/telephony/SmsManager.html ...

  2. C语言 · 数组输出

    算法提高 数组输出   时间限制:1.0s   内存限制:512.0MB      输入一个3行4列的数组,找出该数组中绝对值最大的元素.输出该元素及其两个下标值.如有多个输出行号最小的,还有多个的话 ...

  3. TED Notes 1 (What leads to success)

    1. the first thing is passion, do it for love, not for money2. if you do it for love, the money come ...

  4. Redis提供的持久化机制(一)

    Redis提供的持久化机制 redis是一个内存数据库,也就是说它的所有的数据都是保存在内存中的,而内存中的数据当程序结束时就会消失,所以我们要想办法把内存中的数据写到磁盘中.当程序异常退出或者正常退 ...

  5. cgi与fastcgi区别_转

    转自:https://www.cnblogs.com/wanghetao/p/3934350.html 当我们在谈到cgi的时候,我们在讨论什么 最早的Web服务器简单地响应浏览器发来的HTTP请求, ...

  6. Iconfont在移动端应用的问题

    关于部分奇葩用户代理不显示字体图标 以酷派为代表的部分安卓手机自带浏览器.微信/QQ WebView 等用户代理无法正常显示 Icon Font,原因可能是这些用户代理无法正确处理伪元素 conten ...

  7. Kettle 添加对应hadoop版本的支持

    在hdp的官网上有一个ETL工具叫做Talend Open Studio,然后我就下了,并且在群里询问了一下,突然间冒出来一群ETL高手,经高人指点认识了一款叫做Kettle的软件,经过这两天的试用, ...

  8. servlet 过滤器实现 请求转发(跳转);跨域转发请求;tomcat 环境下。

    一般的文章都有 文本内容 和图片的.我想实现一个图片服务(或服务器)来单独处理图片逻辑,和文章处理逻辑分离.于是我想到一个办法,来尝试. 背景: 1. 假如文章的处理在web App,就叫web1 吧 ...

  9. SpringMVC接受JSON参数详解及常见错误总结

    SpringMVC接受JSON参数详解及常见错误总结 SpringMVC接受JSON参数详解及常见错误总结 最近一段时间不想使用Session了,想感受一下Token这样比较安全,稳健的方式,顺便写一 ...

  10. git 通过nginx 无法clone

    git服务器架设在内网,通过nginx做反向代理后如果公网质量差的话部分项目无法clone,报错: error: RPC failed; result=18, HTTP code = 200B | 3 ...