一、异常处理

当一个 Servlet 抛出一个异常时,处理异常的servlet可以从HttpServletRequest里面得到几个属性,如下:

1.javax.servlet.error.status_code:该属性给出状态码,状态码可被存储,并在存储为 java.lang.Integer 数据类型后可被分析。

2.javax.servlet.error.exception_type:该属性给出异常类型的信息,异常类型可被存储,并在存储为 java.lang.Class 数据类型后可被分析。

3.javax.servlet.error.message:该属性给出确切错误消息的信息,信息可被存储,并在存储为 java.lang.String 数据类型后可被分析。

4.javax.servlet.error.request_uri:该属性给出有关 URL 调用 Servlet 的信息,信息可被存储,并在存储为 java.lang.String 数据类型后可被分析。

5.javax.servlet.error.exception:该属性给出异常产生的信息,信息可被存储,并在存储为 java.lang.Throwable 数据类型后可被分析。

6.javax.servlet.error.servlet_name:该属性给出 Servlet 的名称,名称可被存储,并在存储为 java.lang.String 数据类型后可被分析。

可以通过request.getAttribute()获取这些参数

假如:一个servlet中产生一个 java.lang.NullPointerException异常:

那么上述属性返回值如下:

1.javax.servlet.error.status_code:500

2.javax.servlet.error.exception_type :java.lang.NullPointerException   假如第五条返回一个实体 :Throwable throwable = (Throwable)request.getAttribute("javax.servlet.error.exception");那么throwable.getClass().getName()得到的和本条一样

3.javax.servlet.error.message:null   假如第五条返回一个实体 :Throwable throwable = (Throwable)request.getAttribute("javax.servlet.error.exception");那么throwable.getMessage()得到的和本条一样

4.javax.servlet.error.request_uri: /world (地址栏中除了servlet上下文剩余的部分)

5.javax.servlet.error.exception:  java.lang.Throwable

6.javax.servlet.error.servlet_name:HelloWorld;你在web.xml中配置的servlet名称

Web 容器通过在web/xml中配置的<error-page>标签来处理异常(决定由哪些servlet来处理异常);

<error-page>下面有两类三个标签,一类是<error-code>和<exception-type>两个标签,一个是<location>一个标签,共计三个。

<error-code>和<exception-type>是用来判断当前<error-page>捕获哪些异常,<error-code>是通过错误码捕获,如404,403之类的,<exception-type>是通过抛出的异常类捕获,如java.lang.NullPointerException之类的,如果想用一个<exception-type>捕获所以抛出的异常,可以使用上图所示的java.lang.Throwable,因为java所有的异常都是继承此类(目前只知道捕获不了404,感觉是因为404是找不到对应的servlet,并不是servlet抛出了java异常,所以捕获不了)

<location>指向你准备用来处理异常的Servlet ErrorHandler。

Servlet ErrorHandler和普通的servlet定义方式一致,web.xml中配置方式也和普通的servlet配置方式一致

<location>标签和<sevlet-mapping>的<url-pattern>的关系可以理解为,<location>可以理解为地址栏中除了servlet上下文的剩余部分连接,当servlet容器发现错误时,就会通过对应的<location>,像是在地址栏中又输入了一次新的连接(实际地址栏中的连接是不会变得),然后再次与web.xml中的<servlet-mapping>匹配,通过<servlet-mapping>找到对应的处理错误的servlet,不管你是不是用来处理错误的,也就是说只要正常的servlet能匹配上,也会继续执行。正常的servletA的映射是/a,处理异常的servletB的映射是/b,如果你的配置的<error-page>的<location>指向/a,那么servletA也会正常执行。所以你在web.xml中配置<location>时,会自动给你提示你的程序里面已经配置好的<servlet-mapping>让你选择,如果你自己随便写,那么异常处理将不能正常进行,因为通过你写的<location>无法找到对应的servlet,(就像url找不到对应的servlet一样).

<location>标签和<sevlet-mapping>的<url-pattern>的匹配方式和正常的url的匹配方式大致一致,精确匹配,路径匹配,扩展名匹配和缺省匹配四种都是用,如果你写的有缺醒匹配<url-pattern>/</url-pattern>,异常处理的是<location>/</location>,处理异常是也会使用servlet容器的内建default servlet,除非你写的是/a,没有对应得servlet-mapping,才会匹配上你写的缺醒匹配,虽然我也不知道为什么,

<servlet>,<filter>,异常处理的关系:配置filter时,<dispatcher>指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST,INCLUDE,FORWARDERROR之一,默认REQUEST,如果过滤器所拦截的资源被 Servlet 容器调用的方式不是error,那么当你通过异常处理调用servlet,对应的filter将不会执行

还有一个问题:捕获异常后交由处理异常的servletA,假如servletA再出错,那么将不会再次被捕获

假如一个异常会被两个<error-page>捕获,那么后一个在web.xml中配置<error-page>对应的servlet会执行

