码迷,mamicode.com
首页 > 其他好文 > 详细

数据绑定流程分析

时间:2018-04-06 18:39:42      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:标签   []   direct   字符串   utf-8   ext   自定义类   style   property   

一:介绍

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不好用了,加了这个标签就可以了

  类型转换器的时候,需要装配自定义的类型转换器。

 

数据绑定流程分析

标签:标签   []   direct   字符串   utf-8   ext   自定义类   style   property   

原文地址:https://www.cnblogs.com/juncaoit/p/8728217.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!