一:介绍
1.介绍
Spring MVC框架将ServletRequest对象及目标方法的入参实例传递给WebDataBinderFactory实例,以创建DataBinder实例对象。
DataBinder调用装配在SpringMVC上下文中的ConversionService组件,进行数据类型转换,数据格式化工作。将servlet的请求信息填充到入参对象中。
调用Validator组件对已经绑定的请求消息的入参对象进行数据合法性校验,并最终生成数据绑定结果BingData对象。
springmvc抽取BindingResult中的入参对象和验证错误对象,将他们赋值处理方法的响应入参。
2.数据绑定流程
二:自定义类型转换器
1.需求
将一个字符串转为Employee对象
2.input.jsp页面
主要是上面的form表单
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 <%@ page import="java.util.Map"%> 5 <%@ page import="java.util.HashMap"%> 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>Insert title here</title> 12 </head> 13 <body> 14 <form action="testConversionServiceConver" method="POST"> 15 <!-- lastname-email-gender-department.id --> 16 <!-- GG-gg@123.com-0-105 --> 17 Employee:<input type="text" name="employee"/> 18 <input type="submit" values="Submit"> 19 </form> 20 <br><br> 21 <br><br><br><br><br><br> 22 23 24 <!-- id lastName email gender department --> 25 <!-- modelAttribute默认的bean是command,需要改成对应的bean --> 26 <form:form action="${pageContext.request.contextPath}/emp" method="POST" modelAttribute="employee"> 27 <!-- lastName在修改的时候,不能被显示 --> 28 <c:if test="${employee.id == null}"> 29 LastName:<form:input path="lastName"/><br> 30 </c:if> 31 <c:if test="${employee.id != null}"> 32 <form:hidden path="id"/> 33 <!-- 不能使用form标签,因为modelAttribute对应的bean中没有_method这个属性,只能使用input --> 34 <input type="hidden" name="_method" value="PUT"/> 35 </c:if> 36 37 Email:<form:input path="email"/><br> 38 <% 39 Map<String,String> genders=new HashMap(); 40 genders.put("1", "Male"); 41 genders.put("0", "Female"); 42 request.setAttribute("genders", genders); 43 %> 44 Gender:<form:radiobuttons path="gender" items="${genders}"/><br> 45 Department:<form:select path="department.id" 46 items="${department}" itemLabel="departmentName" itemValue="id"></form:select><br> 47 <input type="submit" values="Submit"> 48 </form:form> 49 </body> 50 </html>
3.自定义转换器
这个bean加了一个注解,就不需要到配置文件中配置bean了。
1 package com.spring.it.converter; 2 3 import org.springframework.core.convert.converter.Converter; 4 import org.springframework.stereotype.Component; 5 6 import com.spring.it.enties.Department; 7 import com.spring.it.enties.Employee; 8 @Component 9 public class EmployeeConverter implements Converter<String,Employee>{ 10 11 @Override 12 public Employee convert(String source) { 13 //<!-- lastname-email-gender-department.id --> 14 if(source!=null) { 15 String[] vals=source.split("-"); 16 if(vals!=null&&vals.length==4) { 17 String lastName=vals[0]; 18 String email=vals[1]; 19 Integer gender=Integer.parseInt(vals[2]); 20 Department department=new Department(); 21 department.setId(Integer.parseInt(vals[3])); 22 Employee employee=new Employee(null, lastName, email, gender, department); 23 System.out.println("*converter*"); 24 return employee; 25 } 26 } 27 return null; 28 } 29 }
4.请求处理器
主要是保存数据,传进来的是字符串,但是保存的是Employee对象。
所以,这个需要使用转换器,这个转换器写好了,然后就需要进行在配置文件中进行注册。
1 package com.spring.it.converter; 2 3 import org.springframework.beans.factory.annotation.Autowired; 4 import org.springframework.stereotype.Controller; 5 import org.springframework.web.bind.annotation.RequestMapping; 6 import org.springframework.web.bind.annotation.RequestParam; 7 8 import com.spring.it.dao.EmployeeDao; 9 import com.spring.it.enties.Employee; 10 11 @Controller 12 public class BinderTest { 13 @Autowired 14 private EmployeeDao employeeDao; 15 @RequestMapping("/testConversionServiceConver") 16 public String testConverter(@RequestParam("employee") Employee employee) { 17 employeeDao.save(employee); 18 return "redirect:/emps"; 19 } 20 }
5.配置文件
主要有两个部分要添加。
转换器,annotation-driven。
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/beans 7 http://www.springframework.org/schema/beans/spring-beans.xsd 8 http://www.springframework.org/schema/context 9 http://www.springframework.org/schema/context/spring-context-4.0.xsd 10 http://www.springframework.org/schema/mvc 11 http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"> 12 <!-- 配置自定义扫描的包 --> 13 <context:component-scan base-package="com.spring.it" ></context:component-scan> 14 15 <!-- 配置视图解析器 --> 16 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 17 <property name="prefix" value="/WEB-INF/views/" /> 18 <property name="suffix" value=".jsp" /> 19 </bean> 20 21 <!-- 转换器 --> 22 <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> 23 <property name="converters"> 24 <set> 25 <ref bean="employeeConverter"/> 26 </set> 27 </property> 28 </bean> 29 <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven> 30 31 <mvc:default-servlet-handler/> 32 <mvc:annotation-driven ignore-default-model-on-redirect="true"></mvc:annotation-driven> 33 </beans>
6.效果
三:mvc:annotation-driven标签
1.使用的场景
配置直接转发的页面的时候,但是配置的requestmapping不好用了,加了这个标签就可以了。
配置静态资源的时候,但是配置的requestmapping不好用了,加了这个标签就可以了
类型转换器的时候,需要装配自定义的类型转换器。