00:00
刚才呢,经过分析呀,我们看到,哎,我们有这样的两个问题,那实际上呢,我们这蓝极器的名字啊,它叫什么呀,它叫s sta,中间这个叫prepare,这个指的就是那个prepare拦截器,好了,打开默认的配置文件看一下,Prepare指的就是它,我们用的是谁呀?用的是这个PS prepare sta这个就是。Prepare prepare干什么用的?为get model方法那个返回值准备那个model好了。通常情况下,我们要是去用这个model drive的话,我们应该怎么用呢?Model drive应该跟拦截器一起用。
01:00
当然我们这块没一用也也用起来了是吧,但是通常情况下呢,需要一起用,而且可以避免我们刚才出的问题,大家看一下这把应该这么写。注,一加方法回来。这个方法的主要作用。主要作用。是为盖子方法准备。高组的准备嘛,所以说的话呢,写起来啊,应该这么写,CTRLD过来。
02:02
XV。保存。那这个呢,先于model drive执行,所以说它是干什么的,它是为这个准备那个model的代码,想到这块的话,同学可能又有问题了,是吧,你这有什么区别吗?啊,从这块看没什么区别。那执行的结果也一样,而且那两个问题也没解决,但是我们马上就要解决了。下面看下PPT。我们用了一个拦截器struts2.0里面model drive负责把action类以外的一个对象压到直站的占顶,Prepare拦截器负责为get model方法准备。Model啊,我这个实现了,我起作用的是那个拦截器,点过来往上拉。
03:10
拦截器。P大头的。Prepare interceptor。二杠五这个走好了,这就是拦截器,看一看怎么执行的,往下翻do intercept,首先获取。Action,然后判断它是不是实现了接口吧,好了,如果实现了。先往后看哈,TRY。
04:04
Catch,然后的话呢,它会根据这个参数决定着我是不是去调这个方法。但是我们看到啊。实现这个prepare的话呢,是要实现是吧,这个方法的话呢,你也得实现,因为接口里边这个方法你必须实现呢,但是。这块我们居然看到。有可能还不调用这个方法很奇葩哈,啊,你实现了我还可能不掉,那重点呢,在哪呢?在这呢,这是核心的部分,核心部分的代码大家看。我来打一个断点调一下。走。姐姐好。搞艺术的都这样是吧?过了先嘛,然后再prepare吗?好了。
05:15
大家看往下走一行,Action是不是实现了那个接口啊,才实现的吧,往下翻。好,我们看这个时候呢,它会,呃,根据一个布尔值,这个布尔值默认是false,所以说应该走下边这一个走好了,这个时候呢,前面这个数组被赋值了,先是prepare,后是prepare do看见了吧,OK,搞了这么一个数组,然后干什么呢?然后说去执行前缀方法。看哈,然后去执行这个前缀方法点进去。
06:01
110行进来,先获取action action就是我们的action,然后执行前缀方法看action name啊,Master name是谁呀?目标是update呀,这行update吗?好。Method name不是空。这样下来,他尝试着去获取一个前缀,方法吧。再走。点他。进来。走好执行前缀方法怎么获取呢?啊这个哦,它干什么呀,是不是使这个方法手速怎么变成大写了呀。然后啊,我们去便利这个前缀,下一个先得到一个前缀方法,这个时候这个前缀是谁呀?这个时候是不是普派在前面啊是吧,所以说这个方法名叫方法名叫。
07:06
Update吧,看见了吧,啊。他尝试着。从。Action里边来获取这个prepare update的方法吧,如果有的话就返回,如果没有的话怎么了?是不是异常啊?你看异常打了一个日志还没完,第二层循环。到了action action是谁?到了model driver了?哦,刚才那个断点我忘打了,第二层它还会再一个循环,然后看他有没有那个prepare do update的方法,都没有的话就算了,有一个的话,他就将执行一下那个方法,那过了吧。对。经过。心都过了打开啊,再看一下哈,回退走,这是这个给P先过了先位。
08:14
X的属性赋值吗?好了,然后的话呢,我们看到了这个拦截器啊,首先。判断是不是实现了pre接口,我们实现了,然后的话呢,来确定这么一个前缀数组,下一个大家看这有啥区别呀,一个是prepare do在前边在后边,一个是prepare在前边,度在后边吧。这个数组是一样的,只不过那个元素调了一下顺序而已,他说什么first call prepare do,先去调用那个prepare do,就这个意思,这个值默认是false,那我确定之后的话呢,这个前缀的这个嗯,数组就长成这个样子,确定了哈,先是prepare,后是prepare度。
09:11
下一个断点好了,这个时候的话呢,我说尝试着去调这个前缀方法。点进来啊,110行加上一个断点。然后往下走,执行action啊,获取action action获取完了回来,Action在这呢,然后呢,获取目标方法有了,Update好了,如果不是空的话,再往后走,我将尝试着去执行那个,呃,去获取那个前缀方法吧,如果方法不是空的时候怎么了,是不是执行了呀?能想明白吧,这都是反射吗?My work OK,获取前缀方法去来,刚才这块应该加上一个断点好了,呃,111个,141行加一个进来,首先呢,我把这个方法的首字母变成大写。
10:18
好了,往下看,OK,我搞了一个方法,这个方法先叫什么呀?先叫prepare update吧,对方没有走。没有,打了一个日志好再找他,是不是还要尝试着去执去获取第二个方法呀,叫什么名啊,叫prepare to update吧,那这是不也没有啊,我们没定义吗?于是过了。这个方法是不是空啊,空就不执行了呗,走了。好了,然后的话呢,到了我们后边的这个Mo豆Java拦截期,这就是我prepare。
11:03
拦截器整个执行的流程,我们把这个流程的话呢,写一下过来,那先说一个七吧,来。关于这个拦截器。最好的方式的话呢,就是把那个代码拿过来,我们一行行加注释,最大化这个就这个方法,CTRLC。按这个太长了是吧,我们呢,尝试着给他简化一点。挑一些重要的,第一个获取action。
12:02
Action实例是这样吗?然后呢,判断action是否实现了。接口是不是实现这个接口了。如果实现了就进来,然后怎么呢,根据当前拦截器的这个属性。这个属性确定。前置宿主。确定它,那这个属性呢,这个属性我们说C啊,我们说一下默认为默认为什么呀,为false啊,确定好,那如果要是为false的话,若为false则。
13:05
这个prees长成什么样呢?这个样子应该是这么一个样子,叫,然后repair to是这样吧。然后。调用前缀方法写的吗?好了,调用前缀方法,我们就需要看它是怎么调用这个前缀方法。异常这部分我们就不说了哈。长部分是什么呀,无非就是抛一常呗,啊这步我们可以说什么根据。当前拦截器的这个属性。决定是否盗用。
14:00
Action的方法,言外之意就是它可以不调这个值呢。默认处。好了,这里边的话呢,我们看完这个源码之后啊,我们就知道有一点就是我应该可以设置这个拦截器的属性值,是这样吧,它有啊,我就可以设置啊,好了,下边的话呢,我们来看这个方法,就perfect method。Prepare这个方法。啊,拉过来。C。又一个方法。往前刚才不是执行到这没完吗。他的这个方法说C。
15:03
它的这个方法,好了,我们来解析第一个还是什么呀。获取。Action实例吧,然后呢。获取要要用的action方法的名字吧,我们这个里边的话呢,有可能。啊,如果方法要是空的话,你说这个值应该是谁呀,你说这值是谁呀,是不是那呀,看看来如果方法是空的话。是不是呀,那我们这个方法不是空,这个我们就过了,然后的话呢,是什么获取前段方法吧,然后若方法不是空,若方法不为空,则通过反射调用前段。
16:23
田克。方法OK,好了,那下边有一个可以说的,就是这个method。过来在这呢啊,过去的呀,这。C。钱。哎,这个我们要说的是谁呢?就说的他的这个方法。也是一个静态方法哈,他的这个方法。
17:10
来吧。看第一个是什么呀,相对吗?是什么把方法名的首字母变为大写啊方法的首字母。变为大写是吧,然后呢,电力循环便力前转。速度。然后呢,哎,通过拼接的方式,通过。拼接的方式而得到。
18:03
前缀方法名方可能长成什么样啊?一次你不是你你不是循环吗?第一次是属。Prepare什么呀,如果我们方update的话,是不是是不是这个二第二次是air to update对吧?得这个方法好了啊,利用反射,利用反射获取。利用反射从action中获取对应的方法。若有。直接返回,返回的话,是不是意意味着我就结束循环了,并结束循环并结束。
19:06
嗯。循环,哎,这就是整个的这个过程,好了,写完了这个写完之后的话呢,我们得有结论呢,有什么结论呢。到到底能干什么呀,后边帮是吧,叫代码解析。好了,同学们,我解析完了,解析完之后我们会有什么结论呢?嗯,解析完了的话呢,我们会有这样一个结论,说落action实现了able接口。则抓兔。将防制执行泰尔action method。
20:10
Name。注意哈,这是目标方法,明尝试执行这个方法啊,做这个方法不存在。若CV不存在。德江房市。执行度吧。Your name。而是执行这个方法啊,若都不存在就不执行。
21:02
来若都不存在就都不执行,这没啥说的,第一点第二点还有一个,还有一个就是这个CTRLC这个说若。Rep interceptor。啊,这个属性。为force。则将。不会调用。Action。这么说啊,实现了接口的。
22:04
Action的什么方法,那个方法?不会执行做这个CTRLC。这个就是我们刚才看了一圈的这个结论,好了,下边哎,真正能为我们所用的是什么呢?啊,这就是结论。啊,分析后,分析后得到的结论好了,那下边朋友所用的是什么呀,能解决。Big。呃,五的这个问题的。五啊,问题的方案是什么呀?哎,我可以为每一个要执行的个action方法量身给他准备那个prepare X method的那种方法吧,而抛弃这个方法。哎,可以为每一个。
23:22
Action by。准备什么呀?准备action method方法。而抛弃掉原来的方法。好了,第一个,第二个的话呢,我确实是要将。
24:05
这个接口的这个属性是为false。这个属性置为FOX,以避免。Stru框架在调用create方法,哎,问题的话呢,就这样解决,这是我们整个这一圈得到的,好了,那过来这一圈下来了是吧,我们经过分析之后,实际上就这两个,我当然可以直接把这个结论给你是吧,但你是不是不爽啊,你得知道是为什么吧,所以说我们一顿分析。好了,然后的话呢,我们再来看我们的这个,叫他过来吧,于是你就可以不要了。
25:12
我希望这个方法的话,你不执行写句话第三。我们看他怎么不执行哈,Model。一个that,这个是需要的request,这个是需要的list。我不需要为这个例子准备啥吧?不需要吗?就啥也不写好了,Delete。不就是是不是就是删除啊,不需要准备啥吧,在这放着过来看废物呢,我需要准备吧。好了,于是写个方法吧,Public save,这么写吧。
26:05
EMPLOY1等于六一。叫什么呀,叫私人定制是吧,那我就是为他定制了这么一个方法,你不需要吗?你的确需要,定制好了再来。他是谁?是艾呀,准备一个吧,Public。Employee等于da.edit你需要显示啊,写完给他量身打造了prepare ID的方法,好了。Update呢,Update,呃,根据我们这个这个里边这个情况的话,我直接搞一个new就可以了,好了,Public avoid update,于是我直接搞一个employee,等于new employee。
27:15
不就废了,哭了。好了,我们把这个源码呢,也清醒的太多了啊,我们回来。这个时候啊,这个世界就清净了,我们这个代码呢,写的也很少,然后我们还是要看一下我们这个拦截器的。OK,你不说你要去执行目标方法吗?你真执行了吗?搞一个大家看。直接在120场打个断点,看看是不是确实执行了第bug。早他。
28:05
第一个是list。过来是不是空啊,不执行没有吗?哦。嗯,就这样,我来执行一个删除,我执行删除的时候也不用执行啥吧。也是空空啥也不执行过。好的。啊,的确是删了一个哈,诶。没删成功啊。走。哦,没没过完是吧,过。
29:02
这个方法是断点还在这啊,这方法是空,因为我这个我怎么了,我需要一个我这块,我是不是有一个这个叫重新跳到一个action呢,我执听了两遍好了,这个时候的话呢,这已经被删除了啊,没有方法执行,好了我们来看这个I点一下,看这个时候怎么了,是不是有方法呀,Prepare吗。过。显示了,OK,找一个找一个,这个时候prepare update去工作吧,再找,你看是不prepare update好了,也执行了,再走再走,OK。改了吧,那新家跟那个update是一样的,XXXXX,鼓点,Come,带走。
30:08
有啊save啊,执行过回来,整个这个就清净了,不会去执行很多无谓的方法,好了,这样的话呢,我们这块我们担心的第一个问题就解决了,他不会怎么样啊,哎,他不会再去调这些方法没有。不用掉好了,进一步的,但是我是不是还每一次都在掉这个什么呀,是不是还在掉啊,这个能不掉吗。能不掉,我得去把那个属性值给它设置为false,来找个笔记来过来如何?
31:03
嗯。如何在配置文件中?打拦截器。蛋的属性。赋值如何配?好了,看怎么不值保存。看看那个帮助文档吧,E盘Java。Open source struts2.3.15.3打开。Dogs,打开DOS找那个home是吧?
32:10
好了,往下翻看guys。我们想看如何去改。拦截器的方法,那如何去修改拦截器的属性?它应该是intercepts。在这呢,来写拦截器,找一个往下翻。这只告诉我如何去写拦截器了吧,这不行啊,没在这儿啊,再回来说拦截,但我们这里边我们看到一个什么东西啊。看到一个intercept,我点一下它再往后翻,如何写?拦截器会有吗?默认的配置。
33:01
好长啊。呃,框架的拦截器。Method filter过滤来看这拦截器参数的覆盖吧,啊,第一种方法把拦截器都搞一遍,这个很明显太麻烦了是吧?哎,我们选用第二个方法,大家看我可以为这个action指定拦截气站,然后的话呢,其中通过这样的方式。为每个值做出修改就可以。或者是使用第三个办法直接去修改某一个拦截器的,有什么区别吗?这种方式是不是只适用于某一个action啊?而这种方式是不适所有的action呢?选这个吧,CTRLC拿过来。
34:00
修改它。好了,翻看。这个文档。这种代码呢,我也复制过来一份复制。基本上就这样用打开看这个。Intercepts貌似不是这边intercept,那这个就先拿掉吧,Default。你放后边。规矩规矩啊。好,修改。目标修改谁呢?目标是修改这个,那个拦截器叫prepare。
35:09
Intercept。Stra云店。就改这个拦截器的哪个属性呢。修改这个拦截器的always那个属性吧,这个属性为false c。抓的配置文件,这个属性值为box目标好了,首先我们这个拦截气站起个名,我们就起一个这个艾硅谷。
36:06
好了,我指向的是这个拦截基站,叫。好,呃,我希望把某一个值改为什么,哪个值啊,这个时候看看原版的它的一个C。是小名嘛,哎呀,没复制过来。Repair。这个属性值。志伟。False,好,同时呢,默认的使用谁啊,我使用自己修改过之后的这个这就可以了。
37:01
找一个看一看那个方法还打不打印就知道了,走。刷新。不打了吧,看。拿delete delete。Summit看见了吧,这就改了好吧,到这块的话呢,我们就把那个缺点的地方给它改善了,而且这个性能的话呢,有了进一步的提升,刚才啊,我们走了好多处这个源码是吧,我们也在这个笔记里边的话呢,把我们具体的这个结论嗯,最终写了,最后再看一眼PPT来prepare intercept拦截器的,呃,拦截器使用的方式说,如果action实用的这个接口,那action就需要实现这个方法,这个拦截器呢,会掉prepare方法或者是。
38:04
Action,或者是do。普拦截器会根据这个属性决定先调这个,按这个顺序调还是按反过来,反过来这个顺序调吧,默认是先掉它,然后再调它好了,那这个呢,拦截器会根据这个属性决定是不是来调,这个方法我们刚才都已经说过了。来说一下这个s prepare,这个拦截基站,这个拦截基站从字面上看就能知道是吧?先,S在prepare在model drive在powers。为什么这样设计呢?因为啊,我要求在准备模型之前得先给我一个para,因为我可能需要根据这个请求参数的情况来准备这个model。好了,Model主model准备完之后的话呢,我有可能还需要为这个model都赋值,所以说再有一个apartments,这就是它存在的原因。
39:11
那整个这个过程的话呢,我们不说了啊,前面我们已经讲的很详细了,最后看一个图,这是我们用的这个谁呀。S sta。还是那个发了一个请求,这个时候先把这个支付给谁了,Action对应的属性是吧。啊,因为这个时候占领的是action嘛,然后掉了prepare,他为model为get model没领model对象的,我们这块的话呢,是从DAO里边获取了一个对象,获指了这个。
40:01
I。然后摩托drive。啊,这个对于只占的后边这个过程的话呢,就比较流畅,OK,那以上的话呢,就是我们讲的这个model drive跟pre拦截器,大家把这个搞明白之后的话,最后。再来看一下我们难道不比这个欣慰的employee action这个代码,这个代码写的是不是很干净啊,弄了一套电商改查啊,我们以后。都能通过这样的方式去去写那个controller,是不是很爽啊?
我来说两句