34. 尚硅谷_佟刚_SpringMVC_数据绑定流程分析.avi

例如:在jsp中输入一个String字符串类型,需要转换成Date类型的流程如下

convertservice对传入的数据进行转换

Validator对传入的数据进行格式校验

如果在转换和校验的过程中出现异常,将异常的结果封装到BingdinResult对象中

springMVC数据绑定流程

  1. springMVC框架将ServletRequest对象及方法的如参实例传递给WebDataBinderFactory石丽以创建DataBinder对象。
  2. DataBinder调用装配在springMVC上下文的ConversionService组件进行数据类型转换、数据格式化(类型转换和格式化是一起的一会来看源码),将Servlet中的请求信息填充到如参的对象中。
  3. 调用Validator组件对已经完成绑定了的请求消息的入参对象进行数据合法性校验,把最终生成数据绑定结果BindingData对象
  4. 如果在数据类型转换、格式化和校验的过程中出现错误的话,会把处理的结果放到BindingResult对象中,将它们赋给处理方法的响应入参。

35. 尚硅谷_佟刚_SpringMVC_自定义类型转换器.avi

在SpringMvc中会将来自web页面的请求和响应数据与controller中对应的处理方法的入参进行绑定,即数据绑定。流程如下:

-1.SpringMvc主框架将ServletRequest对象及目标方法的入参实例传递给WebDataBinderFactory实例,以创建DataBinder实例对象

-2.DataBinder对象调用装配在SpringMvc上下文中的ConversionService组件进行数据类型转换,数据格式化工作,将Servlet中的请求信息填充到入参对象中。

-3.调用Validator组件对已经绑定了请求消息的入参对象进行数据合法性校验,并最终生成数据绑定结果BindingData对象

-4.SpringMvc抽取BindingResult中的入参对象和校验错误对象,将它们赋给处理方法的相应入参。

总结起来:大致流程是  绑定(bindingResult)--》数据转换(conversionService)--》校验(validators)

数据转换

SpringMvc上下文中内建了很多转换器,可以完成大多数Java类型转换工作。但是如果就要转换成我们自定义的类型时,那么我们就要自定义类型转换器,并将其加入到conversionService中去,conversionService中包含了很多SpringMvc内建的转换器。

ConversionService是SpringMvc类型转换体系的核心接口,可以利用ConversionServiceFactoryBean在Spring的IOC容器中定义一个ConversionService,Spring将自动识别出IOC容器中的ConversionService,并在bean属性配置及SpringMvc处理方法入参绑定等场合使用它进行数据转换。

springmvc自定义的类型转换器

首先定义一个转换器

  1. package com.ibigsea.springmvc.handler;
  2.  
  3. import org.springframework.core.convert.converter.Converter;
  4.  
  5. import com.ibigsea.springmvc.model.Department;
  6. import com.ibigsea.springmvc.model.Employee;
  7.  
  8. public class EmployeeConverts implements Converter<String, Employee>{
  9.  
  10. /*
  11. * source就是前台web页面传递过来的字符串
  12. * 如:gg-gg@qq.com-0-105 姓名-邮件-性别-部门ID
  13. * */
  14. public Employee convert(String source) {
  15. // TODO Auto-generated method stub
  16. if(source!=null){
  17. String[] vals=source.split("-");
  18. //获得雇员的姓名
  19. String name=vals[0];
  20. //获得雇员的邮件
  21. String email=vals[1];
  22. //获得雇员的性别
  23. Integer sex=Integer.parseInt(vals[2]);
  24. //获得雇员的部门
  25. Department department=new Department();
  26. department.setId(Integer.parseInt(vals[3]));
  27.  
  28. Employee employee= new Employee(null, name, email,sex , department);
  29. return employee;
  30. }
  31. //如果字符串为空,就不生成雇员对象
  32. return null;
  33.  
  34. }
  35.  
  36. }

