00:00
那前面我们说了一下自定义类型参数封装的整个过程原理,比如在small MC的底层与我们的这个select model tribute method的processor这个我们参数处理器来进行封装,它里边的运行原理就是它在它的底层用了一个叫我们web data button数据绑定器,这个数据绑定器呢,会将我们请求里边的所有数据跟我们指定的扎B来进行一一绑定,如何绑定的是我,因为我们数据绑定器里边会有convertion service,就是类型转换服务,在这个类型转换服务里边呢,会注册了非常多的converts,默认呢124个,这些converts呢,能将我们string转成各种类型,那这样呢,将我们这个请求里边string类型的数据先转成我们,比如inte,再把我们这个inte最终的这个值赋制到我们这个jarb里边,最终完成我们jar be的数据跟我们请求的数据进行绑定,有说底层呢,是利用这些converts,比如我们的这些convert。
01:00
进行进行我们完成的,而我们如果单独说这个原理呢,好像很枯燥,也没有什么使用场景,感觉就是一个原理,但是呢,我们现在来给大家模拟一个场景,我们来深入理解一下,比如来举一个例子,还是来到我们的这个提交用户的这个服务,那提交这个用户服务呢,我们来提交宠物数据的时候,我们是利用几点属性,相当于触发了它底层我们这些属性封装的过程,那我呢,假设公司现在觉得这种提交呢太麻烦,我们自定义了一个协议,比如我们要提交宠物数据,那公司呢,自定义协议是这样子的,你宠物数据呢,也不用分批给我们提交一个name h,你直接给我这样name还是呢宠物,宠物的数据的Y6值,哎,我们公司呢,规定是这样,如果你的名字呢,你写在前边阿包,然后呢,如果你是你的这个年龄,你就用逗号分割,然后呢,年龄写在后边,比如三岁,这样呢,我们相当于使用逗号。我们将我。
02:00
我们的姓名跟年龄分割,但整个呢,这是一个整体字符串,我们提交上去作为pad属性的值,那如果我们是这样的封装行不行呢?我来重新来测试一下,我不使用几点属性了,因为几点属性呢,触发人家底层的渣兵几点属性封装规则,然后默认一切处理好,我先不几点属性,我自定义提交了一个数据,来看一下我们最终的效果回撤好还是来到我们的这个阿猫三,现在呢,我们将宠物信息相当于以逗号分割的方式把它提交上来,我点一个保存啊,大家就会收到一个错误,什么错误呢?他说我们在这绑定的异常啊,我们这个属性绑定期间出现了一个错误,什么错误它呢是在呃,Error,也就是说绑定我们person里边派这个属性的时候,它在注入我们的这个值,相当于阿猫三它在注入这个值的时候出现了问题,什么问题叫type missmach类型不匹配问题,怎么叫类型不匹配呢?相当于它是呢convert property。
03:00
将我们属性的值想把死转转成我们这个啊,自这个属我们的这个宠物这个属性它转不过来,转不过来的原因就是我们页面提交的这个派这个属性,这个属性呢,我们是一个哎,以字符串的方式给人家提交了一个阿猫逗号三,但是呢,我们提交给spring mvc以后,Spring mvc也不知道该如何将你的这个阿猫逗号三给你封装成这个啊宠物对象,那他也不知道,我们的规则就是以逗号分割,你把这两个值拆开,前面呢就是name,后边就是H,那他也不知道是这么个种规则,所以呢,我们就得应该告诉他这种规则,那怎么告诉,因为在底层呢,我们这个转换是利用convert water转换的,所以我们自定义一个convert water矩型,而我们想要自定义呢,又牵扯到我们对spring m VC的定制,Spring m VC的定制,我们现在呢,都用这种方式,就是给我们容器中放一个web MV。
04:01
Con菲ER,这个con飞ER呢,我们在这儿扩展的所有功能我们就能用,所以呢,我们在这个con菲ER里边,我们可以来看一下,在我们在这个con菲ER里边有一处功能,我们点进来有一处呢,叫and form matters,翻译过来叫添加一些格式化器,这些格式化器呢,哎,看我们这个方法注释,我们可以给我们整个呃,Spring mvc底层添加一些converts,像它类型转换器,以及一些forms格式化器,比如我们一些时间货币这些东西呢,不仅要类型转化,把string要转成我们这个日期,还牵扯到我们日期要格式化,因为你传的日期有可能是短横杠分割的,有可能也是斜线分格的,有可能还是逗号分格的等等,所以呢,我们现在呢,不牵扯到格式化,只牵扯到类型转换,我要把我们的这个阿猫逗号三转成我们真正的这个宠物类型,所以呢,我们就要添加一个自定义的类型转换器,好,我们就来我们重写一下and for matters。
05:01
在它的这个registergistry里边,它呢有一个方法叫and converter,能添加一个我们的这个converter点进来,我们的这个convert呢,相当于它是这么来声明的,Convert呢是有一个函数是接口,也就是说它的要转的原类型source type和我们的最终转过的类型目标类型,我那么相当于原类型是string,要把页面提交过来的string这个字符串转成我们的这个宠物类型,所以我们就来写一下它。那为了方便起见,我就直接拗一个convert,我也不用函数式的这种写法了,函数式写法大家呢,可能呃,看不懂的同学感觉有点歧义,好,我这相当于我是来卷转成什么派,相当于我呢,想要完成一个将我们页面提交的字符串转成我们这个宠物的功能,那我们接下来就把这个方法实现一下就行了。我们来添加这个实现的方法,就是方法这个convert,方法呢,那最终我们应该怎么写这个source,那就是页面提交过来的值,那提交过来的值很简单,按照我们系统的规则,我们公司规定提交过来的值是以逗号分割,前边呢是名字,后边呢是年龄,所以呢,我们就在这来做一个判断,If string u,我们利用spring加的工具类it empty,如果我们提交的这个字符串不等于空。
06:25
不等于空,不等于空呢,我们就给它返回一个,有一个宠物对象,然后我们相当于要把这个字符串映射成真正的宠物对象,而该怎么映射,我们就牵扯到了我们自定义的封装逻辑了。宠物对象放在这儿,自定义的封装逻辑怎么办?来我们宠物里边的,首先name名字呢是什么名字是我们原来的这个字符串逗号分割的结果,s.split好,我们以逗号分割,逗号分割那名字呢?那就是逗号分割前边的第一个是我们的名字,然后呢,第二个是我们的年龄,Set h,我们spli,我们应该是te.pass我们将我们的这个字符串转成一个inte split e,好,这是我们写的自定义类型转换,但如果你传过来的这个字符串都是空的,我就给你返回一个空。
07:22
好,我们现在呢,把它重新启动,启动起来,我们先来看能不能封装好,如果能,原理又是什么。好,断联打造,这我们原来呢会给我们报异常,好现在我们退回去,来重新阿猫三,我点一个保存,诶我们发现阿猫三已经上来了,没有任何问题,所以这就是利用了我们自定义的convert沃,那原理是什么呢?我就给这来打一个断点,给们自定义的打一个断,因为我们这个convert沃呢,最终会被添加进去,最终调用方法就会掉到这儿,好,我们现在以debug方式运行。
08:05
我们来看一下我们这个自定义的能不能生效。啊,我们先先把这个全部放行,不重新以对的方式运行。把这个set方法呢,我们去掉。好,来,重新save user,来发一个请求走。提交好来到我们的这个dispature do dispatch方法,好,执行我们目标方法,然后呢,执行目标方法,然后呢,确定我们这个参数值放行,然后呢,确定参数值step into进来,然后呢,先来得到所有的解析器,那肯定就得到了,我也就不进去了,好,我们就直接给它return result,放行吧。好,我来放行,放行以后呢,接下来我们拿到这个参数解析器来解析参数,解析参数来step into进来,我们来看它怎么解析参数,首先拿到参数解析器,我们就给它拿到,拿到以后呢,接下来在这B,它利用这个web b,大家注意啊,现在的这个B有什么不同,Convert service里边,原来呃,Converts我们来看啊,原来有124个,现在有125个,125个原因是因为我们添加了一个我们自个儿的死准转成我们宠物的,我们来看有没有死转变宠物的,我们自己的在哪呢?
09:31
肯定是有我们自己的string变宠物的,呃,我们来找一下啊,String变宠物的,String变宠物的,这是string变property。String变宠物的,这是string变对象的,String变集合的,还有我们这个实在找不到就算了啊,这个是string变这个时间的,String变long的,String变big个DEC啊,我们来看一下啊,有没有我们的,我们自己填的那个跑哪去了?
10:00
我们自己填的那个跑哪去了?好,我们自己填的那个不见了就不见了,这个太多了,我们没法找到,但是呢,我们现在明确的能看到,现在有125个,比原来多了一个,那接下来呢,我们接下来如果我们要do棒,那肯定就是要牵扯到数据类型转换,所以呢我就直接放行,放行呢接下来好,这是啊,这是来转我们这个number,我们先不管了,好,现在终于来到我们自定义的这个方法,我直接一放行,放行到我们的这个里边,大家看我们得到的是阿猫三,这是我们页面提交的数据,现在呢,用我们自定义的封装逻辑,然后呢,先来判断不为空,然后我们拗了一个对象,然后接下来进行字符串分割,然后呢,把分割到的第一个值放到我们new的对象name里边,把分割到第二个值放到H里边,然后我们将这个重复返回,所以大家看我们的这个convert相当利用到了我们自定义的,哎,我们这个是web conf,我们这个自定义内部类里边的这个convert来,我们用到这个convert,然后呢,将这个值。
11:03
转换过来了,转换过来以后呢,我们就绑定结束了。可以来看一下啊,最终这个值就转换完成value to a play,大家看我们最终呢,相当于把我们这个宠物对象返回了,对吧,这就是把一个字符串转成成功对象,然后呢,我们在这一完成以后,最终那我们就所有的值全部绑定结束。我们直接放行吧,好,我们这个二参数就确定好了,参数怎么就确定好了呢?那就在这儿,我们呢,原生的这些属性,这些属性人家利用啊,String转应配置的,String转日期的,人家转了,只不过这个特殊属性是利用我们特殊的convert沃特,利用逗号分割把它们转过来的,这就是我们自定义convert沃,我们最终的使用整个参数都转完了以后,才来到我们真正执行目标方法,利用反射把我们这些参数,诶大家来进行引work来执行就行了,好,这一块我们就来放心,我们这次请求就结束了,这就是我们说的自定义卡。
我来说两句