00:01
各位同学,下面呢我们继续来学习web flex,刚才呢,我们讲解了web flex的执行过程,包括里边的核心API,然后咱们下面就来具体实验一下里边的操作。那这里边给各位写一下spring web flags,它的实现的方式有,注意是两种方式。哪两种方式呢?第一种方式叫做注解的这种。编程模型方式,还有一个叫函数式编程模型方式,那咱们先用注解的编程这种模型方式实现,然后一会儿再使用这个函数式的编程模型做到那两种方式呢?他们的写法中各自有各自的相关的特点,那如果说呢,我们使用这个。注解的编程模型方式,这种方式应该说特别方便。
01:00
它和咱们之前学过的。MVC的使用基本上是。很相似的,就基本上是差不多的,而这种方式呢,咱们只需要把一些相关的依赖配置到你的项目中去,然后这里边又能够去自动进行执行,而我们现在因为咱是基于这个任boot方式静做的,而boot里边它就会自动去配置你里边一些相关运行的这么一个容器,在默认情况下。注意啊,默认情况下spring boot里边它就是使用这个叫na这个作为你的服务器。那一题刚才咱也提到了,所以咱们下面就先用这个注解变成方式把这做到,然后一会儿再用函数式把这个完成,那咱们看怎么来做,给各位把这步骤写一下,这种方式跟SVC基本上是差不多的,首先第一步咱来写一下啊,我们现在先创建一个three boot的这么一个工程,在里边引入web。
02:13
Flex相关的依赖,咱们把这步先给它做到,然后再往下写,那我现在实验一下,首先在里边呢,比如现在我这个位置,我就创建一个spring boot的这么一个工程,那这工程我来创建。我写到这个位置,比如在里边给它起个名字,我们叫这个com.at。硅谷,然后这个名字,比如叫这个DEMO。外。Flags。这个就是web flagx demo1啊,我叫这个名字,这是啊,我们建的一个项目,然后把它先创建出来。这个我先创建,创建之后咱们现在把这个boot的版本,我就统一改成2.2.1的版本,用它实现我们的去操作,那我现在在里边给它改一下,改成这个二点。
03:10
2.1,因为大家知道spring boot的2.0版本开始,它默认用的就是SPRING5的这么一个相关的支持啊,所以咱用2.21的版本,然后这个创建之后,咱下面在里边呢,我们先引入依赖,然后怎么有依赖,刚才演示过了,咱就把这改一下,改成的名字就这个叫web flagx,因为它里边把校园依赖都会给我们引进来,这个啊是我们做的这么一个操作。所以现在我把这步给各位直接截过来,咱们创建一个部工程,然后在里边引入相关的依赖,把这个咱给他快速做到这步啊,我们就完成了,然后完成之后咱们下面继续往下来写,咱看里边的第二步。第二步做什么呢?咱就做一些相关的准备工作,那我们来做一下啊,因为现在我们是基于这种注解编程模型方式做到的,而注解方式中损boot它会自动配置循环容器,默认用的就是net,所以在里边咱一块儿通过损boot可以启动我们的项目,所以咱们先设置一下我们启动的端口号。
04:19
我写一下啊,就是配置启动的。端口号,那这端口号我们就来到它的配置文件中,在里面有一个叫application点,在里面我加一个叫server。点port端口号,比如改一个叫这个8081这个啊,我们做了一个设置,设置它启动端口号,比如我们叫8081啊,当然你可以设置别的端口号。只要不冲突就可以了,这是我们做的第二部分,然后这步做到之后,咱下面往下来做,下面的咱把它的包的结构和相关的类给它创建出来。第三步,创建你的包和相关的接口和它的类,把这个创建,那我们来写一下啊,在里边,比如现在这位置我给他创建包,因为这是它的启动类,就这个啊,那里边我先建第一个包,咱就建一个,比如叫这个安带有咱的实体类。
05:19
然后在里边我再建个包,叫这个controller。就是咱们的C部分,然后比如说我再建一个,比如这部分我就叫这个啊,咱就来一个叫service。这个啊,是我们建的这么一个包的一个结构,然后创建之后,首先咱在安里边先建个实体类,为了咱一会儿操作方便,假如实体类我就叫这个。User就是用户类,然后在user里边加上几个属性,比如说我加一下第一个属性string就是用户名称,然后第二个属性我来一个这么一个SP。啊,就是用户这个性别。
06:01
真的。第三个就是加一个它这个年龄啊,咱来一个in t age,加完之后生成它对应的get和在的方法,把这个都给它生出来啊,咱给它生成一下,当然如果你用那个就是相关的插件logbook更加方便,我现在就给它手动生成一下啊。这些都写出来了,然后写完之后咱们把里边那个有参无参构造也生成,为了方便咱就生成它这个有参构造,因为咱妞的时候可以通过有参往里边设置值,这样的话咱就把这个相关的实体类做了一个创建。啊,就是优色的是几类,这各位能给他快速算出来啊,没有什么难的啊,就是一个类的创业给各位。截过来。就是在里边我们创建了一个实体类。就是咱们这么一个类。然后创建是一类,之后在里边呢,我们再创建里边这个就是swis部分,我们现在咱就不直接去操作数据库了,咱通过swis模拟出这么一个基本效果,那我来写一下啊,在S里边呢,首先我先创建一个interface,就是一个interface接口,但这接口我就叫user。
07:18
Service。这是一个接口,然后在接口里边呢,咱就写上几个基本的方法啊,就是用户这个。操作的接口,那比如说在里边呢,我就写三个方法吧,第一个根据ID查询,第二个查所有,包括第三个咱再写一个保存或者添加操作,那我在里边写一下。首先第一个操作根据ID查询用户,然后这个方法中我写一下啊,我先把这个注释写出来,然后第二个咱再写一个方法。这个方法就是查询所有的用户。然后第三个方法怎么写,一个添加用户,那我们写三个,但是三个方怎么写给大家强调因为咱们现在用的是web flagx里边是基于这个叫reactor进行实现,所以写法跟之前有点区别,来看第一个啊。
08:16
根据ID查询,大家注意根据ID查询,ID一般是不是主键呀,主键查询返回是不是一个值或者一个对象,所以咱们这个反应值我们写什么呢?咱要不写对象,我们加一个叫。Mono,咱说过mono返回是不是零到一个元素,而Lex反应是多个元素,那我加个mono,然后在mono里边我加一个叫S啊,不是是user啊,咱是user。然后这里边加上我们的方法名字,比如我叫get。100ID。在里边传入这么一个ID值,咱就来这么一个int ID这个啊是我们写的里边的这么一个,所以咱们现在把这个我们就给它加上了,根据ID咱们一会儿做这么一个基本操作。
09:11
这个啊,第一个方法,所以各位注意啊,这里边我们反应类型叫mon,咱用到这个函数式编程做法,或者想式编程做法,Mon表示返回零的一个元素,这个啊我们就解出来了,然后选完之后咱再看下一个。下一个是返回所有用户,所有用户是不是有多个呀,所以咱用什么,各位应该知道,咱们讲过是不是用这个叫。Flags,然后flag里边我们也加上这个叫user,然后给方起个名字,比如叫get o。User这里边啊,它所有不需要参数,咱把它的依赖引入,这样的话,这是第二个方法,然后除了它之外,还有第三个咱做一个添加操作,那我来写一下啊添加注意这里边添加咱不需要来成返回值,我也来一个model,然后里边来一个什么注意啊,我写一个叫word。
10:04
就是没有反义值,然后这个方法起个名字,比如叫这个。User info就是添加用户信息在里边,咱添加用户一般传的是个对象,所以对象呢,咱就用这个。Mon。里边加上一个U色,然后这个我们叫U色,这样的话咱就把三个方法做定义,各位注意啊,跟之前区别就是一个元素用mono,多个元素用flags,咱现在就这么来做的,这是我们写的这么一个代码,咱们创建了一个service的接口,里边定义了你这个具体的方法。写一下啊,创建了一个接口,定义了操作的方法。就是咱们刚才看到的这些。把这个啊给各位。复制过来,然后这个做到之后,咱下面就来实现一下里面具体方法,那我现在写下这个interface接口,一个实现类在里边我来个包。
11:09
然后包里边创建它的实验类,我叫user。Service PL,让它实现我们这个接口。然后实验之后,把里边的方法我们做个实验,就是里边的三个方法,那我们最后把三个方法咱给他就完成出来,注意啊,这个写法用到咱们这个。While中或者中的一些情关方法可以做到,那怎么做我写一下啊,因为现在呢,我们现在是模拟数据,咱并没有去操作数据库,所以为了方便啊,我现在这么来做啊,怎么做呢?当你方式有多种方式啊,或者你直接比如我们用买p plus或者买VT的操作数据库,可以我现在直接做模拟,因为咱重点不是讲操作数据库,是讲这个web flagx中的用法。那所以我现在这么来做啊,我在里边呢,创建一个map集合在里边来存储我们的数据,因为咱的操作,因为这样的话更加方便,那怎么做,我来一个private,比如就来一个final,然后咱建个。
12:15
Map map里面加泛型,先加个inag,再加上一个,这个叫user,好,咱就创建。这么一个map,然后给它起个名字,我叫user,等于new上这么一个哈西。Map,把这个map集合创建在这里边,再来存这个数据,因为这样的话更加方便,当用别的方式也能做到,然后创建之后,咱下面往下来做啊,大家注意。就是你看啊,我现在这个类。它是不是一个service接口的实现类啊,那我现在通过这个类那个无参的构造,因为我这类要创建它的无参构造,是不是要执行啊,所以我在无参构造中向这个users的map中来设置它这些值,那怎么设置咱写一下啊,我来一个this.users向map中放置,各位都知道加个put第一个是的key,那就来一个一。
13:15
然后第二个是一个U侧对象,咱就扭上一个user,因user刚才我写了有参构造,咱把几个值给它都传进去。第一个就是它里边那个,咱看一下啊,名称性别和年龄,比如名称我叫Lucy,第二个性别,那咱来一个这个啊,就是男,然后第三个他那个年龄,比如来一个20,这样的话,咱们向脉搏中放一条数据,比如说我们可以再放一个。咱这个值我写个二,就是这个名字,我叫Mary,然后这个来个女,这里边来个。30啊,包括再写,我就写三条记录,咱就能看到这个效果。再写一个,这是三,这个叫杰克,就来个女啊,然后这个值是50,所以咱们现在用map几合,为了咱们操作方便,这个啊构建出来了,构建之后下面写方法,第一个方法根据ID查询。
14:16
那咱们写一下啊,这方法注意怎么做啊,第一个你注意它返回的是什么,是不是这个mon,这么一个就是对象返回是model,那里边我们做过返回怎么做呢?注意啊,我们写法刚刚才写过model里边有个方法,这个方法叫just,是不是向里边是它的元素或者生命元素,或者用这个就是做这个空的处理,因为它的值可以为空,那我们用这个叫just o m体或者用它都可以,然后在里边咱就从这个map中把值取出来,我来一个this.users.get里边传这个ID,然后可以把它值取出来,放到这个,放到里边,这是我们根据ID查询。这写法希望各位熟悉啊,咱刚才提到过mono,它表示零到一个元素可以为空,另外里边可以加上你这个具体的值,这个啊,我们写的第一个,然后第二个咱可以参考它来写,我觉得各位应该能写出来啊,你多个元素就是它是查询多个用户。
15:22
多个用户,那这怎么做?写什么?咱们一起写一下是不是来一个flex,然后在里边点上一个值,因为它查多元素返回的是不是一种集合的形式,集合用什么,咱们演示过,是不是叫from。叫it able是不是用它,然后在里边咱们调这个users里边这个方法,把它只取出吧,就取里边的值,那我们直接来一个VALUE6S,把你这个外中的值都取出来,这样的话是不是一个集合,然后放到这个flag里面去,这是我们的第二个方法,然后第三个做的是一个添加,这写法稍微麻烦点,给各位写一下啊,那怎么做写一下,首先我这名字叫这个user,呃,为了区分我改名字啊,我叫user Mo。
16:12
No啊,改个名字,然后在里面怎么做,咱们现在做法就是因为这是不是一个对象了,咱们把对象中的值取出来,是不是要给它做这个添加,也是把这值最终要放到是不是咱这个。Map机构中去,咱做的就是这个目的,所以我们现在做法就是把这值取出来,然后把它放到咱的map中去啊,就是来做这个事情,那怎么做写下啊,再来一个u Mo点上,叫做do on n。就是从里边取它的值,就是好比说我们做过便利啊,但是它的具体做法是取值,比如给它起个名字,我们来一个叫person,加上一个拉姆的表达式的形式,然后加上之后,咱们现在从里边要做这个,就是往那个map中放值。
17:02
像这个。Map集合里边给它放这个值,但是放的话很简单,咱直接加上这个ID和一个person这个对象是不是可以了,它就表示把这个变成一个person对象,注意这个过程啊,Do on next by,值取到,然后取到之后把它转成这个person对象,就好比说便利,就是它做的其实是一个对象,把对象变成person,然后person放到map中,但是map里边因为它里面有这个ID,所以咱为了能把这值让它不重复,所以咱做一个处理,怎么处理呢?我通过这个叫。Users,点上这个叫size。这是什么意思?是不是得到M的长度,然后把它的长度,比如现在给它加一把这个值。用作它的ID,然后这个用作之后,咱下面通过这个user.put里边放这个ID,还有这个P,这样的话把这值就。
18:05
加到里面去,然后接完之后咱可以做一个空置的处理,就这里边有一个叫Z。安,然后把那个就是相关的值给他。清空mon,就你操作之后,把它里边内容给它就清空了,让它就真正结束了,就咱们说到的,我们做这个mono也好,也好,它能发送多个信号,这个信号中最后是不是要有一个终止信号,如果你没有终止信号,那表示是不是一个无限的数据流,而我现在怎么终止,把这里边只清空它就表示这个就终止了,就是咱说那个终止信号,或者你加个这个叫错误的信号,它也终止,但现在给他来一个M体。这样的话,咱就完成了三个基本操作。这是写下啊,这是添加用户。然后最后咱再看一遍啊,咱再往下来写。这几个操作跟咱之前写法有很大区别,首先第一部分咱们现在三个方法返回类型不一样,第一个ID查询返回model,第二个多有用户flagx添加你model,然后在我们ID查询,就是向里边放这对象,Flagx放这个集合,然后你添加用户为没有反应值,当然过程中需要把这个mon变成一个对象,把对象放到map中,Map里边ID值因为不能重复,所以咱让它的值加一,再往里边放一个值,这样的话把三个方法就完成了。
19:32
然后最后让你这个数据流要结束Mon.M它就可以结束了。这个啊,咱们写了一个实线类,我把这个写到这个位置。就是关于我们这个接口的。实现类里边是咱们刚才的这个写法,所以各位把这个啊去写一写,跟咱之前有很多区别,请各位适应这种写法。这个啊,我们就写出来了,然后这个选之后,咱下面继续往下来做,下面做什么呢?就是现在你看啊,我有这个实体内有service,咱下面是不是要写CR的,在CR里边注入这个service是不是最终作业操作,因为这过程要交给进行管理,所以最后我们写这个就是CTRL部分,那我们来做个编写。
20:22
我写这位置啊,咱们最后就来创建这个CR了,当然我强调虽然说咱用的是web flagx,但是它的CTRL的写法跟咱之前写死亡VC的方式基本上是一样的,那我下面再来做一下啊,首先第一部分因为我service要交为使管理,所以在service上面我先加一个注解,这个就加一个repy。Re,让他交给进行惯例。这个啊,或者你加service也可以啊,我就加这么一个部件,然后加上之后,咱们下面来到这里边,我们建一个controller now来创建controller,起个名字我就叫user。
21:09
CTRL。这个啊,然后创建之后怎么写呢?咱之前VC阶段怎么写,现在就怎么写,首先第一个在你的那上边加个注解,叫这个risk ctrler,这个位很熟悉啊,就是它交给存数管理,并且返回我们的那个交换数据,然后加上之后在里边我们注入这个service。把注进来,那咱加上一个叫做o toy,咱将此文都讲过了啊,里边加一个叫user。Service user service把这个是不是做注入,然后注入之后在里边可以写上咱们那个具体的几个方法,就是指定你的把路径,包括一些其他操作,那大来写一下啊,第一个就是。ID查询第二个。
22:00
查询所有。第三个。添加操作,那我们写第一个ID查询,那查询呢,咱一般用的是不是都是get提交,那我来一个get mapping,然后在里边,比如给它起个名字,假如这个名字我就叫这个user,在user后面传入它的ID址,咱通过路径传输方式。然后这个写完之后,在下面写方法public注意啊,返回什么。什么是不是这个model加个user,因为咱是一个对象,然后这个名字我就叫get user ID。在这里边咱把这个路径中的ID值得到,用一个注解这个pass,这个注解加上一个int ID把这个得到,然后得到之后,咱下面就可以调这个service里边的方法,把这个值最终得到,然后给它做一个返回,那我们来调一下啊。
23:00
我们直接return user所里边的get user白地传递ID值,这样的话CTRL就完成了。第一个方法,咱根据它可以做这么一个访问,第一个完成,然后写第二个,跟上面一样,第二个我也来一个。Get提交,然后里边起个名字,这个名字我就叫,比如我就叫这个user,就叫user了啊,然后在里边咱来一个public,我来一个flags。加上这个U,然后起个名字,我就叫盖头。Users,它不需要参数,然后最终咱做个return return user space里面这个get o user,把它做一个返回,这是我们写的第二个方法,返回flex,因为它是返回N个元素。然后第三个是添加,那我们写的方法添加呢,咱就来一个。POS提交在里边,我也给它起个名字,比如这个名字我就叫这个啊,咱就叫这个。
24:02
SE。就这名字啊,Save user。然后在里边写这方法,我们来一个public,来一个mono,里面加一个word,然后这个方法,比如教这个C。User在save user中要传递我们这个对象,而这对象呢,注意啊,我们传的话呢,经常咱用这种方式,不是各位是否知道啊。叫request的body底,就是用JA形式进行传递,这是什么VC中的一个知识,然后传完之后,咱下面怎么做呢?我们现在因为我们要传到这个。方法中那个大家看啊,是不是一个mono这么一种形式,所以咱家给它先变成mono形式,那怎么变mono。加个user,然后我叫这个user。Mon。等于咱就来一个mon,点这个just里边加一个user。
25:02
这写法就各位应该能理解啊,咱都写过了,然后你把这个直接给它传进来,就能实现出一个减压操作,这样的话咱把它就完成了,最终我们加一个理推。是这个啊。把这个我们就做了一个说明,所以这样的话呢,咱们就完成了里边这个CTRL部分,把这个咱就做到了,我把这个代码给各位分过来。也就是说呢,咱们写到这里为止,咱就基于注解编程这种方式完成了web flag的一个基本使用,然后咱们看一遍,最终咱们给他做一个测试,就看一下最终的效果是什么样的啊。那我们看啊里面的步骤,嗯,从上往下看,第一步引入相关的依赖,就是在这里边我们加上这么一个叫做web blocks第一步,然后第二步在里边我们就是创建了这个配置文件,里面有端口号8081,第三个建实体类S的方法,包括service接口,它的实验类,在实验类中写上它的三个方法,然后方法中注意它返回的类型,最后写CTR了,在CTRL里边调里面的方法,最终把这过程做个实现。所以这样的话,咱们现在就完成了这种基于注解编程方式,然后完成了这么一个web flag的这么一个使用。
26:27
这个啊,我们就做到了,然后做到之后,最后咱们把效果来测试一下,看一下最终的效果什么样,那怎么测试,其实很简单啊,就是现在呢,我们看啊,这是一个spring boot工程里边是不是一个启动类啊,咱通过启动类把它就做这么一个启动啊,那我们检查一下里面这个注点应该都加上就交给S瑞。进行管理啊,这些咱应该都加上了啊,然后咱下面把它就启动一下啊。咱们先把它启用起来,然后我们在浏览器中通过它的地址做个访问,咱就来测试一下它最终的这么一个效果。
27:07
咱先启动。各位看啊,他现在启用端口是不是叫80815,那我下面咱就来仿一下里面这操作,比如现在我们来试一个啊,咱试第一个这个。根据ID行查询,那我到里边给他就试一下啊。来这位直接试了啊。呃,里边我们加一个叫这个。Local host。加上这个叫8081,然后加上这个叫user,后面传入你的I地址,比如咱来一个一,因为一里边有数据,现在我们一回车,大家看在我浏览器上边是不是有输出啊,就是1LUCY这值是不是输出来了,就是里边它把咱们的。这个数据是不出来了,Lucy,那比如说我再试一个,比如现在我来一个三。咱们会车是不是有这数据啊,这也没有错,比如现在我来一个查所有,查所有的话,里边咱写的这个方法名字叫就叫user,那我里边我就来一个叫。
28:11
U,然后咱回车,大家看这三个值是不是输出了,所以这样的话,咱们现在就通过这个注解编程模型方式,把这个web f flagx做了一个基本使用,各位把这个写法给他要特别熟练,跟我们之前的大家就会发现,虽然VC方式是不是特别相似,基本上没有太大区别,就是表面上看是一样的。但其实他们的底层已经完全不一样了,给各位说明啊,怎么不一样呢?就比我们现在你注意啊,如果说咱用之前的方式,损亡维C方式,它是于损亡VC加上S加上Tom he是万过程,但是目前这种方式它叫异步非组的方式,它是基于这个W的while拉X加上RA加上这个叫ne进行实现,所以它里面是完全不一样了,给各位最终写下啊。
29:05
就是最终这么一个说明。我小的位置啊,最后这个。说明就是我们之前我们用那个润MVC的方式。用这种方式我们做个实验,那这种方式呢,它叫做同步阻塞的这种方式它叫同步阻塞,而这种方式呢,它是基于这么几个技术,一个是spring mvc。还有一个叫做这个。就是容器,另外一个叫tomcat,它要用这三个实验出我们这个基本过程,而现在我们做这个叫spring web flags这种方式。实现它是叫什么?叫做异步。非阻塞的这种方式,它是基于什么?它基于就是spring webs加上什么,不是咱们这个叫reactor。
30:11
再加这个叫A。用这种架构就实现,所以跟之前方式已经完全不一样了,他这做到就是异步飞速的方式,以各位把这种方式给他知道,咱就完成了基于注解编程模型做这个web block的这么一个操作。
我来说两句