1. 程式人生 > >數據綁定流程分析

數據綁定流程分析

attribute direct ive type 創建 com [] factor request

一:介紹

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 <!-- [email protected] --> 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不好用了,加了這個標簽就可以了

  類型轉換器的時候,需要裝配自定義的類型轉換器。

數據綁定流程分析