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. mac OS X中升级php5.5至php5.6 or php7

    在做php项目中,提示“Warning. PHP 5.6 or newer is required. Please, upgrade your local PHP installation.” 通过p ...

  2. 'Project Name' was compiled with optimization

    'Project Name' was compiled with optimizationhtml, body {overflow-x: initial !important;}html { font ...

  3. C语言 · 征税程序

    算法提高 征税程序   时间限制:1.0s   内存限制:512.0MB      问题描述 税务局希望你帮他们编写一个征税程序,该程序的功能是:首先输入某公司的年销售额sale和税率rate,然后程 ...

  4. Aspose.Cells Smart markers 基于模板导出Excel

    Aspose.Cells可以预先定义Excel模板,然后填充数据(官方文档:http://www.aspose.com/docs/display/cellsjava/Smart+Markers). 设 ...

  5. Sahi (1) —— 快速入门(101 Tutorial)

    Sahi (1) -- 快速入门(101 Tutorial) jvm版本: 1.8.0_65 sahi版本: Sahi Pro 6.1.0 参考来源: Sahi官网 Sahi Quick Tutori ...

  6. Git 执行更改

    Jerry 克隆库,他决定实现基本字符串操作.于是,他创建文件string.c,在添加内容到 string.c 会这个样子. #include <stdio.h> int my_strle ...

  7. php curl_multi系列函数实现多线程抓取网页

    最近几天在做一个多搜索引擎关键字排名查询工具,用于及时方便的了解关键词在各大搜索引擎的排名. 在抓取360搜索的时候,发现360搜索每页只支持显示10个搜索结果,如果想获取100个搜索结果数据,就得搜 ...

  8. [maven] settings 文件 国内镜像站

    <?xml version="1.0" encoding="UTF-8"?> <!-- Licensed to the Apache Soft ...

  9. js dom 创建table标签和子属性, 以及创建多选框

    代码: <div class="Category"> <span id="Edit_headerTitle">Edit Categori ...

  10. 自定义python web框架

    -- Bootstrap http://www.bootcss.com/ -- Font Awesome http://fontawesome.io/ -- bxslider http://bxsli ...