其次:修改handle文件

  1. package com.ibigsea.springmvc.handler;
  2.  
  3. import java.util.Collection;
  4. import java.util.Map;
  5.  
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.stereotype.Controller;
  8. import org.springframework.web.bind.annotation.ModelAttribute;
  9. import org.springframework.web.bind.annotation.PathVariable;
  10. import org.springframework.web.bind.annotation.RequestMapping;
  11. import org.springframework.web.bind.annotation.RequestMethod;
  12. import org.springframework.web.bind.annotation.RequestParam;
  13.  
  14. import com.ibigsea.springmvc.dao.DepartmentDao;
  15. import com.ibigsea.springmvc.dao.EmployeeDao;
  16. import com.ibigsea.springmvc.model.Department;
  17. import com.ibigsea.springmvc.model.Employee;
  18.  
  19. @Controller
  20. public class EmployeeHandler {
  21.  
  22. @Autowired
  23. private EmployeeDao employeeDao;
  24. @Autowired
  25. private DepartmentDao departmentDao;
  26.  
  27. /***
  28. * 自定义数据类型转换器,将特定格式的字符串转换成员工对象保存到数据库中
  29. * @RequestParam("source")输入参数的名字是source格式的文本对象,转换之后成为了emloyee对象
  30. * */
  31. @RequestMapping(value="/testConvertService")
  32. public String testConvertService(@RequestParam("source") Employee employee){
  33. employeeDao.save(employee);
  34. return "redirect:/emps";
  35. }
  36.  
  37. /**
  38. * 点击修改联系人,跳转到修改联系人页面,显示需要修改的联系人信息,其中联系人的名字不能被修改
  39. * */
  40. @RequestMapping(value="/edit/{id}",method=RequestMethod.GET)
  41. public String input(@PathVariable("id") Integer id,Map<String,Object> map){
  42.  
  43. Collection<Department> departments = departmentDao.getAll();
  44. map.put("departments", departments);
  45. //通过id查找需要修改的联系人
  46. Employee employee = employeeDao.getEmpById(id);
  47. map.put("employ", employee);
  48. return"input";
  49. }
  50.  
  51. /**
  52. * 这里需要在执行修改联系人在保存的时候先查询出来,否则自己保存
  53. * m is :Employee [id=1002, name=null, email=BB@ibigsea.com, sex=0, department=Department [id=101, name=null]]
  54. * 会存在联系人名字为空的情况,修改修改联系人页面没有传递联系人姓名的属性值
  55. * */
  56. @ModelAttribute
  57. public void getEmployee(@RequestParam(value="id",required = false) Integer id ,Map<String,Object> map){
  58. if(id != null){
  59. Employee employee = employeeDao.getEmpById(id);
  60. //map.put("employ", employee)名字和@ModelAttribute("employ")中的一一对应
  61. map.put("employ", employee);
  62. }
  63. }
  64.  
  65. /***
  66. * 保存修改联系人页面,修改的联系人,对应的action是addEmp
  67. * <form:form action="addEmp" method="post" modelAttribute="employ" >
  68. * 对应的访问方式是对应的访问方式是PUT方式
  69. * <input type="hidden" name="_method" value="PUT"/>
  70. *
  71. * 注意点2:
  72. * 这里在修改修改联系人的时候,需要被修改联系人的name属性不能被修改
  73. * m is :Employee [id=1002, name=null, email=BB@ibigsea.com, sex=0, department=Department [id=101, name=null]]
  74. * */
  75. @RequestMapping(value="/addEmp", method=RequestMethod.PUT)
  76. public String update(@ModelAttribute("employ")Employee em){
  77. System.out.println("em is :"+em.toString());
  78. employeeDao.save(em);
  79. return "redirect:/emps";
  80. }
  81.  
  82. /*
  83. * 执行添加联系人操作,重定向到显示所有联系人的页面
  84. * */
  85. @RequestMapping(value="/delete/{id}", method=RequestMethod.DELETE)
  86. public String deletEmp(@PathVariable("id") Integer id ){
  87. employeeDao.delEmpById(id);
  88. //employeeDao.save(employ);
  89. return "redirect:/emps";
  90. }
  91.  
  92. /*
  93. * 执行添加联系人操作,重定向到显示所有联系人的页面
  94. * */
  95. @RequestMapping(value="/addEmp", method=RequestMethod.POST)
  96. public String addEmp(Employee em){
  97. employeeDao.save(em);
  98. return "redirect:/emps";
  99. }
  100.  
  101. /**
  102. * 点击添加联系人,跳转到添加联系人页面
  103. * */
  104. @RequestMapping(value="/emp",method=RequestMethod.GET)
  105. public String input(Map<String,Object> map){
  106. Collection<Department> departments = departmentDao.getAll();
  107. map.put("departments", departments);
  108. Employee employee = new Employee();
  109. map.put("employ", employee);
  110. return"input";
  111. }
  112. /*
  113. * 查询所有的员工信息
  114. * */
  115. @RequestMapping(value="/emps",method=RequestMethod.GET)
  116. public String listAllEmployees(Map<String,Object> map){
  117.  
  118. Collection<Employee> allEmployees = employeeDao.getAll();
  119. map.put("employees", allEmployees);
  120.  
  121. return"list";
  122. }
  123.  
  124. }

