00:00
好,然后下面呢,我们就来看一下咱们的第12个内容,叫做异常处理器。那首先呢,什么叫做异常处理器,就是说我们在控制器方法执行的过程中啊,如果说出现了某些异常,那我们就可以通过spring Mac为我们所提供的一个切口,然后来处理这个异常。然后这个接口叫什么?叫handler exception resourcever handler叫处理异常对吧?Exception叫异常,Resourcever叫做解析器,叫做异常处理解析器。好,然后在这个接口里面,它只为我们提供了一个抽象方法,来大家看啊,咱们在这儿,咱们来搜索一下,然后就在这个位置啊,然后呢,咱们大家来看一下,你看这个方法呀,它这里面只有一个抽象方法啊,就是这个叫什么叫resolve exception,叫做解析异常。对吧,干什么的,如果控制器方法在执行的过程中出现了指定异常,那我们当前咱们的exception,然后就可以来处理这个异常。
01:02
关键是大家来看,你看这个方法的返回值是啥呀?叫做model and view。什么叫model and view,对吧?这是我们SPVC里面,咱们执行完控制器方法之后的一个什么统一的一个对象,大家还记得不,源码里面1061行吗?对不对,你执行完控制器方法之后,咱们是不是都会返回一个mode端view对不对?而我们的控制器方法执行完,那我们现在控制器方法有异常了,那控制器方法是不是就没有,是不是它就不会再继续往下执行了,那所以呢,我们现在咱们来解析这个异常的时候,大家注意我们就可以来给它设置一个新的model and view。能看懂吧,好,然后所以说呢,它是什么效果呢?比如说你的控制器方法出现了一个异常,然后我们现在呢,咱们就可以通过异常解析器,然后来对这个异常进行解析,然后解析完之后,然后我们就可以干什么,然后model and view,大家不要忘了,Model的作用是往请求域共享数据,而view的作用是实现页面跳转,我们是不是就可以往预对象中共享了一个新的数据,比如说咱们把咱们的错误信息、异常信息,然后共享到请求域中,然后咱们再通过view来实现一个新的页面跳转,让它跳转到一个新的页面,比如说咱们有专门的错误页面。
02:21
OK吧,好,所以说大家看好这个异常解析器的一个功能啊,非常的方便,它可以来处理控制器方法执行过程中所出现的异常,并且来给它设置一个新的model and view,来实现一个页面跳转,并且共享数据。这样的啊好,那毕竟这东西是一个接口,那我们是不是就需要来找到一个它的实现类来进行使用,当然呢,这个实现类呢,其实大家就是异常解析器,这个东西大家其实你配置也行,你说我不配置行不行也可以,为啥呢?大家注意,因为咱们spring VC中它默认就已经使用了这个异常解析器了,知道吧,比如说然后我们现在呢,咱们来CTRL加H,大家看一下,然后这就是我们当前这个接口它的一个实现类。
03:07
然后我们主要来看的有两个,首先第一个叫做default handler exception recoverver,这个是我们spring VC中来使用的一个默认的异常处理异常解析器,然后还有一个叫simple mapping,然后exception recoverver,叫做简单的映射异常解析器,然后如果大家不想去配置,那SPAVC它默认就是使用这个来处理来处理异常的,如果说大家要想自己去配置某些异常所对应的解决方案,那我们在这就可以自己来使用simple mapping exception来处理,知道吧,好,就这两个实现类啊,那我们先把这个东西给打开,大家注意叫default handler exception overver,然后咱们往下看。然后大家来看一下啊,你看这个东西叫做do resolve exception,但是它所实现的接口里面啊。
04:02
然后它所我们当前咱们的这一个异常解析器最顶层的接口是不是叫做resolve exception是不是对吧,那可见什么呢?可见在当前咱们这个什么继承和或实现的过程中,是不是对方法进行了重写,对吧,我直接跟大家说了啊,他对他进行了重写,重写完之后来调用了这个方法,知道吧。说的吧,调用了这个方法,或者说咱们也可以来看一下啊,然后大家看一看,它是继承了abstract handlera exception overver,然后这个东西呢,又既又实现了咱们的handlera exceptionorver,那不就是它吗?那不就是它吗?对不对,就这个接口啊。好,然后我们来找到咱们当前的这个re,叫做re resolve。来找一下吧,这里面方法还挺多的,对不对,然后大家看一下啊,咱们来找到咱们的reserve exception对吧,你直接往下看,然后大家看一下啊,然后咱们在哪个地方,在这个地方看到没有。
05:03
对吧,然后在我们当前咱们的这个类里面去重写了咱们的reserve exception之后,然后它是不是在这个方法中,这就调用了一个do reserve exception OK吧,行,所以说那我们现在呢,然后大家看你看他在这里面是怎么去重写的这个方法啊,咱们点击之后,大家看这是不是一个抽象方法,那所以说当它然后来继承了它之后,那他就必须要去重写这个方法,然后来对咱们当前的异常进行处理。能听懂不,哎,行啊。好,然后下面呢,大家看一下,你看这里面啊,然后就有咱们一些咱们是见过的啊,比如说你看这第一个叫做http request method,然后not supported exception,这是啥意思。这叫做HTTP的请求方式不被支持的异常。哎,这个大家见过没有,就是咱们那个405嘛,我们之前咱们在讲咱们的a request mapping这个注解的时候,咱们讲过这个method的属性,它是通过我们当前请求的请求方式来匹配请求的,大家有印象吧,对不对,为什么你能看到一个405的页面,你看到的不是一个异常页面,对不对,然后就是因为我们当前咱们spring VC中为我们提供了一个默认的异常解析器,来对我们当前咱们的这个异常呢进行了处理,所以说大家才会看到那个405的页面。
06:30
OK吧,行,这个大家注意好,然后呢,当然呢,那我们现在咱们也可以干嘛呢?那我们现在咱们也可以自己来进行设置,比如说我们这里面大家看你看他为我们处理的异常啊,对吧?然后呢,这些异常大家看一下,这是它默认帮助我们处理的,那如果我们现在咱们有一些对吧,然后我们自己需要处理的异常,那这个时候我们该怎么去做呢?那我们刚才咱们看在看它的这个实现类的时候,我们是不是去看到了一个叫什么叫做simple mapping exception recover对不对,咱们看到了这个啊,然后大家注意这个里面,然后这个就是spring m VC为我们所提供的啥呀,为我们所提供的自定义的异常解析器,知道不好,那这个东西该怎么去做,我们需要把它给配置到我们当前spring VC的配置文件中,好OK,大家看好,咱们就又有配置了啊,来咱们这个拦截器啊,咱们可以先把它给注释掉。
07:30
好,然后注释掉之后,然后我们在这咱们来配置咱们当前的一个叫做异常解析器,大家注意这东西它就是一个BOK吧,咱们不需要设置ID,因为这东西咱们不需要自己访问,我们只需要设置一个class就行。好,然后我们当前要来处理咱们要使用的这个异常解析器叫什么?还有印象没有,叫做simple,叫做simple mapping exception。是不是对吧?然后这里面咱们是需要来设置一些属性的,怎么设置很简单,Property,首先咱们第一个要设置的属性叫做exception mappings,叫做异常映射。
08:11
它的类型呢,是一个properties类型,那我们好像从来都没有给properties类型来赋过值,对不对,然后这个时候怎么写,大家看你看这里面直接就有一个标签。看到了没?然后这就是为properties类型的属性赋值的,然后这里面大家再来看,你看PP,然后这个K就是来设置我们properties里面的键的,然后这标签里面就是来设置我们当前properties里面的值的,这个K写什么?写的是我们当前咱们出现的异常。比如说然后大家看啊,我在这来搜索一下,叫做ari,叫做arithme exception,然后我们把它的全类名呢给复制过来。然后放在咱们当前K的这个位置,看到了没有。
09:02
看到了吧,然后也就是说,如果我们当前出现了咱们的数学运算异常,那我在这个值里面我写的是什么?听好啊,叫做逻辑视图。也就是如果出现数学运算异常,我要往哪个页面去跳?比如说我们现在呢,咱们在time place下面,然后来创建一个HTML叫E,叫做E叫做error.html这叫做错误对吧?好,然后大家看啊,咱们也是来写个h e error.htmok,行,好,比如我们现在咱们只要出现异常,我就我就让它往哪跳啊,往咱们的这个页面去跳,那这个时候大家说我们应该怎么配置呀,在这里面直接来设置咱们的逻辑视图,就叫做error就可以。能看懂吧。好,然后我们现在咱们再来一个重新部署,当然呢,咱们得有异常它才会执行,那所以咱们在咱们的test哈方法里面直接来输出一个一除以零。
10:03
好就完事了,然后现在咱们一个执行大家来看啊。好,然后我们现在咱们来一个刷新,然后大家看你看直接是不是就跳转到了a.HTML里面了,对不对,哎,非常的方便,这东西配置起来非常简单啊,好,然后所以大家来看这是干什么的,然后呢,咱们的这个K,然后来设置的是谁来设置设置出现的异常,或者说来设置咱们要处理的异常,然后它的value,咱们来设置的是谁value,然后来设置出现该异常时,出现该异常时,然后咱们要跳转要跳转的页面,然后所对应的逻辑视图能看懂吗?看所对应的逻辑视图啊。好,OK,那如果说大家还有我们的其他的异常需要处理,就直接往下面去写就行了,这里面大家只需要设置成不同的异常就可以知道吧,行啊,好,那下面呢,我们再来看这里面,这是咱们的第一个属性,第二个属性,大家看咱们需要来配置的是谁?第二个属性啊,然后来配置的一个叫做exception,叫做attribute,什么意思?Exception是异常,Attribute叫属性。
11:27
大家还记不记得在这个接口里面,就是在我们的叫做啊handler exception这个resolvever这个接口里面,它为我们提供的那个那个抽象方法,对吧?它的返回值是个什么玩意儿,它的返回值是不是一个model and view啊,是不是啥叫model and view model and view有几个功能,两个功能一个是往请求域共享数据,还有一个才是页面跳转对不对?你看咱们上面这个实现的是不是页面跳转呀,那下面这个就是往请求域共享数据的,但是它叫什么叫exception attribute干啥的?大家注意这个就是来设置我们当前,因为在这个里面它会默认做一个操作,就是把我们当前咱们的异常信息共享在我们当前的请求域中。
12:14
然后共享在请求域中,而共享数据的时候,大家都知道它需要有键,有属性名,有属性值,属性值是我们当前的异常信息,而我们当前的属性名你怎么来设置,就是通过这个属性来设置的,知道吧,叫做exception attribute,然后这里面咱们可以写个value,比如说就叫做EXOK,大家注意这个ex现在来表示的是啥?它来表示的就是我们当前共享在我们的请求域中的异常信息的属性名,知道吧,所以说我们在l.HTML里面,我们就可以通过TH冒号text。然后来写一个多大括号ex来访问我们当前咱们共享在请求域中的异常信息了,知道吧,好啊来。
13:05
好,现在咱们来一个重新部署。好,然后我们现在呢,大家看好,咱们直接刷新页面就行啊,咱们现在呢,还是来访问test hello,对吧,然后现在来一个刷新,大家看来l.HTML跳过来了,而且下面是不是也把咱们的异常信息是不是给输出了,对不对,好,所以说非常方便,然后呢,我们在这咱们来写一下这个注释,这个功能大家注意是干什么的,是不是来设置设置,然后咱们共享在请求域,请求域中的异常信息的属性名。能看懂吧,好啊,就这么简单,这就是我们当前咱们的异常处理器啊,异常解析器非常简单,就是一个并标签对吧?然后咱们通过exception mappings来设置异常映射,来设置我们当前若出现某个异常,然后咱们要跳转到的页面的逻辑视图,然后呢,还可以来设置我们在请求域中共享的异常信息的这个属性名,那这个时候我们跳转的页面中就可以通过咱们当前的属性名来访问我们当前的属性值了,OK吧,行啊。
14:18
好。嗯,咱们的这个异常处理器呢,就是咱们的异常的处理方式,大家注意有两种方式,首先第一种就是我们的这个叉ML的配置方式,然后当然咱们还有一种呢,是咱们的注解的配置方式,然后下面咱们就来看一下这个注解该如何配置啊。
我来说两句