• <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學習筆記14-----數據綁定與自定義類型轉換器

    標簽: SpringMVC數據綁定  Converter  自定義轉換器  dataBinder  bindingdata

    一、問題分析

           在之前的增刪改查中,數據都是通過表單傳向方法然后轉化成相應的數據類型!那么如果我們在java bean中再添加一個日期屬性birth時,就會有三個問題:

    1.如何將表單中的字符串格式轉向日期格式:數據類型轉換

    2.表單中輸入的字符串格式應該是怎么樣的:數據類型格式化

    3.這是個生日屬性,既然是生日屬性就應該是當前日期的前面的時間,不能填未來的時間,如何檢驗:數據校驗 

    二、數據綁定流程

    如尚硅谷視頻所說:

    1.SpringMVC會把request目標方法的入參傳遞給WebDataBinderFactory實例,以創建DataBinder實例對象

    2.DataBinder調用SpringMVC上下文中的ConversionService組件將request中的數據轉換為相應的類型,然后填充到目標方法的入參中。(類型轉換和格式化往往是一起的!)

    3.調用Validator對已經綁定了的請求消息的入參進行合法性的校驗,并將最終生成數據綁定結果BindingData對象!

    4.SpringMVC抽取BindingResult中的校驗錯誤信息和入參對象,將他們賦給處理方法中相應的入參!

    至此,SpringMVC就將我們上面的三個問題都解決了!

    三、源碼分析

    我們一直在寫的那個程序學生類有一個數據類型為整型類型的,即我們可以查看這個由字符串轉整型的過程:

    因為在最終SpringMVC會調用Student類中的setAge方法,所以我們在這里打個斷點:

    調試,新增學生信息,填寫表單,點擊添加,停在這個setter語句!我們在函數棧中翻到這個點擊:

    可以看出來這個類完成了表單中數據綁定校驗等操作,第一行調用WebDataBinderFactory這個工廠類創建了一個WebDataBinder對象,然后第三行進行的是數據綁定,第四行完成校驗。

    再看Variables,點擊屬性列表中的Binder屬性中的:

    這個ConversionService是個DefaultFormattingConversionService對象,其可以完成數據的綁定和格式化工作!

    這個組件中有個對象屬性里面包含一個有97個轉換器的對象的LinkHashMap(age中用的轉換器是StringToNumberconverter),SpringMVC就是在這里找到相應的對象并進行數據性轉換的!

    出來往后翻可以看到一個size為0的validator。我們現在還沒有加任何校驗!

    如果加了校驗的話,校驗過程中發生錯誤,就會將錯誤信息放進bindingResult中。

    這就是一個數據綁定的流程!

    四、自定義一個類型轉換器

    SpringMVC內建了很多類型轉換器,可以完成大部分的轉換工作!

    但如果我們遇到特殊情況,自定義轉換器還是可以了解下的!

    視圖層

    在input.jsp上加上表單:

    <br><br><br><br>
    <!--the basic format is "name-gender-age-school.id", such as "Tom-female/male-22-4"-->
    <h3>字符串添加學生信息</h3>
    <form action="/testDIYConversionService" method="post">
        信息:<input type="text" name="student"/>
        <input type="submit" value="添加信息">
    </form>

    控制層

    新建一個TestConversionServiceHandler類:

    @Controller
    public class TestConversionServiceHandler {
    
        @Autowired
        private StudentDao studentDao;
    
        @RequestMapping(value = "/testDIYConversionService", method = RequestMethod.POST)
        public String testDIYConversionService(Student student){
            System.out.println(student);
            studentDao.saveStudent(student);
            return "redirect:stus";
        }
    
    }

    如果只是這樣的話,字符串類型和Student類型肯定會報錯。

    我們現在只需實現一個Converter<S,T>接口將String信息轉化為一個student對象:

    Converter

    public class StudentConverter implements Converter<String, Student> {
    
        @Autowired
        private SchoolDao schoolDao;
    
        @Override
        public Student convert(String s) {
            Student student = new Student();
            String parameters[] = s.split("-");
            if (parameters.length == 4) {
                String name = parameters[0];
                boolean gender = "female".equals(parameters[1]);
                int age = Integer.parseInt(parameters[2]);
                int schoolId = Integer.parseInt(parameters[3]);
                student = new Student(0, name, gender, age, schoolDao.getSchoolById(schoolId));
                System.out.println(s + "--convert--" + student);
            }
            return student;
        }
    }
    

    springmvc.xml文件的配置

    <!--config ConverterService bean-->
        <bean id="studentConverter" class="cn.jxufe.Conversion.StudentConverter"> </bean>
    
        <!--config ConversionServiceFactoryBean-->
        <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
            <property name="converters">
                <set>
                    <ref bean="studentConverter"/>
                </set>
            </property>
        </bean>

    可以看出來這個converters是個set對象。

    然后我們在之前寫的mvc:annotation-driven配置使得其能自動注冊ConversionServiceFactoryBean對象。

    <mvc:annotation-driven conversion-service="conversionService"> </mvc:annotation-driven>

    注意: 這個配置寫一個就行了,之前因為重定向要用到,獲取靜態文件也要用到,所以我寫了兩個,然后寫自定義轉換器時只在一個mvc:annotation-driven配置了conversion-service,然后運行就一直沒有用,String不轉換為student,一直報錯!

    mvc:annotation-driven的功能很多,教學視頻的進度還沒能覆蓋其全部作用(比如其對于json的作用),故后面再做詳細總結!

    把一個刪掉運行就成功了!

    版權聲明:本文為qq_38016931原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/qq_38016931/article/details/82052698

    智能推薦

    springMVC-自定義類型轉換器

     自定義類型轉換器: 背景:前端傳來一個字符串 2-zs-23,編寫自定義類型轉換器轉成一個學生對象 1編寫自定義類型轉化器(實現一個Converter接口)   2將實現 Converter接口的類納入到IOC容器中 3Springmvc配置   @Requestparam("name")是一個橋梁 public void test(@Reque...

    SpringMVC自定義類型轉換器

    在表單提交得的數據類型都是字符串類型的,但是后臺定義的是int類型的,數據還是可以封裝進去,SpringMVC默認是進行數據類型轉換。但是對于日期類型的數據進行轉換,就會出現錯誤。 這時我們就需要自定義進行數據封裝。就比如下面的類型轉換(日期的格式轉換) Controller類 使用對象進行數據封裝  執行的代碼: 對于輸入的2021-04-14默認的數據類型是無法轉換的,輸入2021/...

    數據流程綁定以及自定義類型轉換器

    一. 數據流程綁定分析 前端表單傳遞過來的數據為什么能夠自動的封裝成實體類的對象?為什么能夠進行自動的類型轉換? 數據綁定流程: ①:SpringMVC框架將ServletRequest對象及目標方法的入參實例傳遞給WebDataBinderFactory實例,以便創建DataBinder對象 ②:DataBinder調用裝配在SpringMVC上下文中的ConversionService組件進行...

    SpringMVC學習筆記07——自定義類型轉換器解決日期錯誤(ctrl+N搜索類)

    繼續沿用代碼。。 1. 修改User.java,修改代碼如下 2. 在index.jsp中添加如下代碼 3. 在HelloController.java``中添加如下代碼 4. 創建如下轉換器目錄 StringToDate.java 5. 在springmvc.xml文件中添加如下代碼 6. 啟動tomcat進行測試 瀏覽器 控制臺 注意這樣做后,以前的默認的輸入方式“1777/5/2...

    猜你喜歡

    SSM筆記-SpringMVC的自定義類型轉換器

    1、步驟: ①建立對應的bean和dao ②建立form表單 ③建立handler(①handler的參數需要更表單控件name值一樣 ②要用@RequestParam修飾方法的參數) ④建立converter類,且繼承org.springframework.core.convert.converter.Converter ⑤實現org.springframework.core.convert.c...

    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壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

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