在spring-mvc文件中配置自定义转换器

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:mvc="http://www.springframework.org/schema/mvc"
  6. xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
  7. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  8. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
  9. <!-- 配置自动扫描包 扫描com.ibigsea.springmvc 包下的类,后期会使用spring进行管理 -->
  10. <context:component-scan base-package="com.ibigsea.springmvc"/>
  11. <!-- 配置视图解析器 如返回helloworld
  12. 为 [/WEB-INF/pages/helloworld.jsp] -->
  13. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  14. <!-- 前缀 -->
  15. <property name="prefix" value="/WEB-INF/pages/"/>
  16. <!-- 后缀 -->
  17. <property name="suffix" value=".jsp"/>
  18. </bean>
  19.  
  20. <!--将自定义的转换器加入到框架中-->
  21. <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
  22. <property name="converters">
  23. <set>
  24. <bean class="com.ibigsea.springmvc.handler.EmployeeConverts"/>
  25. </set>
  26. </property>
  27. </bean>
  28.  
  29. <!-- 配置运行可以访问静态资源文化 -->
  30. <mvc:default-servlet-handler/>
  31. <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
  32.  
  33. </beans>

上面的配置还可以写成下面的形式

  1. <!--将自定义的转换器加入到框架中-->
  2. <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
  3. <property name="converters">
  4. <set>
  5. <bean class="com.ibigsea.springmvc.handler.EmployeeConverts"/>
  6. </set>
  7. </property>
  8. </bean>

使用该配置既可以支持自定义的类型转换器,也支持springmvc自带的类型转换器@NumberFormat annotation @DateTimeFormat

访问自定义类型转换器

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2. <%
  3. String path = request.getContextPath();
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  5. %>
  6.  
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  8. <html>
  9. <head>
  10. <base href="<%=basePath%>">
  11.  
  12. <title>My JSP 'index.jsp' starting page</title>
  13. <meta http-equiv="pragma" content="no-cache">
  14. <meta http-equiv="cache-control" content="no-cache">
  15. <meta http-equiv="expires" content="0">
  16. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  17. <meta http-equiv="description" content="This is my page">
  18. <!--
  19. <link rel="stylesheet" type="text/css" href="styles.css">
  20. -->
  21. </head>
  22.  
  23. <body>
  24. <a href="emps">查询所有员工的信息</a> <br>
  25.  
  26. <!-- 输入这样的格式的一个文本框,输入自定义格式转换成employeeduix -->
  27. <!-- gg-gg@qq.com-0-105 姓名-邮件-性别-部门ID -->
  28. <form action="${pageContext.request.contextPath}/testConvertService">
  29. <input type="text" name="source" />
  30. <input type="submit" name="submit" />
  31. </form>
  32.  
  33. </body>
  34. </html>

