00:00
各位,下面呢,我们继续来学习spring web flex,刚才呢,我们是基于了注解编程模型实现了weblex里边的基本效果,那我们下面咱们于函数式编程模型方式把这个给各位来实现出来,刚才我们说到,如果说啊,我们基于注解编程模型做到whileflex,因为咱用的是损部的工程,我们只需要把这个依赖添加到我们的相关里边去,然后sir boot就会自动配置你运行的容器,默认用的就是nit。但是咱们现在如果你要用函数式编程模型就实现,这里边跟刚才它不太一样了,那怎么不一样呢?给大家写一下,在我们使用这个函数时。编程模型。进行这个操作web flag的时候,那这个时候呢,就需要我们自己来怎么样初始化这么一个服务器,就是服务器需要咱们自己初始化,你用的是那个服务器,这部分需要我们自己做的,包括咱们现在用的都是那个net,当然里边也可以用tomcad,就是咱们一般基于native把它做到,那怎么初始化way会写这个相换代码,咱们现在这个特点先知到。
01:20
然后这个说完之后,咱们往下来看,就看一下基于这个函数式编程模型,那这过程我们到底应该怎么去做,这个代码应该怎么去写,那咱们来看第二句话,我们在刚才提到过了,咱们现在如果说你要基于这个叫做函数式编程模型进行实现操作的时候,那这过程中呢,有这么两个核心的接口。哪两接口刚才说到了,一个叫root function,一个叫handle function,我写出来。UR。Function,还有一个叫handler function。
02:04
然后这两接口什么意思呢?Root function,它的作用就是什么,实现我们的路由的功能,就是这里边它教你请求转发给对应的焊动脑。写下啊,将请求。转发给对应的这个。Handle,比如说我现在做添加,然后到添加handle,你做修改到修改handle,而现在有一个叫handle function,这里边是什么呢?它就代表我们处理请求并生成想的函数。这个啊,就是处理请求生成响应的函数,说的通透点就是执行你那个具体那个操作部分,这个啊是两个重要函数,而我们现在如果说我们要做这个函数是编程模型的时候,其实咱们的核心的任务又是做什么呢?大家要明确啊,咱核心任务是做什么?就是来定义两个函数接口的实现,并且启动所需的服务器,就是写两接口的时间类,然后里边做这个服务器的这么一个启动,比如我启动内地服务器,这是它的核心任务。
03:17
那我写一下啊,贪黑任务就是什么,就是定义。这两个函数式接口的实现,然后并且启动你所需要的那个。五。这个啊就是我们做的事情,所以咱一会儿其实就写这两个实现,一个是root function做路由,一个是handle function做你的具体函数,并且咱们自行启动一个net的服务器,把这个做到这个啊是一个基本说明,所以各位把就知道。然后在过程中还有一点跟我们之前所在VC中不太一样,因为刚才用注解方式我们发现都相同,但然汉中式就完全不一样了,那怎么不一样?再说一点啊,就是现在如果咱们用spring web flagx的时候,它里边的请求和响应就是不再是咱词VC中那个serve request response,它不再是这个东西。
04:19
筷子。还有一个叫。Response,就是目前你用这个就是web flag之后它就不再是这两对象,那它是哪两对象的?各位要知道它两对象名字,一个叫server request,一个叫server response,对应我们这两个对象,一个也是代表请求,一个代表响应,但是跟他就不一样了。我写一下啊,不是这两个,而是这两个,一个叫server。一个叫server response。这各位知道,跟之前就不太一样,而这两个它是为了提供那个非阻塞异步操作的知识,所以它里边有这么两个相互对象。
05:07
也是对应我们那个详式类型中的model和flag里面这个对应的方法,这个啊是咱们说的这么一个特点,然后这个说完之后,咱下面就开始写一下这个具体代码,那怎么写给各位来详细说一下啊,首先第一部分咱肯定还是一个人boot的这么一个工程,然后里边也可以准备工作,而就是我们刚才代码中给大家强调,这里边就是我们这个部分,还有anti部分,咱不需要变,而咱改的就是ctrler改成我们的handle,还有root部分报单自己写一个服务器的这么一种启动方式,这个跟之前不一样,那怎么做给各位写一下啊,它的步骤,首先第一步咱就把我们那个。注解编程模型的这么一个工程,给他先复制一份。然后在里边我们做一个修改就可以了,那我现在把它做个复制,这个啊,我先关掉,刚才咱们写过了,然后把这个我们做一个复制。
06:10
复制之后改个名字,我们叫DEMO2。这个复制,然后复制之后咱们到这里边把我们这个项目给它打开,我这是在E盘这个。Work里边,然后有一个叫web flex demo2,那我们找到应该在这里把它打开,就是我们这个当前的窗口。然后打开之后把它的名字我们先给它改一下,改成这个叫DEMO2,这样的话把这项目咱就又复制一份,然后复制之后在里边咱们看一下这个结构,在结构中我们目前不需要这个CTR的,然后把它去掉,然后换成我们的函数式,变成做法给它实现,这删掉,而里边的en和S部分不需要变,跟之前都一样,那咱们看下面我们该怎么做。
07:01
首先啊,第一步咱就复制给做到了,然后咱看第二步,第二步做什么呢?咱就创建里面这个叫handle。也就是你那个具体实现的那个方法,或者具体实现的逻辑,咱需要做个创建,就是咱说这个handle的方程里边的修换部分,那咱们来做创建,咱们看这个应该怎么写,其实就是写句子操作,只是过程中要用到函数式的方式,那怎么写,我写下啊,首先我现在在里边,我先建个包,给这个包我就叫。Handle。然后在汉到里边,咱们创建一个类,这个类的名字我就叫user handle了。把它创建,然后创建之后怎么做呢?因为现在我们这里边啊,它肯定要调咱们思维中的方法做实现,所以怎么调呢?我用一种最简单的方式,咱现在就写上它这个有仓构造,包咱一块new的话,通过有仓构造把这个对象我们都传递啊,咱通过这种方式给它传过来,因为现在我们用的不是死文这个方式,咱用的是普通方式进行实现。
08:11
Public user。看到的里边加上我们那个就是U。Service,然后它是右侧service,然后上面定义这么一个。变量啊,我们叫private,比如为了方便,我就来一个final,咱们叫user。Service。然后这里边啊,我们叫user service,在里边我们做一个这么一个赋值user service,把这一栏给它就是直接转过来。User,这样的话,咱通过这种方式传来我们的user service的这么一个对象,把这个做到,然后做到之后,下面咱们写的肯定还是我们那个具体的几个方法,那方法咱写一下,首先第一个方法就是根据ID。
09:00
查询用户我先列出来啊,第二个就是查询所有用户方法,然后第三个就是添加用户方法,那我们先写第一个就是根据ID查询的方法,咱们看这个方法该怎么做。我强调啊,这写法咱给他写的就是完整点啊。我们来一个public,然后咱们反应式叫mon,当然各位注意啊,这里边的返回值呢,因为咱有一个返回的这么一个效果,所以返回的话,在咱们的web flag中,它用的不是serve棒,它叫serve Bo,所以里边这个泛型我们加一个叫server。Response,然后把这个给它加上啊,这是我们返回的这么一个类型,把我把这依赖引入,然后引入之后,咱现在给这方法起个名字,我就叫get user by ID。然后在方法里边,咱就传入我们的ID值,但是传入的话,咱也通过这个对象叫server request。
10:04
用它进行传递,因为这代表我们的请求的对象,只是代我们的web法里边,它叫server require响应叫这个server it棒,咱把它引入,然后引用之后,下面我们来写这个具体操作,那怎么去写呢?首先第一个因为咱们要传一个ID,所以首先呢,我把ID值先给它取到,那我用这个叫。块的里边有个方法,这个方法我写一下啊,就是块中有一个方法。这方法应该叫这个这个has,这个方法就得到你的路径中那个值,这各位应该很熟悉啊,就是咱们虽然没有写过,咱之前写过这个注基从氯中取值,现在蕊块中用它取到,比如这个名字我叫这个ID。然后这个值返回的是一个string,那我给它变成一个int类型回了,咱们操作方便,那里边我来一个int。
11:03
啊,这里啊,来一个int类型,比如说我叫这个user ID,然后这位置做个强转,就来一个这个T点。Value off啊,给它做一个强转,这样的话咱就取到了你传来这个ID值,用request中的pass方法把这得到,然后得到之后咱下面要做这个具体调用,做这个操作,那我们来调一下啊,咱就调这个叫这次点user service,我加个注释啊。第一步获取你那个。ID值。然后第二步咱们就是调用service里边的方法得到我们那个数据,那我们调这个,这次点user service里面有个方法,这个方法就叫这个。叫get user,白地里边咱传这个ID值,然后它一个返回值,就这个mono user这个啊,我们就返回了,起个名字叫user mon,这是调方法得到,然后得到之后大家注意啊,咱们现在把它是不是要返回药,而返回到model中,不是user是一个is棒,所以要给它转成这个serve棒这么种流的形式做个返回,这个就是想是编程的特点,所以咱要做这个操作,就是把我们这个。
12:24
User。Mon要进行转换。然后再给它返回,那怎么转换,给各位来写一下啊,大家看这怎么做,大家注意啊,咱们现在这个user mono是不是理解为是一个对象,咱把对象要通过流进行返回,就是给它变成流,那怎么变呢?咱在刚才讲那个reactor里边提到了一个操作符,不知道各位是否记得。所以我写下啊,所以大家要用到这个叫reactor。里边一个操作符,这操作符就叫做flight map。
13:06
咱刚才说到过,它可以把一个对象变成流,然后把多个流合并成一个大流,最终进行返回,咱现在就是把这个对象变成一个流,然后做个返回,现在我们就可以这么来做,那怎么做我写下啊,咱就写一个叫user。Model在里边的第二个方法,这个方法叫flat map这个方法,然后在方法中有一些相关参数,咱就写一个拉姆的表达式的做法,首先我给它起个名字,比如叫这个person。加个long表示它返回的话,咱就用这个server。Response里边有个方法叫这个OK,就表示你操作成功,然后在里边咱可以设置一下你反这个类型是什么样一个结构,我们来一个叫做content,这个content type,就你反映什么类型,然后类型里边有很多,因为咱现在返回是不是一个Jason类型哦,再里外一个常量,这个常量写一下啊,它叫OB,这个Jason,你加个media type,不加直接用也可以。
14:14
然后这个选完之后在里边,然后后面给他加上一个叫body啊,就是点上一个方法叫body。在包的里边,咱可以变成我们对应的那种类型,把类型给它做个返回就可以了,那我们给它变一下啊,当然变的话多种方式,有一个方法叫from。Object这方法里边咱可以传入我们那个就是person,把它做一个转换就可以了,所以这样的话,我们完成了这么一个结构啊,当然这方法过时也可以用,当然有其他方式咱也这么写,我们再完善,然后写完之后呢,这里边咱也可以做一个基本的判断,但是目前这结构应该做到了这个啊,是我们写的明的代码,然后这个代码,但是各位再看一遍,因为写法跟之前有很大的区别,让各位要知道,首先第一个。
15:06
在里边我们的做法就是这个位置,首先我们在里边呢,咱是先得到你传回来的ID值,用这个server request,包括它返回是server response,这是while flag中的两个请求响应对象,跟之前不一样,然后得到之后咱们调色的方法,把这个user model这个返回对象得到,但是它返回不是这个对象,是一个棒这种流的形式,所以给它转成流,那怎么转换,用react里边一个操作符叫Fla map做个转换,把这个变成我们这种。就是。流的形式,然后里边设置你的这份形式,包括做个转换,最终把这做到这个啊,我们写的这么一个结构,然后这个选完之后,咱现在把它就完成了,但这过程中各位注意啊。就是现在这里边,我根据ID查询这值是不是可能没有值啊,所以咱可以做一个就是。
16:05
非空的主力,如果你现在为空,那我给他来一个,就是比如提示一个说你这数据为空,或者给他来一个空的提示,大家可以做这么一个创建。然后写下啊,就一个空池的。这么一个处理啊,但是你不处理也可以啊,咱现在给它处理一下,就是写的更完善一下,那怎么处理呢?现在我们来一个mon里边加一个叫server。Response,然后这里边起个名字,比如我叫not,这个found。啊,就是没有发现,然后等于这个server。Response里边有个方法,这方法就叫not found,然后咱来一个叫build,构建一个空值处理,然后构建之后,最后咱们在我们的这个代码中给它进一步完善,我把这结构给它往下弄一点啊。这给他也拿过来,然后在我们的这里边的最后的位置,咱给他再加上一个方法。
17:06
给方法。给大家写一下,它叫做Switch。If empty里边加一个叫not found。就是咱们刚才定义的里面这个名字,让它found,那这句话什么意思,我觉得各位同学看到方法应该能看懂什么意思,就是Switch么,If是判断呀,如果说它等于空,那返回的是不是这个not放的这么一个对象,咱们给它定义了这么一个空值的梳理,这样的话把这个根据ID查询,咱通过函数编程就做到了,各位把这结构给它知道,这是我们写的第一个啊,这代码各位好好练一练,因为C法跟之前我就不一样了。然后这个写完之后,咱再写第二个方法,第二个咱就写一个查询所有,然后写一下啊,我们来一个public。Mono里边也加一个叫server。
18:03
Response。这里边起个名字,比如这个名字我就叫get。Users这个方法,然后这个方法中咱们肯定也是去调用。Service里边的方法得到你的那个结果,那我们来调一下啊,这点user service里边这个方法它就叫get o user返回的是一个mon的这么一个对象,比如说这个对象名字我们就叫这个o user。Pro就叫user users,然后这个反应之后,咱下面要把它也是转换成我们的这么一个。流的形式啊,那这里边我们来做一下,咱就直接屡退。然后之后我们现在就来一个这个叫server。Response,然后点上里边那个OK啊,就表示它成功,然后OK之后也是设置它那个类型,这类型咱们也是一个这类型,就是这个jeson,就是它就这类型,然后最后加一个叫这个body。
19:17
在body里边加上,比如我们的名字,咱叫这个user,加上它的类型就是user.class这样的话,咱把它做了一个返回啊,所以现在我们又做了另外一个处理啊,我这么写是为了让各位知道它的不同的写法,这个啊就是产于所有咱直接给它变成这些类型,然后给它做一个返回,这个我们就完成了。然后完成之后,最后咱再写这个添加的操作,把这个我们最终给他写出来,跟上面写法基本上是差不多的,那咱看怎么做啊。首先大家看啊,在这个添加里边,咱先写方法public,我们叫这个model里边也加一个叫server。
20:01
Response。这个方法我就叫。Save user。然后在里边我们有这个参数,参数用的还是我们这个request,就一下就是server request的把这个拿给它拿过来,然后拿来之后下面咱做这操作,那这操作怎么做,首先咱要做这个就是添加操作中是不是要得到你传回来这个对象,就是通过水筷子把这对象我们先得到。得到啊,那个user。对象,那怎么得到写下啊,Request里边有一个方法,就这个方法叫body to mon,把你这个那种转成一个mon这么一种形式,然后里面加上你那个类型的class,就这个user,然后现在就得到我们这个mon这么一个类型的这么一个对象,这个得到了,然后得到之后咱下面直接调方法,直接操作就可以了,那我们来写一下啊,咱就来一个。
21:01
退。加上一个叫server。Response,点上OK,点上注意啊,这里边因为咱要调这个方法,咱来一个方法叫build,在build里边呢,做一个执行,那这行的话就是这次点这个叫user service,点上咱那个叫save user info传入一个叫user。Mono,这样的话就完成这个操作,然后这个操作中build就表示我现在进行这个订阅,然后它里边有变化通知我,我来执行这个具体操作,这个啊就完成了添加,所以咱们现在就把三个基本方法在我们这个handle中做一个实现,大家喜欢这种写法都是函数,是编程做法,第一个根据ID查询,第二个查询所有第三个角添加操作,然后把这三个我们就完成了,所以各位啊,把这个给它知道。然后这个完成之后呢,咱下面就开始做什么,就做它的调用了,但是调用过程中呢,咱要用到我们刚才说的有一个接口,这个接口叫router function做路由嘛,包括handler是你的句子处理,那咱通过路由要完成里面这种就是相应的这种映射关系啊,那咱们下面把这个咱来写一下。
22:20
这个代码给各位先拨过来,咱们做这个handle字里边的具体操作。这个啊,我们就完成了。我把这个给各位复制。咱们先聊到这里,然后这个复制之后,下面呢,咱在里边来写下这个rootor的新文部分,通过这个路由请求来完成里边的具体操作,那咱们看这个我们该怎么去实现啊,给各位来写一下啊。因为我刚才提到了,我们现在用的方式,它叫做函数式变程模型,而这种方式中啊,跟注解变成模型不一样,注解的时候spring boot会自动去初始化,你的那个服务就是net,但是现在咱需要自己初始化,所以咱下面就是一边初始化,然后一边把这过程我们给它路由,包括这些东西都给它做到,那咱们下面就来写一下啊,咱看怎么来做。
23:17
就是我们的第三步。我们坐下就吃。初始化这个服务器,然后编写我们那个。完成我们最终的这么一个测试。是第三步,所以咱们现在先写到这里,然后一会儿咱们先完成,各位先把这个写法给他先掌握。
我来说两句