00:00
再来看一下我们这个程序,我来点一个新增。我们注意到目前的字段呢,有last name email,真的,还有department,现在我有这样的一个需求,加一个字段。生日。我加一下大家看看。B bos form input。Boss好了,加好加好之后呢,我在目标实体类里边应该也加上对应的属性。这样的话,这个表单才能够显示对吧,Date类型的boss。G settle。重写兔方法。
01:03
保存。我来问大家。我加完那个boss之后,我在实际开发当中有哪些需要注意的呢?有需要注意的吗?有没有想想?第一个问题。表单输入的一定是一个字符串,对吧。而目标实体类这个属性类型是一个。Date类型,这就涉及到由字符串到date类型之间数据类型转换的问题,第一个问题,第二个问题,我们输入这个boss的时候,就是这个生日,这个日期是吧?什么格式都可以输入吗?你得指定格式吧,所以说还有一个数据类型格式化的问题。
02:02
第三个问题要说一个生日,那你说这个生日的话应该是啊,现在这个时刻,之前的一个时刻懂这个意思吧,现在呢,是2014年12月18号,你这个生日是二是2015年1月1号就不靠谱是吧,所以说还有一个问题是数据。校验的问题。好了,这三个问题呢,是我们开发的时候经常要遇到,而且我们还需要解决的问题,那现在我们就来说一下这三个问题,分别是数据转换、数据格式化以及数据校验。我们先来看一下数据绑定的流程。这块呢,有这样的一个流程,我们先大致上看一下,然后根据源码来说,然后我们再根据图来说,好吧,分为这样的三个步骤,第一个步骤VC会把request对象还有入参实例传给一个web data band factory实例。
03:12
然后来创建一个data b实例对象,这个data b是数据绑定器。data b会根据装配在spring mvc上下文的conversion service进行数据类型的转换跟格式化。实际上我们刚才我们在讨论这个问题的时候,啊啊,类型转换跟格式化往往是一起的吧,是吧,所以说这块spring VC也是用这个conversion service同时完成数据类型的转换跟格式化。然后呢,它会来调用外组件对那个属性进行合法性的校验,OK,如果我在这个类型转换格式化跟校验的过程中有错误的话,那个错误将放将放到班ing result这个对象里边,这就是我们整个这样的一个流程,我们根据源码呢来说一下。
04:11
大家说这个角码怎么看啊啊,这样展示这个bos啊,我先去掉。根据我们开发的情况,我们会长把这个bos适时的打开,好吧,好,现在呢,我想看一下。我这个数据是怎么绑定的,怎么看啊。数据绑定实际上不就是为我这个employee的对应属性赋值吗?于是我在31行加上一个断点。Debug走起,这个时候31行它就会停住,我就会看到整个数据绑定的过程。好的,我填充一个GGG g163.com。没有走。好,代码停住了,我们往前翻。
05:05
哎,我们注意到有这样的一行代码。这行代码呢,我们在前边,实际上我们研究过,还记得吧,这里面我们看到106行。哎,它会创建一个data班对象传入的是request目标,目标类型的参数。目标方法的参数employee对象,还有那个属性名,属性名我们没有加那个model的方法修饰对吧?所以说这个属性名是类名,第一个字母小写,前面我们讨论过,好的,我们看108行进行。数据的绑定,这不是吗?Band requests108行。好了。109行完成这个校验是吧,这就说明数据类型的转换跟格式化是在108行这个代码的调用过程中完成的,我们怎么样往下看这个代码呢?108行往后点的话,这样看起来会比较费劲。
06:12
我们怎么办呢?我们直接让这个代码先停住,停住了哈,我们到我们的这个variable,我们看一下我目前这个单才创建的吗,打开。我们注意到这个班ner里边就有一个conversion service,前面我们讲到conversion service是进行数据类型转换跟格式化的,你看这个,呃,Service这个类型叫default forming service,它不但可以进行数据类型的转换,还可以进行forming格式化,是吧?再往后翻,诶,有一个validators,目前我没有加任何的valid,就是用这个validator主件完成的数据的。校验。如果校验。
07:03
数据类型转换跟格式化发生错误的话,它将把这个错误信息放到我们的办result里边,看到了吧,这就是我们整个的一个流程。好的同学说,那我也没看着类型转换用的是这个cmo service啊,哎,Cmo service这块的话呢,我把这个东西给它复制出来,复制出来是是这个样子。是这个样子,这里面呢,我们来看我这个提交过程中有没有数据类型的转换,有一个吧。哪个呀,有一个真的。性别真在我们这个里边是一个int型,而从页面上传入的是一个string型,这里边的话呢,它将用到。String to number。Convert factory进行类型转换,于是呢,我把这个给它复制一下。
08:00
CTRLC过来,Ctrl shift t ctrl v。好的,进行类型转换,我们看一眼诶这三个方法。是吧,第一个是什么呀,第一个是叫get convert,它一定会来调这个方法吧,于是四十五行的话呢,我就我就给它加一个断点,于是我们再走走。好,再找,重新来一遍。回退提交诶。再走,我们看到呢,这个时候它会来调用我们这个,呃,String to convert factory进行数据类型的转换,好了代码往前翻。往前翻,我们看一看这个代码是不是从我打断点的那个代码往后走的对吧。往后一点儿。
09:04
再往后一点。往前找一下,哎,我们注意到。这一行看看108行吧,这个代码是从108行一步一步往下调的,看到了吗?所以说这个108行这一步,它将调用那个commercialversion service进行数据类型的转换,同样进行数据类型的格式化,就刚刚认证了我们前边说的这个流程。这个流程,这个图呢是这样,传入request,传入处理方法,入参对象在我们这里边是employee,用这两个搞到一个data b data b,根据conversion service进行数据类型的转换跟格式化,根据valid data组件进行数据的校验。如果在我们这个类型转换、格式化以及校验过程中发生错误的话,将把错误错误结果放到我们的班丁result里面,实际上在嗯播放的录参里面,我们可以传入Bing result,获取此类对应的对象,以得到错误结果。
10:10
好了,这就是整个的流程,然后呢,呃,我们断点要是打在这个位置的话,看一眼在哪。断点停的位置。往前翻哦在这儿好的,这个时候呢。我们看一下。我们找到我们的B,这个里面有几个属性,我特殊标识了一下,它们分别是conversion service。Validators,还有这个ing result,嗯,这块的话呢,这个图我也截出去了,大家需要注意这样的三个变量。好,这是刚才截那个图啊,这样的话呢,我们就把数据绑定的流程说清楚了,下面的话呢,我们来说一下如何。
11:02
写自定义的类型转换器已完成自定义的类型转换。
我来说两句