整个项目的代码下载地址为:

https://pan.baidu.com/s/1xx-BeEh3Sxlakk3ux-6STw

Spring支持三种类型的转换器接口,实现任意一个转换器接口都可以作为自定义转换器注册ConversionServiceFactoryBean中:

-Converter<S,T>:将S类型的对象转为T类型对象

-ConverterFactory:将相同系列多个"同质"Converter封装在仪器,如果希望将一种类型的对象转换为一种类型及其子类的对象(例如将String转化为Number及Number的子类)

-GenericConverter:会根据源类对象与目标类对象所在的宿主类中的上下文信息进行类型转换。<mvc:annotation-driven conversion-service="conversionService"/>会将自定义的ConversionService注册到SpringMvc的上下文中去。

关于mvc:annotation-driven

<mvc:annotation-driven/>会自动注册ReuqestMappingHandlerMapping、ReuqestMappingHandlerHandler、ExceptionHanderExceptionResolver三个bean。还提供以下支持:

-支持使用ConversionService实例对表单参数进行类型转换

-支持使用@NumberFormat annotation @DateTimeFormat 注解完成数据类型的格式化

-支持使用@Valid注解对JavaBean实例进行JSR303验证

-支持使用@RequestBody 和@ResponseBody注解

37. 尚硅谷_佟刚_SpringMVC_InitBinder注解.avi

我们表单添加联系人的时候,不让联系人的属性自定绑定到对应的员工对象中,可以达到这样一个效果

或者:在使用SpringMVC的时候,经常会遇到表单中的日期字符串和JavaBean的Date类型的转换,而SpringMVC默认不支持这个格式的转换,所以需要手动配置,自定义数据的绑定才能解决这个问题。
在需要日期转换的Controller中使用SpringMVC的注解@initbinder和Spring自带的WebDateBinder类来操作。

 39. 尚硅谷_佟刚_SpringMVC_JSR303数据校验.avi

下载所需要的java包为

我们在添加员工页面对姓名和邮件地址进行校验,添加上对应的注解

接下来修改员工类

  1. package com.ibigsea.springmvc.model;
  2.  
  3. import javax.validation.constraints.NotNull;
  4.  
  5. import org.hibernate.validator.constraints.Email;
  6.  
  7. public class Employee {
  8.  
  9. private Integer id;
  10. @NotNull
  11. private String name;
  12. @Email
  13. private String email;
  14. private int sex;
  15.  
  16. private Department department;
  17.  
  18. public Employee(Integer id, String name, String email, int sex,
  19. Department department) {
  20. super();
  21. this.id = id;
  22. this.name = name;
  23. this.email = email;
  24. this.sex = sex;
  25. this.department = department;
  26. }
  27.  
  28. public Employee() {
  29. super();
  30. }
  31.  
  32. public Integer getId() {
  33. return id;
  34. }
  35.  
  36. public void setId(Integer id) {
  37. this.id = id;
  38. }
  39.  
  40. public String getName() {
  41. return name;
  42. }
  43.  
  44. public void setName(String name) {
  45. this.name = name;
  46. }
  47.  
  48. public String getEmail() {
  49. return email;
  50. }
  51.  
  52. public void setEmail(String email) {
  53. this.email = email;
  54. }
  55.  
  56. public int getSex() {
  57. return sex;
  58. }
  59.  
  60. public void setSex(int sex) {
  61. this.sex = sex;
  62. }
  63.  
  64. public Department getDepartment() {
  65. return department;
  66. }
  67.  
  68. public void setDepartment(Department department) {
  69. this.department = department;
  70. }
  71.  
  72. @Override
  73. public String toString() {
  74. return "Employee [id=" + id + ", name=" + name + ", email=" + email
  75. + ", sex=" + sex + ", department=" + department + "]";
  76. }
  77.  
  78. }

