00:00
下一个话题。定义自己的转换器,为什么需要定制类型转换器呢?因为我们前面我们看到的都是字符串跟基本数据类型之间可以转换,那我要是字符串到一个引用类型呢?比方说一个字符串到一个date类型。To还会自动的完成这个转换吗?如果要是不能完成的话,需要怎么办呢?就需要我们自己来定义这个转换器。好了,我们先来看。这个效果我们自己写一个哈,S error。Field name birth生日。第二。自己来写一个label。好了。我在X里边。写上一个定的一个字段,应该是date类型,Date to date that。
01:06
定。一下out。加。好了,这个转换抓库还会自动完成吗?Force or?文本框呢?哦,写错了,可能error了是吧,应该叫。As text field。Name。Birth。来,发心来。写个12,我希望能过去哈,1990年12月。
02:07
12号12:12:12有一个。I can。没过去。1990年哦,这个格式。这样的格式是吧。要写成1990年横线的格式,好吧,那比方说。我希望那个格式啊,就是那个点的格式,有可能吧,那个肯定是没过去,这个能过去吗。啊,这个也没过去。过不去,就是说strong to不会自动的把一个。字符串转成date类型转换失败了,那我来显示一下这个,显示一下这个错误消息吧。As f error。Film name。Worse。保存再看说这个转换失败了,我在这块的话呢,没有去定制这个错误消息,所以说这是一个默认的错误消息。
03:08
好了,这个转换失败的话呢,我们就需要来使用。自定义的转换器来完成这个转换。所以说下一个话题就是如何来自定义转换器。问题三。四我们说四哈。整个大的话呢,是一二啊,这是问题三。你是?你今天说的第四个话题。如何?自定义转换器,不可自定义类型转换器。首先呢,我们说第一个为什么。
04:07
需要自定义的类型转换器。为什么需要啊,因为。巴兔。不能完成,能动完成。这不串啊。引用类型的。转换,所以说我们需要来自己定义类型转换器。第二步。如何?定义。类型转换器。怎么搞啊?我定义这个类型转换器的话,我们一定要写一个类型转换器的一个类,对吧,写完这个类呢,我还需要在刷图里边配置一下,然后就可以使用了来开发。
05:07
类型转。换气的背二部。配置。类型转换器。转换器OK,两个步骤,第一个步骤开发类型转换器的类,我们来看一下PPT啊。自定义的类型转换器必须实现。Tab com接口或对这个接口的某种具体实现类进行扩展。我们来看这个。PPT,那这个时候的话呢,这个底下有个什么呀,最底下有一个类叫。叫Type Convert,我们通常情况下对这个类进行扩展就可以了。
06:00
所以说第一第一个问题就是拓展。SPA。Type类机构,那第二个如何进行配置,这个配置呢有两种方式,有两种方式,一种方式是一于一半的配置。第一个基于字段的配置,就是具体转换哪一个字段。第二种方式。低于。类型的类型的位置啊,这个就是我具体转换的是哪一个类型,这种方式好了,我们先只用一种方式啊,这种方式呢,我们需要。在那个。对应的action那个包下边来新建一个文件。
07:05
两步。第一步。在。字段所在的。错了哈,字段所在的model,因为我们有可能model嘛,字段所在的model包下。啊,这个model呢,有可能是action可能是。Action。也可能是一个。普通的就是drive的那个model啊,这个包下新建。一个model model class name,然后呢?Convert the problem。A文件啊,第二步在该文件中,在该文件中输入件值咋样的呀,第一个是few的。
08:09
Name。字段的名字大应该是。类型转换器的全类名类型。转换器的权位名这样的。两个步骤啊,全局这个呢啊,类型地类型这个配置呢,这个我们也说一下啊,在src下新建一个叫X。嗯。好,然后呢,电路。
09:00
一个建筑,这应该是转换。字符串要转换的那个类型,带转换的类型。再转换的类型等于。类型转换器的全名。这样的两种培育方式。OK。若说完开工。看第一步,我们需要来开发一个类型转换器的类,开发一个自定义的类型转换器。好一个。Are on workers。名字叫。铺类。Type water OK finish啊,我们看这里边的话,我们有两个方法,这两个方法呢,很容易理解,有字符串。
10:03
转为。Object有转为这个目标类型,还有呢啊,转成字符串,同学们需要两个方法一来一往吗?就是说我要是到服务器端。我需要调。这个方法,那回显的时候呢,我就需要调这个方法对吧,所以说。写一个吧,那我是if,如果我这个目标类型不plus等于。eight.class如果这个目标类型是对角class的话,等于,那我就进行转换,转换这个值在哪呀?值这个value里边是吧?如果value不等于公,而且value length还大于零的话,我就取其中的一个值作为。
11:01
这个不知道输的那个值,Y6等于Y6。I6。搞定。然后的话呢,来进行这个转换,这个转换我们需要。Format对象。写一个private。It for me。It for me。护照方法。看date format等于new simple date for,比方说这个格式暂时呢,我先写死,YYYY-MM-DD。HMMSS,好了。我要进行一个转换,我直接一个啊。It format点。Value。
12:01
可能会有一场带概。回常呢,我们做一个打印,如果要是没有转换成功的话,我还直接返回那个。Values。若没有转换成功,则返回。啊。这是往回转,往回转的话呢,If。判断一下这个O是不是类型,如果是的话,进行一个强转哦。Eight。把这个干掉。O。如果是这个类型,我进行一个想转,我需要返回的是。
13:00
Format format。被O了好了,否则呢,我就返回一个空若,若转换失败,若转换失败返回。好,OK,那这块有一个不完善的地方在这,我这个是写死的,一会呢,我们考虑把这个放在配置文件里面。先搞这个hello哈。第一种。基于字段的配置,那现在这个model的话呢,就是这个沃森,哎。Action了哈,我来新建一个property文件。叫。Worse。Action横线等。我要转的是等于权利名。袁立明。
14:02
CTRLC来。好,这个时候的话呢,就应该可以转换成功,我于是呢,我在这个构造器里边打一句话。The pet con construct。再来。这个里边也写一句话。啊,从字符串转到对应的类型。一会再写一句。就是说怎么样会有这个打印的话呢,说明我们这个转换器就。工作了对不对。OK,走一趟。注意我把这个呀,故意写错,这个时候这个转换应该是分为。两个阶段,一个阶段。哦,这回。
15:01
会有两个阶段吗?先跑一下吧。大家看这个时候的话呢,是两个阶段。怎么样,首先嗯,从字符串转为date类型,然后的话呢,又转为字符串,因为我是不是需要回写呢,对吧,好了,我写个12。再看狗。是不是成功了呀,90年12月12号00:12:12 OK,没问题。这就是我们的啊。类型转换器以及第一种配置方式,第一种配置方式啊,我们讲到了,我说我这个converse their properties必须跟那个model在一起,那现在呢,这个model是谁啊,就是这个action来,我现在我来使用model drive,我来写一个model的包。比方说我们这个名呢,Customer。
16:03
一类名叫,然后呢,我把这两个属性给它复制过来。这两个属性啊。C。X。复制到这个里边customer。保存。把我的action。Conversion action。实现model drive。Employment's model driven。
17:00
Private。Model。啊。猫猫等于六。返回。Model。打印model就可以了。我懂,然后呢。Model里面同写兔子方法。走,大家说我这个时候这个转换还能成功吗?能吗?最熟的猫都是谁呀?猫都是。Customer,你就不能够再写conversion action横线s properties,那先找一遍瞧一瞧。
18:05
回来走。是不是转换失败了呀,因为这个时候猫都在这儿呢。进来把这名改一下,F2改成。横线走。再来。刷新。是不OK啊,这个时候的话呢,成功了。好了,我们再刷一遍。哎,没问题,那从这里边我们看到什么。我们看到了这样的一点。在我第一次使用这个转换器的时候,创建对象,然后的话呢,每一次只调那个对应的方法就可以了啊,说明我们这个转换器是单实力的。好,这是我们额外的一个收获啊,把这个写到我们这个里面来。
19:09
三。转换器。类型转换器是安实力的。权力的,好了,第一种情况基于字段,这个就是第一次使用的时候。第一次使用该转换器时。放建实力固定。好,我们看第二种配置方式,第二种配置方式呢,是使用。类型的配置。啊,第二种使用方式是基于类型的配置。在src下建X。呃,类型跟。
20:00
类型转换器的全类名,好吧,那我首先呢,把这个放到当前应用的根目录下,这样放的话怎么了,它是不是跟这个外部应一点关系都没有啊。然后呢?停掉,我们来写一个src下,新建一个properties。叫X。横线。然后java.U9.eight等于。这个权利名。是C过来。等于OK。好了再跑。直接刷。相当于是一个表单重复提交吧,是吧。
21:02
走哎,这个结果是没问题的,诶我们看到怎没创建实例呢,往前翻。在这呢?这个呀。是在。当前tru应用被加载的时候,创建实例。Not。不是note index.jsp。来。这种方式是?在当前struts to应用被加载时。创建实例啊,这个时候创建的好了,创建好之后的话呢,我们再找。每一次呢,都会调用这个方法,并不会在多余的创建实例,不过这块我们看到一个什么问题啊。
22:07
哎,这个实例被创建了。两个。这两个是怎么回事呢?为了搞清楚这个问题,我们怎么办呢?哎,我们在这个类型转换器的构造器里边打一个断点。然后在启动的时候呢,就会在这块停住,我们从后往前看看它怎么就创建两个实例了。停下来。Debug,走起。走,停住往前翻两个实例哈,OK,看到这个。Conversion property这里边的话呢,只加载了一次。X properties,这说明这个方法也被调了两次,对吧。
23:04
再往前走。我们找到这块有一个,呃。Inject方法啊,这块的话呢,要执行一个反射inject什么意思啊。注入。那个Di,我们要讲那个依赖,注入那个I就是inject。在spring里边,我们会详细来讲Di或者是IOC。你是一种非常重要的编程思想。好了,这一行在前一行,大家看到这块是不是有一个循环呢,我要。便利这个注册器,然后的话呢,调每一个注册器的injt方法,我们看这个注册器实际上是有两个实例吧,哎,所以说。我们的类型转换器会被创建两个实例。好了,这个流程的话呢,大家做一个了解就可以了。
24:01
那因为这样的话呢,我们这个。类型转换器啊,就不是单实例的了,所以说我们把这块的话呢,做一个修改。对于第一种情况而言,他的确是暗实力。一次使用的时候被创建,而且是单实力的,而第二种情况的话呢,它并不是单实力的。好吧。这里边儿还有一个特别,我特别需要我们注意的点。这个点在这儿。基基于字段的配置啊,是第一次使用的时候创建实例,而基于类型的配置是在当前star to应用被加载的时候创建实例,不要小看这个区别啊,这个区别成精。引出过一场血案。啊,调了好长时间。被调出来,后来发现,哦,原来是这个创建时机导致的,我们一会儿再说。
25:03
看一下PPT。微型转换器,这个我们刚才已经说过了。STEM方法。然后整个配置自定义类型转换器,刚才也说完了,哎。看一下这个视频代码,哎,我们希望实现一个自定义的时间类型转换器,时间patternon呢,要以外备用的初始化参数配置在这个web s文件里边。如果要是类型转换失败的话,给出自定义,给出自定义的这个错误信息,我们基本上已经。实现了,现在的话呢,我来修改,我来修改一下,我们就将在这块看见那起血案。大家重现一下哈。那我们为了实现这个功能的话呢,我们需要在Y8文件里边来配置这个patternon。K per。Homo。
26:00
STEM。号指定RY6、YYYY杠、MM杠、DDHHMMSS搞定。好,那这个时候的话呢,我们就需要在这个water里边。获取这个patternon吧,是吧,这里边儿获取patternon an。获取。当前web应用的。当前。Web应用的初始化参数。以备之后使用。那如何来获取这个Python呢?我们需要用到。于是。Contact怎么获取?从action contact里边来获取,好了,我来找这个it等于context.get叫。
27:08
Patternon。把这个值放在这块就。可以了。Okay。好。测试一下吧。刷新走。我们发现怎么样,是不是又回来了呀,告诉我这个。Birth,呃,是没有被转换成功,这个bos是不合法的。我这样修改之后,它怎么就不行了呢。那于是呢,我们改成另外一种配置,把这个X work放到当当前应用的整个这个项目的根目录下哈,然后把这个呢拿进来,拿到model里边来,好了再启动再走。
28:06
再看。这就可以啊,这个没问题,哎,两种配置方式。一种行,一种不行,为什么?这就是我们在前边强调的。创建时机的不同,导致了一种好用一种不好用,为什么呀,我要是基于基基于这个呃,类型配置的话,把这个拿出来哈。基于类型配置的话,什么时候创建。在当前trus应用被加载的时候创建是吧?哎,这个时候要是一创建的话。到我们的这个里边来,那这个时候。我这个呃,Contact对象啊,还没有被装配到这个action contact里边,即这个是空。
29:03
摆一下知道了啊,这个是空,那导致我在创建这个对象的时候的话呢,实际上出错了。这个对象根本就没有创建成功,所以说这个不行,看一下。大家看这不是闹啊,这个打印了,但这个是空这块的话呢,会发生一个控制针异常,导致当前这个对象根本就没被创新上,所以说的话呢,啊用这种方式。用这个基于类型的方式来配置,然后这块我们还在这个构造器里边去获取这个初始化参数,没有成功。而刚才那个方式为什么行呢?刚才那个是我第一次用的时候,我再来获取这个service context,那这个时候这个service action context已经被创建好了,这是没问题,所以说我们需要来改这个方法,怎么改的呀,说。
30:00
又不能用了是吧。CTRLX。CTRLX,哎,我需要提供一个方法。Public。For。Might get this might。If,如果当前这个format还没有被初始化的话,就。给他初始化一下。然后呢,返回这个it for ma不就可以了吗?这个时候的话呢,是在我第一次用的时候,我再来。红。Service action contact里边来获取这个service contact就没问题了,底下这个写法改一下,改成什么呀,改成。
31:03
GA said。C过来也改一下。再看。这个时候就好用了哦。你错了啊。刷新。OK。可以了,哎,这就是我们刚才强调的创建那个时间点不一样。可能会有血案的问题,因为大家没有这个开发的体会哈,当时确实是挺折磨人的。打开我们的index JSP最大化,那以上呢,就是我们说的这个,呃,类型转换器的问题。第一个为什么需要它,第二个如何进行定义啊,定义的话呢,包括两方面是吧?啊创建实例以及进行配置,配置的话呢,有两种方式啊,基于字段的方式跟基于类型的方式。
32:04
OK。我们再来看一个类型转换器的使用场景。比方说这里边的话呢,有这个employee name address跟birth。然后呢,哎,我这address里边啊,我想直接通过输入省市区的方式,直接来创建一个address实例,看到了吧,这就是一个典型的类型转换的例子。大家可以利用我们刚才学的这个类型转换器来完成。这个应这个应用。
我来说两句