00:00
我们来看这个。声明式的异常处理,那把这个内容放到这个值站后边呢,是因为我们在解释,呃,这个显的时候呢,需要用到这个指战,OK exception mapping叫什么呀,叫异常映射吧,啊这个配置当前action的声明是异常。什么意思啊,就是如果当前X出问题了,默认情况下就给我显示一个错误页面吧,那你如果要是配置了一个声明是异常出问题了,而且出的这个异常刚好是你声明的怎么样?哎,我就根据这个声明是异常来处理,看一下效果。我们还是以这个为例,这个时候的话呢,我会来调这个。是有方法,目前相安无事,没问题,找一个。
01:03
好的,现在呢,这里边啊,我来写一行代码,大家看int I等于十除以零,存79行,是不是抛异常了呀,数学异常吧,默认情况的样子是这个样子。刷新。直接给我抛给我这么一个页面吧,500呃,By zero,那我们很多时候处理方式呢,是在这里边去加try catch,出异常的话怎么样,不出异常的话怎么样,对吧,但有的时候加这个踹catch,哎,挺麻烦的,那我就来写一个声明是异常。我声明一下,告诉你怎么样了,告诉服装图框架是吧?出了这个问题的话,我应该怎么办啊?Action result前边写一个exceptionping result出错的话我去引input那个结果,去那个引的页面。
02:13
好,这个异常叫什么呢?叫数学异常。我说C来,如果出问题的话呢,我就去input,我们是不是没有一个result叫input呀,我写一个。Name put。目录下的input.jsp再看哈。这个意思是,如果这个action抛出了一个数学异常的话,我就去找名字是in input的这个result,听清了吧?啊,找一个。
03:02
是不是回这个页面了,异常没了吧,那回这个页面我们不甘心呢,你得告诉我出什么异常了呀,把异常信息给我显示出来呀,怎么显示呢?Input,呃,我们首先导入的标签。好吧,这个上边啊,我来打一个。看一看,我要是出一长的话。这SD bug会有什么变化,大家看这个时候在这个直占占顶的好长这个对象我们我们没放过吧,是什么呀,是不是就exception holder啊,看见了吧?哎,还有这样的几个属性,第一个属性叫except sta,再往下翻,第二个属性叫exception,然后才是我们自己放的test吧,然后抓to框架,自己抓to框架放的product吧,对,我是一个TR,因为这个时候在我们这个直站站顶有这样的一个对象叫exception holder,而且它有exception sta跟exception,所以说我就可以用OGL的方式把这两个值给它打出来。
04:36
回来找一个。As property。Value。他不是在那个对象站里边吗?于是exception一个,还有一个叫exception吧,一个exception,我们知道这个exception是一个异常对象吧。
05:06
要翻。它是一个异常对象,异常对象是不是有个get message方法呀,是我可以点。I can。再刷新再找啊,整个上面那个老长的是什么呀,就是那个不是指占叫exception。叫异常的对战。看这这是那个异常吧,这是那个by zero,第一个看起来比较讨厌啊,我给他这个注脚没显示了。这种。是吧,异常和by zero哎,我们可以通过这样的方式来显示这个信息,好了,那这块的话呢,就是我们讲的为什么可以这样显示啊,因为我们有这个,呃,站直站的站顶叫exception holder,它有这样的两个属性,所以说我可以这样显示,那根据我们刚才学的内容的话呢,我们是不是也可以不使用这个。
06:20
OGL而直接使用EL是不是也可以,是不是也可以啊,EL写一个,而且。一个在不准吧,再写一个CTRLC。exception.yc是吧?哎,这个时候这样写的话,就比上面这个这么写要方便找一个。你看一样的啊,这不是吗?后边这个结果也是一样的啊,我们用到了指战里边的这个知识,我们回过来看PPT,我们说except except mapping是配置,当前action的声明是异常。
07:10
那这里边的话呢,有两个元素,一个是exception,指定我需要让抓图框架捕获哪个异常啊,我们配置了一个捕获数学异常,这应该是什么呀,异常的全类名。好了,还有一个是result指定了一个想要结果是我要出众号去哪啊,OK,我去result对应的那个result,什么叫result对应那个result。回来result对应的这个result是吧,就是这个属性值跟某一个result的那个name属性一样啊,出这个异常的话,跑到这个地来。我们也可以来配全局的异常映射跟全局的results什么意思啊,就是说我现在的话呢,我这个result跟这except mapping是不是只能给这个action用啊,哎,我可以配全局的。
08:13
Global ex,我这样配完之后还可以配global ex example,它配完之后的这个情况是什么呀。Global results可以配,可以被每一个action使用,Global except mapping可以被每个action action使用,是这个意思吧,全局的吗?这里边是为什么呀?一个一个的global,这一个一个except mapping。这里边是配一个一个的,就干这个事,那我们这个里面的话呢,我可以把这个移上来。我可以把这个移上去。
09:02
这样的话,我是不是相当于配了两个全局的,配这个全局的之后的话,怎么了,他就可以不配了,出了个错什么错啊。哦,我们看后边这个匹配的方式哈。这是个啥错嘞,他说什么这个global results,然后是global exception,看看这个来global result,然后逗号吧,有顺序吗?然后是global except,然后是action,这个呀,得放这个前面。保存就好了,好再看结果是一样的。当然我们实际开发的时候呢,我们不能把这个东西配在全局啊,我们只是在这块举,为了举这个例子找一个。呃,结果照成好,然后处理的时候呢,我们由这个拦截器来处理,然后我们在页面上,我们相当于在直站里边,我们加了一个exception holder,有两个属性exception跟exception stack,所以说我可以进行打印,那下面的问题就是看看这个拦截器是怎么把这个exception holder放到这个纸站里边的,看一看源码,以及初步体会一下这个拦截器是怎么工作的回来。
10:33
怎么走的呢?找到那个struts default那个文件。在这儿好,往下。我们现在用的这个包。是不是叫ru default呀,对吧,我们继承的是这个附包,放到最后默认用的拦截器站是谁呀,是不是a de呀,往上翻哎,它第一个拦截器叫exception,叫exception拦截器,我们用到它了,好再往上找,找一下这个exception。
11:25
这呢,Ctrl shift d。关联源代码。18TWO2.3.15找一个好了,往下翻,我们想看这个蓝截器上它都干什么了,大家看exception map intercept往下走啊,Intercept的方法是一个重写的方法吧,大家看什么了?它去往后调evocation.evoke就是说往后去执行其他拦截器,最终去调用我们action那个方法,然后我们这个是不是出异常了呀?
12:24
191行,哎,出异常的话呢,他就会把这个异常的信息放到那个值站里边,我们看一下它是怎么放的啊,如果出异常的话,我们会找到一个什么呀,我们会找到跟当前对应的一个exception mapping conig,它对应的应该是什么?Exception mapping config过来我这块配置的这个叫exception making吧,那我们那个exception指的就是这个配置嘛。
13:06
再来好了,找到了这个except的话,于是。看哈,我们会找到我们会设置对应的这个参数,找到这个result,然后把这个result呢给这个发布一下,但自始至终我们没有看到这个往直站里边去放exception holder,看201行。201行是不是一个叫发布exception呢?传了一个传了一个new exception把这个一传进来了吧,这1E就是异常吗。找一下他怎么找的呀。看见了吧,获取值站,把这个压入到直站里边push吗?获取直站,压入到直站里边回来好了,我们可以在。
14:01
这个下一行再打一个断点,这个时候的话呢,我们可以看201行前后这个值站的变化。回来第八个找一个。就是我们初步的体验一下这个运行流程,以及这个拦截器的工作状态刷新。走。这是什么问题啊,这是我们前边的哈,我们前的话呢,我们打过一些断点,好了,回来你看出异常了,这个异常是谁呢?就是这个数学异常吧,好了,然后在这个里边的话呢,有一个对指战的引用,先打开这里边有一个对值站的引用,Invocation。
15:08
是不是有一个指站啊,去找route,大家看现在在那个站顶的还是我们自个儿放那个test吧,OK,好了,代码一行行往下执行,OK,我们找到了一个mapping conig看一下。Mike confiig打开。Name就是那个input吧,我们自个放的吗?Input这个。就是我们那个配置吗?好再往后找。诶,注意现在的话呢,再回过头来看一下这个route,注意在占领是不是还是那个test呀,这行执行完了,注意看哈改了吧,Test前面是不是放的这个except啊好打开。
16:05
打开exception holder有两个属性吧,啊,有一个属性叫exception是吧?Exception里边会有两个属性,一个叫。应该有两个属性啊,Except里里边应该有两个属性,一个叫exception,一个叫except stack吧,那那个属性没有啊,没看着啊,那怎么打印的呀,那一定是在exception holder里边提供了一个get方法。动漫它打印的方式不就是那个get方法吗?于是我们看一下是不是这样。CTRLC回来,比如说已经看完了啊,Ctrl t t ctrl a,找一个line,大家看这不是有一个get方法呀,这是get exception,我们这个B对B的属性的定义,不是靠那个get吗。好了,到这块的话呢,我们整个这个异常处理,从使用到原理我们就都清楚了,那这里边的话呢,用到了我们讲的指战。
17:10
好的发下去,大家把这个看一下。
我来说两句