00:00
我们再来说一个注解,Matrix variable矩证变量,那什么是矩阵变量,我们来看它怎么用,首先矩证变量应该绑定在路径中,而且呢是路径变量中,比如我们举一个例子,我们现在呢,系统有一个请求叫cars,然后呢,这一块有一个路径变量,然后呢,我们接下来以前我们带参数,我们可以这么来带问号,什么什么等于什么什么and什么什么等于什么什么,我们把这种方式呢,我们称为叫cor string。也就是我们说的查询字符串,好我们要获取这些值呢,我们是使用ant request per,也就是我们来获取请求参数的方式获取的,那还有我们另外一种带的方式,比如我们这个car,我们可以使用矩证变量,首先矩证变量应该绑定在路径中,比如我们整个这个路径来绑定在路径变量中,那整个这个路径变量里边我们可以来这么来写,是分号来,我们以分号来分割一些KV,比如我们这儿来写上一大堆,比如我这个例子呢,想表示,哎,我来找,我们来找所有销售的这个汽车价格呢,大于34万的,然后呢,并且品牌在这些里边的,相当于我给它带了一些查询条件,而我们这种以封号封号的这种写法,我们把它称为矩证变量,矩证变量呢,大家可能见过这个场景,什么场景呢?比如我们以前有一个面试题叫cookie,如果被禁用了,我们现在来做页面开发。
01:31
页面开发,然后呢,Cookie禁用了,然后session里边的内容还怎么找到,Session里边的内容还怎么使用,那现在呢,就牵扯到一个原理,就是说我们cookie session的机制,就是我们给session里边保存了一个东西,Session里边比如我们set了一个AA的值呢是B,然后呢,因为我们每一个人,每一个session都有一个session ID,这个session ID呢,我们叫解session ID,这个解session ID会被保存在谁里边,保存在cookie里边,而cookie呢,又是每次发请求都会携带,每次发请求携带,所以也就是说我们如果cookie没禁用以前,每次发请求他会在cookie里把cookie里边的解3ID给我们带上,服务器呢,按照解session ID找到这个session对象,然后再调用session对象的get方法,就能找到我们session里边的内容,而如果cookie被禁了以后怎么办?比如我们这个cookie。
02:31
对镜解session ID,因为它存在cookie里边,所以解session ID带不上了,解session ID带不上,自然就在服务器里边找不到session对象,找不到session对象就获取不到它里边的这些属性值,那我们接下来还想要访问到呢,我们就可以这么来做,比如我们来访问一个路径杠ABC,然后呢,既然cookie上代不了了,我们可以以矩证变量的方式,我给它带一个解CID,等于叉叉叉,这样呢,我们把这种行为我们称为路径重写,也就是我们的URL重写,我们通过URL重写的方式可以来解决我们页面cookie禁用的问题,相当于把我们cookie里边的所有值路径重写,也就是把cookie的值,Cookie的值我们使用cookie的值使用咱们什么呢?使用咱们这个矩证变量的方式传递过来,使用咱们这个矩阵变量。
03:23
取证变量变量的方式进行传递,因为如果我们使用请求参数的方式进行传递,就跟普通的请求参数没法区分了,而我取证变量呢,一般都是代表cookie里边的KV,所以呢,我这样一传递以后,那我们想要获取值怎么办呢?那我们的传递规则是这样的,首先你所有的这个东西都是绑定在路径变量中的,而你的整个访问路径呢,还是这样看,比如我们的这个路径呢,叫C,我们想要销售东西,想要销售东西,但这个大括号呢,只是语法,我们真正的呃写法是这样,我们要卖车车的这些,呃,我们cookie里边的属性呢,比如我举一个例子是这些,那我们的这个写法就是K等于V,如果一个K有多个V,我可以用逗号分割,也可以用另外一种写法,一个K等于多个V,一个K等于一个V,分号一个K等于一个V,分号一个K等于一个V,就是大家如果见到分号后边的所有东西,这都是。
04:23
举证变量的方式,然后呢,另外举证变量也可以这么来写,比如我写了一个请求boss,哎,我找的一号老板,但是呢,一号老板的年龄我要找咱们在20年龄大于20岁的我们的这个一号老板,所以我可以使用举证变量方式带,然后呢,我们在他下边还有请求,比如我们这个请求的路径呢,可能是这样,BOSS1。下边呢,找他的第二个员工BOSS12,这是我们准原本准备的这个路径,但是呢,我们在二号里边,我们也可以来查年龄等于20的,这就是我们说的整个矩阵变量,矩阵变量要看呢,要跟路径放在一起看,比如他们呢,整个是一个整体,然后呢,分号前边是我们真正的访问路径,封号后边是矩证变量,举多个变量又以分号区分,好,那这是我们矩阵变量的用法,那我们在spring mvc里边能不能获取到矩阵变量的值呢?我在这来写了几个测试,Cost,然后呢,漏等于什么什么,然后carce什么什么等于什么,好,我在这来做一个测试,我们来专门来写一个方法,Public string,我们这个就叫car sell。
05:36
我们来处理我们的这个请求,首先呢是get map get map,我们要处理的请求叫cars,然后呢,Cell,只不过这个cell呢会带很多的矩阵变量,而不是请求参数,然后呢,为了方便,我也把所有的东西呢,以map的方式返回,并给它打印出来就行了。这样呢,我们就直接在浏览器上返回的数据,我们就能确认我们得到对不对,那首先我们来看第一个,如果我以第一种方式CTRLC过来,过来的话呢,那接下来我们来获取一下矩证变量里边的值,首先我们来获取第一个漏值,那它是一个in,我就可以来写一个。
06:17
我们的这个load值,然后呢,还有一个string,品牌的值,因为品牌呢有多个值,所以我应该写一个list类型的string list类型的咱们这个string,这是品牌的值brand,然后呢,但是这两个东西呢,它不是请求参数,是矩证变量,所以呢我们必须写max variable矩证变量,我取出矩证变量里边谁的值它的值和矩证变量里边谁的值matrix variable,然后呢,还有另外一个叫它的纸。然后呢,我们来测试一下我们这个取证变量能不能使用put,如果我们获取到load值了,我们来给它放里边打印一下,我们最后在页面确认看有没有这个漏值,然后呢,如果我获取到品牌的值了,我们来给它。
07:06
打印一下,好,我们来做一个测试。那首先这是第一个,这是矩阵变量的语法,那就是这样,我们整个路径后边以分号的方式来带,这是它的语法。然后呢,我们想要获取就是matrix variable,我们现在来做一个测试。我们来到我们的这个首页刷新,好,我们来点第一个链接maris variable点过来,然后呢,我们来看carce这个请求没问题,但是呢,我们页面报了一个错,错误呢是400叫Miss,相当于他没有找到名为漏的这个矩证变量,那为什么没找到呢?原因就是在于大家得注意点,就在这MVC默认不是spring m VC spring boot是默认禁用掉了取证变量的功能,默认是禁用了取证变量的功能。
08:01
所以呢,我们需要呢,手动开启,手动开启,那怎么手动开启,相当于就要牵扯到我们定制化spring boot底层的这个东西,特别呢,我们boot底层用的是spring MC,现在我们要定制化spring mvc里边的这个组件来完成这个功能,那怎么定制化,我们来到spring mvc的自动配置类web mvc auto configuration,哎,我们之前呢,给大家看过,所有的自动配置都在这,然后呢,核心在这儿,我们有一个这个configuration,它呢会给我们在这儿有一个东西我们来看啊,它在这呢,Confi pass match,现当配置配置我们这个路径映射,而配置路径映射呢。我们来就要修改一下配置咱们这个路径匹配的规则,因为路径匹配规则里边啊,我们先来给大家说原理,一会儿再来说为什么,然后呢,它里边呢,有一个UR的pass help,翻译过来呢,叫URL的这个路径帮助器,这个帮助器里边呢,有一个属性叫remove这个SIM,我们的content像移除封号内容默认的是处,而这个移除封号内容又是什么呢?我们点过来,来到他set方号看一下它如果我们这个封号内容要被移除,也就是说他会把封号后边的所有我们请求路径后边的所有这个东西就给它截掉了,相当于呢,他就忽略了路径变量默认是true的,所以呢,我们在底层,因为有一个这个URL pass helper。
09:28
底层呢,我们这个手动开启,我们先要知道原理,就是对于我们整个路径的处理,对于咱们这个路径的处理,对于咱们整个路径的处理,然后呢,都是使用我们的这个叫URL pass helper来进行解析的,而这个pass helper里边呢,又有一个自定义属性,就是我们的这个加我们的remove啊,就是这个属性,而这个属性呢,就是来支持矩阵变量的,它的意思翻译过来就是要不要移除我们的这个矩证变量的,这移除封号里边的内容,它翻译过来叫移除封号内容,移除封号内容,那我们呢,千万可不能让他这么做,所以我们就得自定义,如何自定义,那就回到我们以前的这个文档,我们spring mvc呢,Spring boot对它自动配置了很多,想要自定义,人家boot说了三种方案,第一种方案你不使用enable mvc。
10:28
去助器使用configuration加web mvc config你就可以来自定义规则,你可以自定义哪些呢?比如拦截器,格式化器等等这些东西你都可以自定义,但是呢,不能加我们这个注解,相当于我们只要在容器中,因为conig r代表我们这个东西呢,是容器中的一个组件,只要容器中呢有一个叫web mvc confi这个组件,然后呢,你去来定制化就行了,我们CTRLC来看一下web mvc confi是什么,诶我们发现呢,它其实是一个接口,这个接口里边呢,定义了一个方法叫configu pass match,而我们web mvc auto configuration的时候,大家注意它呢给容器中。
11:08
自动配置了一个这个类,这个类呢,也是实现了web mvc con f这个接口的,它呢在这定义的时候,它在这定义的时候,定义我们整个的这个路径映射规则的时候,这个UR PA helper,相当于它是用的默认的,默认是移除内容的,所以呢,我们只需要放一个我们。我们的这个web m VC confi,那我们想要自定义呢?那就两种写法,既然是给容器中放一个这个组件就行,所以呢,两种写法,第一种写法我们使用ant be的方式给容器中放上这么一个类型的组件,第二种写法我们也可以,因为我们这个本身就是一个配置类,我们让这个配置类呢,继承web mvc,不是继承是实现web mvc,因为它是一个接口,然后呢,又由于我们这个JDK8由我们这个接口的默认实现,所以呢,我们无需把接口每一个方法都实现了,我们只需要修改我们要修改的方法,就是这个con pass match,配置我们这个路径映射规则。
12:10
好,我们在这呢,就可以来重写一个它的这个路径映射规则,Config pass match。然后呢,在这个里边con里边,我们来可以set一个ul pass help,如果我们这个路这个URL的这个路径帮助器,因为它给我们默认的这个路径帮助器是禁用掉这个规则的,我们把这个路径帮助器拿过来,这一块呢,大家肯定觉得这个原理比较麻烦啊,或者很懵,但是我们先照着这么来做,我一会儿探究原码就能看到,然后呢,这个路径帮助器们来CTRLV粘过来,而且你一来到这个路径帮助器的方法CTRL f12,你就会发现这个方法里边呢,有很多功能,比如能给我们来编码,诶编解码,这就是解码我们的路径变量,这哎,这是解码路径变量,解码矩证变量,还能解码我们的这个请求字符串啊等等等等,所以呢,我们这个帮助器有很多的功能。
13:07
那么来到我们的这个自定义这个帮助器,我们被设置进去了,但是呢,有一个最重要的一点,就是一定要set remove啊,这个SIM content把它设置为false,因为默认呢是移除内容封号后边的内容的,我只有把它设置成false,我们相当于设置为不移除,不移除封号后边的内容,这种情况下呢,我们的这个举证变量,举证变量才能生效功能就可以生效,所以呢,我们是这种配置办法,哎,我们说除了我们这种写法,还有另外一种写法,我们把这两种写法自定义的写法我们都给大家演示一遍,我呢可以不这么来写,我们就给容器中直接放一个这个类型的组件都行,反正呢这两种写法都行,我就给容器中放一个web mvc。
14:00
然后呢,Return,我就直接拗一个web mvc con,我直接拗一个接口,因为接口呢有默认实现,所以呢我只需要实现上一个方法,就叫con pass match,然后呢,同样我们之前这一块咋写的,在这继续咋写好,我们就直接自己来写吧,主要是这个configgu里边点一个set u pass helper,然后呢,这个pass路径的helper我们得扭过来,Pass helper等于又一个ul pass helper。然后呢,我们把这个pass走弄过来。好,然后这是我们的这个pass helper,第pass help我们拿过来以后呢,主要给它设置点set remove的这个content,我们在这呢整一个false,让不移除封号后边的这个内容。这个呢非常重要,这样我们这个路径变量功能就生效了,我来启动测试一下,不,不是路径变量,是我们的矩证变量的这个功能就生效了,我们来到这看我们这个卡cel能获取到矩阵变量的值。
15:10
我们重新来测试一下。我来重新刷新好,一刷新呢,它变成了404,意思我们这个请求找不到,找不到原因,大家一定要记住,我们这个取证变量是要绑定在路径变量中的,所以呢,我们这个C不能直接写C,要写成我们的这个路径变量的表示法叫pass,所以我这儿呢,有一个故路径变量,这个路径是什么?然然后呢,在路径变量里边绑定了取证变量,我们就能解析掉,而且呢,我们这个路径到底是什么,我们也可以拿到我们的这个路径的内容。我们使用pass variable,我们来看我们真正的访问路径,真正的访问路径它呢,是把后边的封号也算成路径的一部分,还是真正的访问路径?就是这一块,我们可以来确认一下map,点一个put,我们把我们的这个路径拿过来放在这儿。
16:05
走。相当于呢,我们这个案例让我们认识了在spring mvc底层的一个组件叫URL pass helper,我们这个路径的这个帮助器,这样呢能帮我们来干很多事情,我们CTRL f12看它方法的时候,它能帮我们来解析矩阵变量,对吧?解析矩阵变量,包括解析pass variable都是它的方法,我们后来看源码也可以为它来打一个断点,好,我们现在来测试,来重新刷新走。哎,我们发现呢,现在好的,我们获取到的路径就是这就是这没问题,然后呢,路径里边的矩证变量的内容我们也获取到了,没问题,包括呢,我们矩阵变量,我们说有多种写法,如果我一个东西有多个值,那就继续分号这个东西的多个值,哈哈,回撤,所以呢,我们就能获取到多个值,甚至于什么呢,我们还有另外一种办法,就是我们的这个,如果你遇到了这种麻烦事,就是呢,我们一个矩证变量,矩阵变量呢,相当于有两个A这样的值,然后呢,我绑定了两处变量,我来给大家测试一下这个,哎,这个还是比较好玩的。
17:13
走,然后呢,我们来测试一下pass,呃,我们来还是返回我们的这个,呃,Map。我们就叫这个boss请求,然后呢,我现在发请求,相当于呢,我来处理这个类型的请求,Get map get map,然后呢,我们的路径是boss boss下边呢,首先有第一个路径变量,这相当于是boss的ID。Boss ID,然后呢,接下来还有第二个路径变量,假设呢是员工的ID,然后呢,每一个路径变量上又有相同的举证变量名字,如果我们都使用maris variable来取age,感觉是不是就有歧义?我们来看一下,如果举证变量遇到了相同名字来进行获取,我们该怎么处理。
18:02
好,我现在来获取一下啊,我现来获取我们的这个age值,Inte,我们的这个a boss age boss的年龄,还有我们的我们的EP他们的年龄。首先呢,我们来看boss的age在哪来at一个matris variable,我来获取一个矩证变量,矩证变量呢,这个变量名叫age,但如果我直接这么来写,跟我下边要获取员工的这个edge,我来写edge,这两个呢,到底是我们要一一对应啊,一号获取的boss edge应该是一路径里边的,二户获取的员工edge,二路径里边的不能乱,所以我们这种方式怎么写,这有一个matris variable,它里边呢,有一个叫pass VAR相当于路径的这个变量,我们可以在这来指定我的这个矩阵变量啊,我获取H的值,但是它呢,它是获取哪个路径变量下的H的值,我是来获取boss ad,它这个路径下的H值要bos a。
19:02
Ad呢,相当于是这个路径电量部分它的H值,那就能获取到这儿,所以呢,第二个我们就可以使用这个pass VAR,我们来获取到我们EP这个路径里边的EPH的值,我来map来获取一下点put。Put,我们这个boss age,我们来看我们得到的对不对,这是我们的boss age,还有我们的map.put我们的EP。我们的EPH,好,我们来启动测试。来测试一下我们的这个请求,取证变量带了boss ID带了epd。我们的这种办法。所以大家注意,我们举证变量呢,要能生效,我们在这儿请求映射的时候,一定要用路径变量。我们举证变量。矩阵变量必须。必须啊,URL有URL路径变量,有咱们的URL路径变量才能被解析。
20:09
被解析,我们直接写这个啊,路径在这儿呢,它会找到404好,那我们现在呢,在这儿整整好了以后,我来同时来测试一下我们的这个请求取证变量。Boss的这个点进来,好,我发现呢,Boss的H是20,我们这个EP的H是十,所以这就是我们说的,诶,你可以来指定获取我们每一个,如果我们不指定啊,那我们获取的默认都是我们第一个H值,这样呢就没办法区分了,这是我们说的整个路径变量,这里边呢,我们最多应该掌握的就是我们可以来自定义啊,我们如何来进行我们spring mvc底层规则的这个自定义,就可以这么来做,但为什么我们自定义这样就能生效,我们可以后边再来说原理。
我来说两句