接下来修改handler处理器文件

  1. package com.ibigsea.springmvc.handler;
  2.  
  3. import java.util.Collection;
  4. import java.util.List;
  5. import java.util.Map;
  6.  
  7. import javax.validation.Valid;
  8.  
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.stereotype.Controller;
  11. import org.springframework.validation.BindingResult;
  12. import org.springframework.validation.ObjectError;
  13. import org.springframework.web.bind.annotation.ModelAttribute;
  14. import org.springframework.web.bind.annotation.PathVariable;
  15. import org.springframework.web.bind.annotation.RequestMapping;
  16. import org.springframework.web.bind.annotation.RequestMethod;
  17. import org.springframework.web.bind.annotation.RequestParam;
  18.  
  19. import com.ibigsea.springmvc.dao.DepartmentDao;
  20. import com.ibigsea.springmvc.dao.EmployeeDao;
  21. import com.ibigsea.springmvc.model.Department;
  22. import com.ibigsea.springmvc.model.Employee;
  23.  
  24. @Controller
  25. public class EmployeeHandler {
  26.  
  27. @Autowired
  28. private EmployeeDao employeeDao;
  29. @Autowired
  30. private DepartmentDao departmentDao;
  31.  
  32. /***
  33. * 自定义数据类型转换器,将特定格式的字符串转换成员工对象保存到数据库中
  34. * @RequestParam("source")输入参数的名字是source格式的文本对象,转换之后成为了emloyee对象
  35. * */
  36. @RequestMapping(value="/testConvertService")
  37. public String testConvertService(@RequestParam("source") Employee employee){
  38. employeeDao.save(employee);
  39. return "redirect:/emps";
  40. }
  41.  
  42. /**
  43. * 点击修改联系人,跳转到修改联系人页面,显示需要修改的联系人信息,其中联系人的名字不能被修改
  44. * */
  45. @RequestMapping(value="/edit/{id}",method=RequestMethod.GET)
  46. public String input(@PathVariable("id") Integer id,Map<String,Object> map){
  47.  
  48. Collection<Department> departments = departmentDao.getAll();
  49. map.put("departments", departments);
  50. //通过id查找需要修改的联系人
  51. Employee employee = employeeDao.getEmpById(id);
  52. map.put("employ", employee);
  53. return"input";
  54. }
  55.  
  56. /**
  57. * 这里需要在执行修改联系人在保存的时候先查询出来,否则自己保存
  58. * m is :Employee [id=1002, name=null, email=BB@ibigsea.com, sex=0, department=Department [id=101, name=null]]
  59. * 会存在联系人名字为空的情况,修改修改联系人页面没有传递联系人姓名的属性值
  60. * */
  61. @ModelAttribute
  62. public void getEmployee(@RequestParam(value="id",required = false) Integer id ,Map<String,Object> map){
  63. if(id != null){
  64. Employee employee = employeeDao.getEmpById(id);
  65. //map.put("employ", employee)名字和@ModelAttribute("employ")中的一一对应
  66. map.put("employ", employee);
  67. }
  68. }
  69.  
  70. /***
  71. * 保存修改联系人页面,修改的联系人,对应的action是addEmp
  72. * <form:form action="addEmp" method="post" modelAttribute="employ" >
  73. * 对应的访问方式是对应的访问方式是PUT方式
  74. * <input type="hidden" name="_method" value="PUT"/>
  75. *
  76. * 注意点2:
  77. * 这里在修改修改联系人的时候,需要被修改联系人的name属性不能被修改
  78. * m is :Employee [id=1002, name=null, email=BB@ibigsea.com, sex=0, department=Department [id=101, name=null]]
  79. * */
  80. @RequestMapping(value="/addEmp", method=RequestMethod.PUT)
  81. public String update(@ModelAttribute("employ")Employee em){
  82. System.out.println("em is :"+em.toString());
  83. employeeDao.save(em);
  84. return "redirect:/emps";
  85. }
  86.  
  87. /*
  88. * 执行添加联系人操作,重定向到显示所有联系人的页面
  89. * */
  90. @RequestMapping(value="/delete/{id}", method=RequestMethod.DELETE)
  91. public String deletEmp(@PathVariable("id") Integer id ){
  92. employeeDao.delEmpById(id);
  93. //employeeDao.save(employ);
  94. return "redirect:/emps";
  95. }
  96.  
  97. /*
  98. * 执行添加联系人操作,重定向到显示所有联系人的页面
  99. * */
  100. @RequestMapping(value="/addEmp", method=RequestMethod.POST)
  101. public String addEmp(@Valid Employee em,BindingResult bindingResult){
  102. //参数绑定和转换错误的信息会封装到bindingResult对象中
  103. if(bindingResult != null){
  104. List<ObjectError> allErrors = bindingResult.getAllErrors();
  105. for(int i= 0; i< bindingResult.getErrorCount();i++){
  106. System.out.println("error is:"+allErrors.get(i).toString());
  107. }
  108. }
  109. employeeDao.save(em);
  110. return "redirect:/emps";
  111. }
  112.  
  113. /**
  114. * 点击添加联系人,跳转到添加联系人页面
  115. * */
  116. @RequestMapping(value="/emp",method=RequestMethod.GET)
  117. public String input(Map<String,Object> map){
  118. Collection<Department> departments = departmentDao.getAll();
  119. map.put("departments", departments);
  120. Employee employee = new Employee();
  121. map.put("employ", employee);
  122. return"input";
  123. }
  124. /*
  125. * 查询所有的员工信息
  126. * */
  127. @RequestMapping(value="/emps",method=RequestMethod.GET)
  128. public String listAllEmployees(Map<String,Object> map){
  129.  
  130. Collection<Employee> allEmployees = employeeDao.getAll();
  131. map.put("employees", allEmployees);
  132.  
  133. return"list";
  134. }
  135.  
  136. }

