• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • 數據流程綁定以及自定義類型轉換器

    標簽: SpringMVC

    一. 數據流程綁定分析

    前端表單傳遞過來的數據為什么能夠自動的封裝成實體類的對象?為什么能夠進行自動的類型轉換?

    數據綁定流程:

    ①:SpringMVC框架將ServletRequest對象及目標方法的入參實例傳遞給WebDataBinderFactory實例,以便創建DataBinder對象

    ②:DataBinder調用裝配在SpringMVC上下文中的ConversionService組件進行數據類型轉換和數據類型格式化操作,將ServletRequest請求參數綁定到對應目標方法的入參對象中

    ③:調用Validator組件對已經綁定到了目標方法入參對象進行數據合法性的校驗,并最終形成數據綁定的結果到BindingData對象

    ④:SpringMVC將數據校驗、格式化、轉換的錯誤信息封裝到BindingResult對象中

    二. 自定義類型轉換器

    SpringMVC上下文中內建了很多的類型轉換器,可以完成絕大多數的Java類型的轉換工作。這些不是我們關注的目標,我們的目標是自定義類型轉換器。ConversionService是類型轉換核心的接口,可以利用ConversionServiceFactoryBean在SpringIOC容器中定義一個ConversionService,Spring將自動的識別IOC容器中的ConversionService,并在bean屬性配置及SpringMVC處理方法入參綁定等場合使用這個ConversionService進行數據轉換。所以可以通過ConversionServiceFactoryBean的converters屬性注冊自定義類型轉換器。

    Spring支持的類型轉換器:Spring中定義了三種類型轉換的接口,實現任意一個接口都可以作為自定義的類型轉換器,自定義的類型轉換器注冊到ConversionServiceFactoryBean中,類型轉換器就生效了,哪三種呢?

    • Converter : 表示將S類型轉換成T類型
    • ConverterFactory
    • GenericConverter

    范例:將字符串轉換成EMP對象 比如字符串“[email protected]

    ①:編寫頁面

    <form action="${pageContext.request.contextPath}/insertemp" method="post">
    		<input type="text" name="emp" value="[email protected]"><button>Submit</button>
    	</form>
    

    ②:編寫請求處理器的目標方法

    	/**
    
      	* 	新增
        * @return
            */
            @RequestMapping(value="insertemp",method=RequestMethod.POST)
            public String testConverter(@RequestParam("emp")Emp emp) {
    	this.empManagerSerivce.insertEmp(emp);
    	
    	return "redirect:/emps";
    }
    

    ③:編寫自定義的類型轉換器

    public class EmpConverter implements Converter<String, Emp> {
    @Override
    public Emp convert(String arg0) {
    	
    	Emp emp = new Emp();
    	//[email protected]
    	String properties[] = arg0.split("-");
    	emp.setEmpName(properties[0]);
    	emp.setEmpMail(properties[1]);
    	emp.setEmpGender(Integer.parseInt(properties[2]));
    	emp.setDeptId(Integer.parseInt(properties[3]));
    	return emp;
    }
    }
    

    ④:配置

      <!-- 
    	  mvc:annotation-driven : 是萬能的注解驅動
    	  	conversion-service : 配置SpringMVC上下文中中的類型轉換器
    
       		- 不配置:使用默認的
            - 配置:默認的+配置的
                 -->
                <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
    
    	  <bean id="empConverter" class="com.wanbangee.util.EmpConverter"></bean>
    	  <!-- 配置ConversionFactoryBean 的 converters 屬性 -->
    	  <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
    	  	<property name="converters">
    	  		<set>
    	  			<ref bean="empConverter"/>
    	  		</set>
    	  	</property>
    	  </bean>
     
    

    三. annotation-driven配置

    如果在Spring的配置文件中配置annotation-driven配置,SpringMVC的上下文中會自動的注冊RequestMappingHandlerMapping,RequestMappingHandlerAdpater,ExceptionHandlerExceptionResolver這個三個bean,另外的話還提供下列支持:

    • 支持使用ConversionService對參數進行類型轉換
    • 支持使用@NumberFormat,@DateFormat完成數據格式化
    • 支持使用@Valid注解對請求參數驚醒JSR303校驗
    • 支持使用@RequestBody和@ResponseBody注解
    版權聲明:本文為codeliang20原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/codeliang20/article/details/107368995

    智能推薦

    SpringMVC自定義類型轉換器

    問題引出 yyyy/MM/dd格式,轉換成功 yyyy-MM-dd格式,轉換失敗 解決方法 1.編寫自定義轉換器 2.在配置文件中配置自定義類型轉換器 再次運行結果...

    自定義類型轉換器-日期格式問題

    一、 格式錯誤 1、yyyy/MM/dd格式正常而yyyy-MM-dd格式出錯 提交后出錯 二、解決辦法:自定義類型轉換器 1. 自定義一個類,實現Converter<S,T>接口,有兩個泛型,S為String類型,T為要轉換后的類型,實例如下: 2.在主配置文件XXX.xml中注冊自定義轉換器 ConversionServiceFactoryBean源碼中的converters集合可...

    springMVC自定義類型轉換器

    springMVC自定義類型轉換器 1、問題描述 springMVC框架會對前端請求來的數據自動映射初始化,但是我們知道前端來的數據都是String類型的,當我們的數據不是String類型的時候,springMVC在很多情況下就無法做自動的映射初始化了。 舉例 用Date做一個簡單的例子,從前端傳來的數據時,如果字符串是xxxx/xx/xx格式的,springMVC可以進行自動轉換映射初始化成功的...

    自定義類型轉換器Converter

    實戰情況:假設我們采用REST風格編程,代碼中蘊藏這我們需要的數據,舉個例子,請求是這樣的 http://127.0.0.1:8081/test/converter?user=xl-pass123-23  但是呢,我們沒辦法直接用這個參數,里面有我們的姓名,密碼,年齡,如果我們直接用String 接這個參數再做處理顯的臃腫,我們可以采用自定義的類型轉換器Converter寫自己...

    Mybatis自定義類型轉換器Typehandler

    需求: 一個商戶,在登記的時候需要注冊它的經營范圍。比如1手機,2電腦,3相機,4平板,在界面上是一個復選框(checkbox)。 在數據庫保存的是用逗號分隔的字符串,例如“1,3,4”,而返回給程序的時候是整形數組List {1,3,4}。很顯然,mybatis默認提供的類型轉換器達不到這樣的要求,這種情況下,我們可以自定義mybatis的類型轉換器就可以實現自定義 Ja...

    猜你喜歡

    (SpringMVC)自定義類型轉換器

    文章目錄 一、問題引出 二、自定義類型轉換器 一、問題引出 可以看到這里輸入日期是字符串格式,但是封裝數據User 中需要的是 Date 類型,所以這就造成出錯 二、自定義類型轉換器 (1)定義一個類,實現 Converter 接口,該接口有兩個泛型。 (2)在 spring 配置文件中配置類型轉換器 spring 配置類型轉換器的機制是,將自定義的轉換器注冊到類型轉換服務中去 (3)運行結果:...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    精品国产乱码久久久久久蜜桃不卡