數據綁定流程分析
阿新 • • 發佈:2018-04-06
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不好用了,加了這個標簽就可以了
類型轉換器的時候,需要裝配自定義的類型轉換器。
數據綁定流程分析