对需要检验的类使用@Valid进行修饰,并且如果参数转化错误,错误的信息封装到参数bingResult对象中,这里只是将错误信息打印出来

如果页面上出入的不是一个合法的邮箱地址,打印信息为

error is:Field error in object 'employee' on field 'email': rejected value [w]; codes [Email.employee.email,Email.email,Email.java.lang.String,Email]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [employee.email,email]; arguments []; default message [email],[Ljavax.validation.constraints.Pattern$Flag;@617e4b3f,.*]; default message [不是一个合法的电子邮件地址]

代码下载地址为:

https://pan.baidu.com/s/1wTNmjmQWvgExkL4qdPvkxA

需要强调的是:

BindingResult参数,必须紧跟在@Valid参数之后。

备注:这里一个@Valid的参数后必须紧挨着一个BindingResult 参数,否则spring会在校验不通过时直接抛出异常

40. 尚硅谷_佟刚_SpringMVC_错误消息的显示及国际化.avi

上面当参数输入错误的时候,我们只是将错误信息打印出来,现在我们要让错误信息在jsp页面上显示出来如何实现了

我们来看handle的处理

  1. /*
  2. * 执行添加联系人操作,重定向到显示所有联系人的页面
  3. * */
  4. @RequestMapping(value="/addEmp", method=RequestMethod.POST)
  5. public String addEmp(@Valid Employee em,BindingResult bindingResult
  6. ,Map<String,Object>map){
  7. //参数绑定和转换错误的信息会封装到bindingResult对象中
  8. if(bindingResult != null){
  9. List<ObjectError> allErrors = bindingResult.getAllErrors();
  10. for(int i= 0; i< bindingResult.getErrorCount();i++){
  11. System.out.println("error is:"+allErrors.get(i).toString());
  12. }
  13. //重新返回到添加联系人页面将错误信息显示出来,需要将部门信息传递过去
  14. Collection<Department> departments = departmentDao.getAll();
  15. map.put("departments", departments);
  16. map.put("employ", em);
  17. return "input";
  18.  
  19. }
  20. employeeDao.save(em);
  21. return "redirect:/emps";
  22. }

