00:00
好,我把这个项目复制一份CC。到这边来,CTRLV。幺七。那么我把它改成2.2,我暂时暂时先把它改过来。然后呢,这个MVC我把这边写一下,这边我来写个叫service,然后呢,我写个叫OC。先把它先先项目先考下来啊,咱们先简单的先做个回顾。OK。呃,我们把它把它把它加入进来啊。Project structure。把这玩意删掉。然后点击model,点击加号。点击import。找到幺七。找到他,点击OK。好,找到artifact。行,准备工作已经把它做好了,我们简单做个回顾啊,我们找到read me。
01:00
我们昨天讲了哪些内容呢?我们昨天我们是从我们是从幺三开始的。那么在这个项目当中,我们一起来看一下。在这个项目当中,Flute。我们把打开。我们只有一个。那也就是说第一点。我们之前的做法,首先啊,最初。最初的做法是。一个请求。对应一个。是吧?那这样存在的问题是太多了。是吧,同学们,所以我们在第二步我们做了一个改动,就是我们把。把一系列,把一系列的请求。都。对应一个。是吧,同学们,我们采取的是这个做法。
02:01
那也就是说我们之前所写的index。Ad。啊,Delete等等等等,还有update。我们全部把它合并。把它合并成叫flu。是不是?然后我们通过。通过一个叫or,是or还是operator,我记得是or吧。通过or的值。来决定。啊,调用。Flute中的。通过or的值来决定是operate吗?Op那我就写全了啊,反正这个无所谓是吧,大家只要自己能够把它搞定就行了啊,随便你取哪个名字,Oper值来决定调用的是float中的哪一个方法。是吧,同学们。那么我们使用的是。
03:00
使用的是Switch。Case这样的一个语法,没错吧,使用的是Switch case。这是我们第二点,我们在做的,也就是呢,我们在这个当中。哦,我知道为什么了,你看我说吧,我之前代码删除的,删除的是这个里面的是吧,同学们。啊,是不是啊。对吧,这里面本来有Switch开嘛,说明我之前那个代码不是要剪切的嘛,是吧,这个剪切错了啊,那行没关系啊。没关系,我看一下这里面。打开打开再打开。打开它,哎,这边还有的,那我把这个全部拷过去是吧,同学们跟据C拷过来一份啊。好把它粘进来,行,你看我们使用的是Switch case这么一个做法,这是我们幺三这个版本里面啊操作的。然后呢,我们要四当中,我们在幺四里面。幺四里面,当然幺三这个当中,这个设备层这里面可以不用写,因为我这个当中,我记得当时我们是怎么操作的呢,我们是稍等啊。
04:05
我们是怎么操作的呢?就是说本来我这里面有,本来我这里面有一个service方法。啊,本来我这里面有个service方法。然后呢?然后呢,我这个service方法我不用了,我回到这个里面去了,我使用的Switch case是吧,同学们使用的是Switch case。好了,要不他空着就空着吧,啊,反正这个大家应该都都没问题。行。那大家帮我想一想,我们使用Switch case的这个。当然肯定会比之前要先进一些,但是它也存在问题,存在的问题是啥呢,同学们?如果你这个处理的响应的响应的这个功能太多,是是不是Switch开始搞得很长啊。你这个里面需要Switch。你其他的面也需要Switch开始是吧,那这个不太好。所以呢,我们就想办法把它写的更通用一些。那因此我们来看一下。
05:02
幺四,这个版本我们做的是什么改动啊,好像是不是就就改成那样了。就该在思维就开始。我记得这里面不是有吗?我加的名字叫呀,怎么没有呀,是被我代码剪切错了吧。估计是昨天代码简介错了是吧,同学们啊。那行,那我们去看一下药物啊,看药物里面写的啥。打开。所以说我们下一步我们在做优化的时候,哦,下一步直接到垦区了,那我就知道为啥了。估计是我这个里面代码有问题啊,剪切的有问题啊。来,回到这儿,回到这儿,打开它,打开它。斯。好,我把这坨代码,同学们来吧,咱们反正现在是复习嘛,我把这组代码,我我就把它粘到上面去了。好,回到这儿。回到这儿,回到这个service是吧,同学们,我直接把它粘到这边了,这是我们幺三这个版本对不对,那么我们幺四的版本怎么做的,是不是我们再继续把它复制过去,然后我们再改造一下,好回到这边来。
06:04
好,把它粘进去,同学们帮我想想我们昨天是怎么改造的,来,正好单复习了,试着变吧,不变吧,呃,Oper也不变吧,那我op的这个值获取到嘞,获取到是不是就相当于是我们的方法名哦。所以我在这边。比如说,This,别get class,获取当前它的一个大class对象呗。然后。Get method可以名字。名字是不是就是operator呀,那我再带上两个参数,一个是http request点。一个是http response.class这样我是不是就能得到那个方法了。Method。等于他没错吧,行,去开启一下。啊,就正好当复习啊,好得到一个麦的,我可以判断一下if麦色的,如果不等于,那是不是表示我能找到这个方法,也就意味着下面的我这些方法有一个和它对应的。
07:03
那没关系啊,对应的我就调用一下呗,method.invoke调用,那就把this传进来,参数是不是就request response。好,需要盖一下。就这样的。哎,就是这样。然后呢,我可以在这边写个return。表示我执行完之后,我就终止嘛,就可以了。那假设你还能跑到这个圈开启的外面去,那说明一定是有问题的。我们可以思路。New runtime exception,没有找到,没有找到,呃,Op oper的方法,那么我把这个oper剪切。剪切加俩双引号,在俩加号挪到中间,Operate放进去可以吧,没有找到它,那下面这个词位题不要了吧,删掉,哎,是吧,同学们。不就是这样的吗?啊,这就是我们第一步做的,做的这个反射。那行吧。把它关掉,我们再找到read me。
08:00
所以我们第三步。在上一个版本中。在上一个版本中。中充斥着。大量的Switch case。啊,试想一下。随着我们的,随着我们的项目的业务规模扩大。啊,扩大。那么会有很多的。那也就意味着。也就意味着会有很多的。会有很多的Switch case。没错吧,那这样这是一种,这是一种啊,这是一种代码冗余。因此我们怎么做呢。因此我们在中。我们在饲料中使用了反射技术。
09:00
我们规定。我们规定operate。的值。和方法名一致。那么。那么接收到的。Operator的值。啊的值是什么?就表明我们需要。调用对应的方法。是不是这样的,利用对应的方法进行响应?如果找不到。如果找不到对应的方法。则抛异常。没问题吧,这是我们这个版本做的事情。然后呢,我们又进行了优化。在上一个版本中,我们使用了反射。我们使用的反射技术。但是其实还是存在一定的问题。一定的问题。每一个中。
10:01
都有类似的反射技术的代码。你想想是不是?我们每一个里面都需要去写这一坨代码吗?你当前这是fruit。相关的增删改造。你用户相关的资产改造是不是也需要这一坨,那你自己看一下这一坨代码是不是在每个里面都是一样的。那么因此我们就把这种通用的代码,我们就继续向上出去。我们回到我们的这个图啊,给大家画个图的。所以呢。来我们把它打开啊,稍等一下。好,本来我们是这么写的,然后呢,我们把它变成了这么一张图,我们使用了一个叫dispatch。我们把这个当中所有的反射代码全部在向上提取,我们做了一个叫中央控制器。所以。
11:00
啊,每一个中都有类似的反射技术代码,因此。因此继续抽取。我们继续抽取。啊,设计了中央控制器类。也就是我们的叫dispat。哎,就是它。我们设计了这么一个类。那么这个类当中,它需要帮我们解决什么问题呢?好。我们写一下。Dispat。这个类。的工作分为。分为啊,他的工作分为两大部分。好,一步步来啊,一步步来,他的工作分为两大部分,一会儿我还不再修改的啊,分为两大部分。第一部分是。从URL中。
12:01
从URL中。提取。Pass,还有印象吗?Teach pass。那么我们就能得到一个float。也就是说,我们从杠的点度当中提取到这个单词。是不是?然后。我们写一下啊,这个叫根据121啊。定位到。定位到能够处理这个请求的control类。CTRL组件。好。那么我们再根据。根据弗。找到对应的组件。啊,找到对应的组件。叫flu controller。那么他所找的依据。这个对应的依据。
13:00
我们存储在。application.x秒钟。是吧?他们的对应关系我们存储在这个里面。我们使用了一个叫并。ID等于float。Class等于com.at硅谷点fruit.controllers。点fruit。Ctrler。我们是不是这么写的?这样我们这种对应关系,这个的名字,它对应的就这个组件。行,这是第一步。啊,根据找到对应的这个组件。然后再来。那么根据。获取到的operator的值。定位到啊定定位到我们弗洛CTRLL中需要调用的方法,哎,这个是和咱们前面的步骤是一样的是吧,同学们,所以我们说这是第一步定位。找到这个组件。
14:00
找到这个租经理组件里面的方法。这是我们第一步要做的事情。那么第二步我们做的事情,我们再利用这个方法。第二步。调用。Controller。组件中的方法。那么这个调用它当中的方法,我们又分成分成了三大步。第一步参数。有印象吗?获取参数。第二步,执行方法。第三步处理叫视图处理。有印象吗?我们分成了三步。调用CTRL组件中的方法,诶,我们又分成了三步。当然。我们根据float找到对应的组件,这个找的过程我们是不是通过的。去解析XML。有印象吗?这个技术叫DOM技术。啊,通过DOM技术我们去解析XML文件。
15:05
形成啊,在中央控制器中形成一个冰map容器。用来存放所有的CTRL组件。是吧,同学们用来存放。啊,所有的CTRL组件。再来。那么我们再回到这边来,我们要去调用CTRL组件当中的方法。第一步,我们获取参数,我们是咋获取参数的同学们。那么获取参数的时候,首先第一步。我们根据需要调用的。方法,或者这样吧,获取。获取。即将。要调用的方法的参数签名。
16:01
参数签名信息。我们要获取到它。我们是怎么获取的呢?Parameter?Parameter中国号。Parameters等于method get parameters。我还是把它代码找到啊,这个别别写错了。来,我们来看一下。幺五,这个当中我们做的事情是什么呢?回到。回到这PA在这里。我们这个当中幺五啊,161717是我们刚刚复制的吧。那就是幺四,我来看一下啊。幺四,我看一下我们的版本啊,打开打开它。打开它,诶这里面还没有呢,那就没问题,那我们接着把三大步,我们用两个版本来实现了PRO15和幺六是吧,同学们分成两版本,来我们先看一下幺五我们是怎么做的,我记得第一步我先做,首先我做的是视图资源的处理。
17:02
是不是啊,同学们。我记得第一步我是这么做的啊。我们这个当中。我们看一下啊。找到他。好,这边是解析表示定位的,它是吧。啊,把它解析的代码把它加进来。OK,再往下。我们这边主要做的是解析的事情,那没问题啊,那就对了。第一步我们做的是解析的事情,然后第二步我们应该是在幺六这个项目里面,在这个里面。打开它。打开它,再打开它。回到这儿。好。那么我们做的第一小步叫参数的处理,我们来看一下啊,往上走。叫method.get parameters是是这个方法吧,哎,没错,那说明我拼对了啊,说明我拼的是对的,好,再来。那我把这些都关掉啊。回到这边来。通过它。获取参数签名的信息。再来。
18:00
我们通过。Parameter PLA parameter我就直接写了啊,比如说。获取参数的名称。通过。per.get叫一个per type还是叫get type,我忘记了。我看一眼,偷偷看一眼。这个是叫,这个是叫get。Get,没错,获取名字get type呢?是不是在这,哎,通过get type行。通过get type。获取参数的类型是吧,同学们获取它的类型。好。那么我准备了一个。准备了。比如说object。Parameter values。啊,这个数组。
19:02
用来存放对应参数的参数值,没错吧,对应参数的参数值。另外我们有一些细节需要考虑,另外我们需要考虑参数的类型问题,需要做类型转化的工作。就是根据这个。获取参数的类型。是吧,同学们。啊,需要做类型转化的工作。当然,如果你是request response筛选,我就不需要做做获取参数了。那如果你是intake,那么我们需要做类型转化。这是我们获取参数要做的事情。那么执行方法就比较简单了。啊,这个之前写过的。直径方法,我们找到这个方法,method.invoke。那么这个invoke里面。第一个就是我们的组件,比如说我们写个叫CTR病。第二个我们接受我们的参数parameter values是吧?同学们把参数传进来,然后这个方法我们要求他给我们返回一个值,还记得不?
20:07
Return to on return o BG,给我们返回一个值,如果这玩意,如果这玩意不等于闹,我们把它变成死菌,强者为字符串,然后再做视图处理的事情。还有印象吗?我们做试图支援处理的事情。子俊。Return,比如说我就随便写个叫SD吧,就这样子。然后呢,我们做了判断。如果。return.start with。如果他是以redirect。开头的。那么我们需要去做一些处理。Else if咱们就不写了,或者else我们就不写了,行吗?同学们,这是我们做试图处理的事情。这个是我们昨天所讲的内容。我们是一步一步把它演变过来的。
21:03
这些内容呢,我们所讲的这些内容呢,呃,第一个它对于大家是有一定的难度的。对于大家是有一定的难度的。这个难度呢?直接引起大家觉得比较困难的,这个第一个原因是因为有一些API大家比较陌生,对一些API的单词比较陌生,比如说反射,大家听到这个玩意儿的时候总会有些害怕。第二个就是。第二个就是大家平时所写的一些代码。啊,都是常规的系统的功能的实现,增删改查。没有写过,没有从更高的一个层面去思考我们的代码的结构的一些调整。那么这些是属于代码的一些,呃。怎么说呢,叫叫代码的一些,这个叫从结构的这个层面上进行调整的一些通用代码。那这块大家是缺乏的啊,所以大家会觉得比较困难。啊,我们有同学会有疑问,那这个内容到底我们要不要掌握。
22:00
啊,那这个答案肯定是要的,肯定是要掌握的。但是他的优先级呢,并不是说你今天讲完之后,今天就一定要掌握啊,这个这个倒不是必须的。啊呃,我这么来讲,就是说我们从啊最低最低的要求。这块内容你都没有听过,我都没有讲过。那行不行,其实也行啊。其实也没问题,同学们,大不了我们大家就一起学习自然改查嘛,我们天天就写自然改查好了。那那这个不就是最底层的马龙吗?对吧,你负责系统的业务功能的实现。啊,但是其实这样对于大家而言是不利的,同学们。因为你学完Java web之后,你再学习后面的框架,这两者之间你找不到他们的内在的联系。啊,顶多顶多顶多这个老师告诉你对吧,某某某框架很牛,诶某某某框架很好,某某某框架很强大,怎么个强大法。和我有啥关系啊,没啥关系,你你不感冒。对吧,你只知道这框架重要,为什么重要,因为要学。
23:03
为什么重要?因为工作要用,因为企业对这个框架有要求,你必须得会的框架,所以它才重要。但是我们缺乏的是从技术层面的角度,这个框架为什么重要的一个支撑你却不知道?啊,这个是非常要命的。所以我们很多的程序员他会用会使用框架。但是你让去聊一聊这个框架的事情,他不知道来龙去脉。那这样的话,他的这个,呃,怎么说呢,不能叫学习能力啊,他的这个后劲。啊,是是不足的。所以说你说这块代码它既重要也不重要。不。重要的原因就是。你不会天天把这些代码拿出来敲。啊,重要的原因就是我刚刚所讲的。所以呢,我们对于这块的态度呢,第一大家一定要掌握。但是你不用急于说今天就得必须得把它掌握了是吧,这个倒没有这样的要求啊,但是你不能说老哦,既然老师说过今天可以不掌握是吧,那我就一直放着,那也不行的。
24:01
啊,那也是不行的,基本上从常规的情况来看啊,从以往的这个情况来看,大家基本上咱们快的同学也就两三天,他尽量把它吸收掉了。啊,稍微咱们慢一点的同学得需要一周。所以呢,我所以呢,我觉得大家不管怎么样。我们在我们在讲到第三个项目,也就是舒诊项目之前,我们的通用代码大家是必须要把它吸收掉的。啊,第一个项目叫float,这是一个最简单的代表操作。我们开始给大家引入这些代码。然后呢,大家会比较难受啊,但是大家要慢慢的去啃。一定要慢慢的去把它消化掉。然后我们通过第二个项目。通过第二个项目,就利用我们所写的通用代码来开发我们的第二个项目。那么通过第二个项目,大家应该会把这些代码都能吸收掉。然后我们再做第三个项目的时候,那就当复习了。啊,那开发起来就比较快了啊,基本上我们是我们是这么一个这么一个方式。啊,所以我希望大家这些代码不是说不重要,其实说实话是比较重要的。
25:02
啊,但是呢,大家也不用有太大压力,对吧,不需要你当天就要掌握,你可以花个两天三天啊慢慢来。
我来说两句