springMVC对异常处理的支持
2019独角兽企业重金招聘Python工程师标准>>>
无论做什么项目,进行异常处理都是非常有必要的,而且你不能把一些只有程序员才能看懂的错误代码抛给用户去看,所以这时候进行统一的异常处理,展现一个比较友好的错误页面就显得很有必要了。跟其他MVC框架一样,springMVC也有自己的异常处理机制。
springMVC提供的异常处理主要有两种方式,一种是直接实现自己的HandlerExceptionResolver,当然这也包括使用Spring已经为我们提供好的SimpleMappingExceptionResolver和DefaultHandlerExceptionResolver,另一种是使用注解的方式实现一个专门用于处理异常的Controller——ExceptionHandler。
1、实现自己的HandlerExceptionResolver,HandlerExceptionResolver是一个接口,springMVC本身已经对其有了一个自身的实现——DefaultHandlerExceptionResolver,该解析器只是对其中的一些比较典型的异常进行了拦截,然后返回对应的错误码,当然你也可以继承DefaultHandlerExceptionResolver类,然后重写其中的一些异常处理方法来实现自己的异常处理。
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;public class ExceptionHandler implements HandlerExceptionResolver {@Overridepublic ModelAndView resolveException(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex) {// TODO Auto-generated method stubreturn new ModelAndView("exception");}}
上述的resolveException的第4个参数表示对哪种类型的异常进行处理。因为Exception类是所有异常类的基类,所以如果想根据异常类型的不同来进行不同的处理的话,可以在resolveException方法里面根据不同的异常类型进行不同的处理,返回不同的异常视图。如:
public class ExceptionHandler implements HandlerExceptionResolver {@Overridepublic ModelAndView resolveException(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex) {// TODO Auto-generated method stubif (ex instanceof NumberFormatException) {//doSomething...return new ModelAndView("number");} else if (ex instanceof NullPointerException) {//doSomething...return new ModelAndView("null");}return new ModelAndView("exception");}}
定义了这样一个异常处理器之后就要在applicationContext中定义这样一个bean对象,如:
<bean id="exceptionResolver" class="com.tiantian.xxx.web.handler.ExceptionHandler"/>
Spring除了实现了一个DefaultHandlerExceptionResolver之外,还实现了一个SimpleMappingExceptionResolver,这两者都是继承自抽象类AbstractHandlerExceptionResolver,而AbstractHandlerExceptionResolver是实现了HandlerExceptionResolver接口的resolveException方法的,并由此抽取出两个抽象方法,一个是在进行异常处理之前执行的方法prepareResponse(exception, response),一个是进行异常解析的doResolveException(request, response, handler, exception)方法。SimpleMappingExceptionResolver,顾名思义就是通过简单的映射关系来决定由哪个视图来处理当前的错误信息。SimpleMappingExceptionResolver提供了通过异常类型exceptionMappings来进行异常与视图之间的映射关系,提供了在发生异常时通过statusCodes来映射异常返回的视图名称和对应的HttpServletResponse的返回码。而且可以通过defaultErrorView和defaultErrorCode来指定默认值,defaultErrorView表示当没有在exceptionMappings里面找到对应的异常类型时就返回defaultErrorView定义的视图,defaultErrorCode表示在发生异常时当没有在视图与返回码的映射关系statusCodes里面找到对应的映射时默认返回的返回码。在使用SimpleMappingExceptionResolver时,当发生异常的时候,SimpleMappingExceptionResolver将会把当前的异常对象放到自身属性exceptionAttribute中,当没有指定exceptionAttribute时,exceptionAttribute就是用默认值exception。
以下是一个简单的例子:
(1)SpringMVC的servlet配置文件中申明一个SimpleMappingExceptionResolver bean,并通过配置属性exceptionMappings和defaultExceptionView来指定异常和视图的对应关系。
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"><property name="exceptionMappings"><props><prop key="NumberFormatException">number</prop><!-- 表示当抛出NumberFormatException的时候就返回名叫number的视图 --><prop key="NullPointerException">null</prop></props></property><property name="defaultErrorView" value="exception"/><!-- 表示当抛出异常但没有在exceptionMappings里面找到对应的异常时 返回名叫exception的视图--><property name="statusCodes"><!-- 定义在发生异常时视图跟返回码的对应关系 --><props><prop key="number">500</prop><!-- 表示在发生NumberFormatException时返回视图number,然后这里定义发生异常时视图number对应的HttpServletResponse的返回码是500 --><prop key="null">503</prop></props></property><property name="defaultStatusCode" value="404"/><!-- 表示在发生异常时默认的HttpServletResponse的返回码是多少,默认是200 --></bean>
(2)如下访问:
@Controller
@RequestMapping("/test")
public class TestController {@RequestMapping("/null")public void testNullPointerException() {Blog blog = null;//这里就会发生空指针异常,然后就会返回定义在SpringMVC配置文件中的null视图System.out.println(blog.getId());}@RequestMapping("/number")public void testNumberFormatException() {//这里就会发生NumberFormatException,然后就会返回定义在SpringMVC配置文件中的number视图Integer.parseInt("abc");}@RequestMapping("/default")public void testDefaultException() {if (1==1)//由于该异常类型在SpringMVC的配置文件中没有指定,所以就会返回默认的exception视图throw new RuntimeException("Error!");}}
(3)Jsp页面中可以访问到的异常对象,这里以NumberFormatException的返回视图number.jsp作为示例:
<%@ page language="java" import="java.util.*" pageEncoding="GB18030" isErrorPage="true"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><base href="<%=basePath%>"><title>My JSP 'number.jsp' starting page</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body>NumberFormatException. <br><%=exception.getMessage() %><br/><%=exception %><br/><!-- 这是JSP中的内置对象exception --><%=request.getAttribute("ex") %><br><!-- 这是SpringMVC放在返回的Model中的异常对象 --><%=request.getAttribute("javax.servlet.error.status_code") %><!-- HttpServletResponse返回的错误码信息,因为前面已经配置了NumberFormatException的错误码返回值为888,所以这里应该显示888 --></body>
</html>
(4)当请求/test/number.do的时候会返回定义好的number视图,返回结果如下:
2、使用@ExceptionHandler进行处理
使用@ExceptionHandler进行处理有一个不好的地方是进行异常处理的方法必须与出错的方法在同一个Controller里面
如:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;import com.tiantian.blog.web.servlet.MyException;@Controller
public class GlobalController {/*** 用于处理异常的* @return*/@ExceptionHandler({MyException.class})public String exception(MyException e) {System.out.println(e.getMessage());e.printStackTrace();return "exception";}@RequestMapping("test")public void test() {throw new MyException("出错了!");}}
这里在页面上访问test方法的时候就会报错,而拥有该test方法的Controller又拥有一个处理该异常的方法,这个时候处理异常的方法就会被调用
优先级
既然在SpringMVC中有两种处理异常的方式,那么就存在一个优先级的问题:
当发生异常的时候,SpringMVC会如下处理:
(1)SpringMVC会先从配置文件找异常解析器HandlerExceptionResolver
(2)如果找到了异常异常解析器,那么接下来就会判断该异常解析器能否处理当前发生的异常
(3)如果可以处理的话,那么就进行处理,然后给前台返回对应的异常视图
(4)如果没有找到对应的异常解析器或者是找到的异常解析器不能处理当前的异常的时候,就看当前的Controller中有没有提供对应的异常处理器,如果提供了就由Controller自己进行处理并返回对应的视图
(5)如果配置文件里面没有定义对应的异常解析器,而当前Controller中也没有定义的话,那么该异常就会被抛出来。
转载于:https://my.oschina.net/NEMOCoder/blog/607505
springMVC对异常处理的支持相关推荐
- springmvc的异常处理对静态的资源的处理
1 springmvc的异常处理方式,暂时我知道的两种 2 1.在controller中捕获 3 /** 4 * 捕获到异常,用于局部处理 5 * @ExceptionHandler (value={ ...
- SpringMVC 学习-异常处理 SimpleMappingExceptionResolver 类
SpringMVC 学习-异常处理 SimpleMappingExceptionResolver 类 参考文章: (1)SpringMVC 学习-异常处理 SimpleMappingException ...
- SpringMVC 全局异常处理的简单应用
2019独角兽企业重金招聘Python工程师标准>>> 在SpringMVC框架的项目开发过程中,你还在使用 try{} catch(){} 输出异常吗?,那样你就真的OUT了,Sp ...
- springmvc全局异常处理ControllerAdvice区分返回响应类型是页面还是JSON
springmvc全局异常处理ControllerAdvice区分返回响应类型是页面还是JSON 参考文章: (1)springmvc全局异常处理ControllerAdvice区分返回响应类型是页面 ...
- java元婴期(30)----java进阶(springmvc(4)---参数绑定(下)springmvc校验异常处理)
包装类型pojo参数绑定 需求 商品查询controller方法中实现商品查询条件传入. 实现方法 第一种方法:在形参中 添加HttpServletRequest request参数,通过reques ...
- springMVC 统一异常处理异常处理类的使用
在项目开发中各层中都会不可避免的遇到各种可预知和不可预知的异常需要处理,为只专注业务逻辑的实现,需要将异常信息进行统一管理维护处理. springmvc就是将异常层层向外抛出,最后由springmvc ...
- 13.SpringMVC核心技术-异常处理
常用的SpringMVC异常处理方式主要是三种: 1.使用系统定义好的异常处理器 SimpleMappingExceptionResolver 2.使用自定义异常处理器 3.使用异常处理注解 Si ...
- 【SpringMVC】异常处理
文章目录 一.思路 二.简单异常处理器 三.自定义异常处理 1.自定义异常处理类 2.配置 一.思路 系统的Dao.Service.Controller出现都通过throws Exception向上抛 ...
- SpringMVC的异常处理,自定义异常处理器
文章目录 自定义异常处理器 在springmvc.xml配置异常处理器(把创建的自定义异常处理器给Spring容器管理) 使用SpringMVC框架,Controller调用service,servi ...
最新文章
- 如何使用jsp自定义标签 JspTag 使用入门
- C算法编程题(四)上三角
- win10专业版和企业版的区别_深度完美Win10_1809_LTSC.1158_64位企业版V2020.0415
- html优美界面左侧下拉,一组时尚的侧边栏菜单和下拉列表UI设计
- [Qt入门] QPushButton创建
- linux 多核 系统时钟,Linux中的时间
- 架​设​W​e​b​服​务​器
- 可变化的鸿蒙武器,DNF2018史诗改版大全 武器套装改版属性介绍
- 免费2款标注工具实操(内含下载链接)
- 你会买新款 Macbook Pro 么?
- Robot framework之元素定位实战
- 交通灯控制(软件延时法)C语言,智能交通灯控制系统软件部分(49页)-原创力文档...
- linux 内核配置详解
- 【搜素算法02】—回溯法
- 变换AABB的快速算法
- 台式/笔记本无线网卡_异常问题
- 珠海分销系统官网开发笔记:wordpress中使用canonical标签修复版
- TapTap 算法平台的 Serverless 探索之路
- 产品研究:WPS如何在Office的“围剿”下突围
- 从方法到实践,银行如何搭建用户体验管理体系?