在input.jsp中如果显示错误信息可以使用下面的两种方式

  1. <%@page import="java.util.Map"%>
  2. <%@page import="java.util.HashMap"%>
  3. <%@ page language="java" contentType="text/html; charset=UTF-8"
  4. pageEncoding="UTF-8"%>
  5. <%@taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
  6. <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  8. <html>
  9. <head>
  10. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  11. <title>添加员工信息</title>
  12. </head>
  13. <body>
  14. <form:errors path="email" cssClass="errorMsg"></form:errors>
  15. <!-- 这里是使用springmvc的form标签
  16. private Integer id;
  17. private String name;
  18. private String email;
  19. private int sex;
  20. private Department department;
  21. -->
  22. <form:form action="${pageContext.request.contextPath}/addEmp" method="post" modelAttribute="employ" >
  23. <!-- 判断id的值是否存在,如果存在就是修改联系人,不显示id标签 -->
  24. <!-- 判断id的值是否存在,如果存在就是修改联系人,联系人的name属性不能被修改 -->
  25.  
  26. <c:if test="${ employ.id == null}">
  27. id:<form:input path="id"/><br>
  28. <br>
  29. 姓名:<form:input path="name"/>
  30. <br>
  31. </c:if>
  32.  
  33. <!-- 不等于null,需要将联系人id的值重新传递到handle进行处理
  34. 对象中存在id属性,可以直接传递,并且需要将表单的post请求转化成put请求。我们需要传递一个_method属性,对应的value值是PUT传递到handle中-->
  35. <c:if test="${ employ.id != null}">
  36. <form:hidden path="id"/>
  37. <input type="hidden" name="_method" value="PUT"/>
  38. </c:if>
  39.  
  40. 邮箱:<form:input path="email"/>
  41. <!-- 使用 <form:errors path="email"></form:errors>显示邮箱对应的错误信息-->
  42. <span style="font-family:SimSun;font-size:24px;"><form:errors path="email"></form:errors></span>
  43. <br>
  44. <%
  45. Map<String,String> genders = new HashMap();
  46. genders.put("1", "男");
  47. genders.put("0", "女");
  48. request.setAttribute("sexMap",genders);
  49. %>
  50. 性别:<form:radiobuttons path="sex" items="${sexMap }"/>
  51. <br>
  52. department: <form:select path="department.id" itemLabel="name"
  53. items="${departments}" itemValue="id"></form:select>
  54. <br>
  55. <input type="submit" value="submit"/>
  56. </form:form>
  57. </body>
  58. </html>

 如果显示全部的错误信息

<form:errors path="*"></form:errors>

  1. 如果要显示自定义的错误信息,可以采用下面的方式
    二.错误消息的国际化

1.配置国际化资源文件i18n.properties

第一个参数是jsr303对于的标签,对二个是@Valide修饰对象的值,如果对象没有使用@modelAttrute修饰,就是类名第一个字母小写,第三个是对象对应的属性

3..在spring-mvc.xml中配置ResourceBundleMessageSource 对应国际化的资源文件

  1. <!-- 配置国际资源化文件 -->
  2. <bean name="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
  3. <property name="basename" value="i18n"></property>
  4. </bean>