servlet(4)异常处理的更多相关文章

  1. Servlet的异常处理

    Servlet 异常处理 当一个 Servlet 抛出一个异常时,Web 容器在使用了 exception-type 元素的 web.xml 中搜索与抛出异常类型相匹配的配置. 您必须在 web.xm ...

  2. Servlet的异常处理机制

    一 声明式异常处理   在web.xml中对声明对各种异常的处理方法. 通过 <error-page>元素来声明. 此元素的结构如下:                    +------ ...

  3. Servlet 笔记-异常处理

    当一个 Servlet 抛出一个异常时,Web 容器在使用了 exception-type 元素的 web.xml 中搜索与抛出异常类型相匹配的配置. 必须在 web.xml 中使用 error-pa ...

  4. Servlet之异常处理

    当一个 Servlet 抛出一个异常时,Web 容器在使用了exception-type 元素的 web.xml 中搜索与抛出异常类型相匹配的配置. 前提是必须在 web.xml 中使用 error- ...

  5. SpringMVC框架下的异常处理

    在eclipse的javaEE环境下:导包.... 1. 在 @ExceptionHandler 方法的入参中可以加入 Exception 类型的参数, 该参数即对应发生的异常对象 2. @Excep ...

  6. Java web的几种异常处理 (转)

    一.在servlet容器中处理异常 以下两种方式: 1. 在web.xml定义异常处理  如果没有在web的应用中作异常处理,那么异常就会抛给Servlet容器,应该说此时Servlet容器是处理异常 ...

  7. Spring系列(七) Spring MVC 异常处理

    Servlet传统异常处理 Servlet规范规定了当web应用发生异常时必须能够指明, 并确定了该如何处理, 规定了错误信息应该包含的内容和展示页面的方式.(详细可以参考servlet规范文档) 处 ...

  8. servlet 核心技术

    servlet 核心技术 servlet 生命周期 在 servlet 生命周期中,servlet 容器完成加载 servlet 类和实例化一个 servlet 实例,并通过3个方法来完成生命周期中的 ...

  9. Spring MVC—拦截器,文件上传,中文乱码处理,Rest风格,异常处理机制

    拦截器 文件上传 -中文乱码解决 rest风格 异常处理机制 拦截器 Spring MVC可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必须实现HandlerI ...

随机推荐

  1. 系列文章|OKR与敏捷(二):实现全栈敏捷

    OKR与敏捷开发的原理有着相似之处,但已经使用敏捷的团队再用OKR感觉会显得多余.这种误解的根源就在于对这两种模式不够了解,运用得当的情况下,OKR和敏捷可以形成强强联合的效果,他们可以创造出以价值为 ...

  2. 图像检索(2):均值聚类-构建BoF

    在图像检索时,通常首先提取图像的局部特征,这些局部特征通常有很高的维度(例如,sift是128维),有很多的冗余信息,直接利用局部特征进行检索,效率和准确度上都不是很好.这就需要重新对提取到的局部特征 ...

  3. VUE v-for问题

    今天写一个拖动然后使装备交换的功能,在背包格子里 发现直接设置Bags数组的项,v-for渲染出来的列表不会对应改变,只有设置值才会改变 有点拗口,贴代码吧 var repear = this.Bag ...

  4. JavaScript实现获取两个排序数组的中位数算法示例

    本文实例讲述了JavaScript排序代码实现获取两个排序数组的中位数算法.分享给大家供大家参考,具体如下: 题目 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 . 请找出这两个 ...

  5. [总结]CSS/CSS3常用样式与web移动端资源

    CSS/CSS3常用样式与知识点 IE条件注释 条件注释简介 IE中的条件注释(Conditional comments)对IE的版本和IE非IE有优秀的区分能力,是WEB设计中常用的hack方法.条 ...

  6. CSS HACK 如何书写

    什么是css  hank 由于不同厂商的流览器或某浏览器的不同版本(如IE6-IE11,Firefox/Safari/Opera/Chrome等),对CSS的支持.解析不一样,导致在不同浏览器的环境中 ...

  7. 使用AndroidStudio编写APICloud模块需要注意的地方,解决模块未定义。

    在新的版本下,使用AndroidStudio编写APICloud模块,已经非常简单了,解决模块未定义,最重要的就是要先看官方的视频! 注意在模块的module.json中name很重要,建议做到三统一 ...

  8. (办公)git入门

    git版本库(分布式版本控制系统),可以记录每次文件的改动,是程序开发的好帮手. 1.创建版本库: repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文 ...

  9. bcrypt 安装不成功解决办法

    同一个项目,公司和家里的 node.js 的版本不同,导致项目安装依赖包时 bcrypt 安装不成功. 家里的版本为:8.11.3 公司的版本为:10.14.2 在当前项目中执行完下面两个命令后,报错 ...

  10. django apscheduler在特定时间执行一次任务(run at a specify time only once)

      如何使程序在特定时间只执行一次,我查了一下. celery可以,时间以秒计. task = mytask.apply_async(args=[10, 20], countdown=60) 不过,我 ...