SpringMVC 学习笔记(三)数据的校验的更多相关文章

  1. SpringMVC学习笔记(三)

    一.SpringMVC使用注解完成 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于SpringMVC的配置 <!--configure the setti ...

  2. SpringMVC学习笔记:数据的接收与返回

    SpringMVC的定义:Spring Web MVC is the original web framework built on the Servlet API and included in t ...

  3. springMVC学习笔记三

    十三.springMVC和spring集成 配置文件,spring的配置路径applicationContext.xml 在默认的web-inf下面 strut的配置文件默认在src下面 用了什么框架 ...

  4. SpringMVC学习笔记三:拦截器

    一:拦截器工作原理 类比Struts2的拦截器,通过拦截器可以实现在调用controller的方法前.后进行一些操作. 二:拦截器实现 1:实现拦截器类 实现HandlerInterceptor 接口 ...

  5. SpringMVC学习笔记三:Controller的返回值

    springMVC的返回值有ModelAndView,String,void,Object类型 项目目录树: 该项目是在前面项目的基础上修改的,这里的pom.xml文件需要加入使用到的包,应为@Res ...

  6. SpringMVC学习笔记三 整合jdbc和事务

    spring整合JDBC spring提供了很多模板整合Dao技术,用于简化编程. 引入相关jar包 spring中提供了一个可以操作数据库的对象,JDBCTemplate(JDBC模板对象).对象封 ...

  7. springmvc学习笔记三:整合JDBC,简单案例==数据库事务配置(切面)

    package cn.itcast.bean; import org.springframework.jdbc.core.PreparedStatementSetter; public class U ...

  8. springmvc学习笔记(18)-json数据交互

    springmvc学习笔记(18)-json数据交互 标签: springmvc springmvc学习笔记18-json数据交互 springmvc进行json交互 环境准备 加入json转换的依赖 ...

  9. SpringMVC学习笔记之二(SpringMVC高级参数绑定)

    一.高级参数绑定 1.1 绑定数组 需求:在商品列表页面选中多个商品,然后删除. 需求分析:功能要求商品列表页面中的每个商品前有一个checkbok,选中多个商品后点击删除按钮把商品id传递给Cont ...

随机推荐

  1. python九九乘法表程序代码

    按照c语言的思路来考虑python的,方法很简单,直接运用双重循环即可,本代码为了代码量少采用的是while嵌套双循环. 取两个随机变量 (1)i和j都从1开始(因为表中最小数值为1) (2)i控制第 ...

  2. STM32串口DMA接收数据错位——暴力解决方法

    背景:两片STM32通过串口通信,为了减小CPU负担,采用DMA进行通信,发送端为STM32F103C8T6,接收端为STM32F407VET6.在调试的过程中发现,一直出现数据错位的问题,接收端尝试 ...

  3. 关于thisState的那些事

    1.state的定义 状态(state) 和 属性(props) 类似,都是一个组件所需要的一些数据集合,但是它是私有的,并且由组件本身完全控制,可以认为它是组件的“私有属性(或者是局部属性)”. 2 ...

  4. 第十届蓝桥杯JavaC组省赛真题

    试题 A: 求和 本题总分:5 分 [问题描述] 小明对数位中含有 2.0.1.9 的数字很感兴趣,在 1 到 40 中这样的数包 括 1.2.9.10 至 32.39 和 40,共 28 个,他们的 ...

  5. Java实现 蓝桥杯VIP 算法提高 去注释

    算法提高 去注释 时间限制:1.0s 内存限制:256.0MB 去注释 问题 给你一段C++代码,将其中的注释去除后输出剩余的代码. 注释共有两种形式: 1. 行注视:以//开头,一直作用到行尾为止. ...

  6. java实现平面4点最小距离

    已知平面上若干个点的坐标. 需要求出在所有的组合中,4个点间平均距离的最小值(四舍五入,保留2位小数). 比如有4个点:a,b,c,d, 则平均距离是指:ab, ac, ad, bc, bd, cd ...

  7. TZOJ Find the Spy

    描述 Whoooa! There is a spy in Marjar University. All we know is that the spy has a special ID card. P ...

  8. Python 图像处理 OpenCV (6):图像的阈值处理

    前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...

  9. 洛谷P1012 拼数 【题解】

    **原题链接** 题目描述 设有n个正整数(n ≤ 20),将它们联接成一排,组成一个最大的多位整数. 例如:n=3时,3个整数13,312,343联接成的最大整数为:34331213 又如:n=4时 ...

  10. HTML5 3D 粒子波浪动画特效DEMO演示

    需要thress.js插件:     http://github.com/mrdoob/three.js // three.js - http://github.com/mrdoob/three.js ...