024 SpringMvc的异常处理
一:说明
1.介绍
Springmvc提供HandlerExceptionResolver处理异常,包括Handler映射,数据绑定,以及目标方法执行。
2.几个接口的实现类
AnnotationMethodHandlerExceptionResolver
DefaultHandlerExceptionResolver
ResponseStatusExceptionResolver
SimpleMappingExceptonResolver
ExceptionHandlerExceptionResolver
当开发的时候,如果配置了<mvc:annotation-driven>时,就默认配置了一下的实现类:
ExceptionHandlerExceptionResolver,ResponseStatusExceptionResolver,DefaultHandlerExceptionResolver
二:ExceptionHandlerExceptionResolver
1.介绍
2.程序
可以做到,出现异常,使用springmvc的注解进行处理异常。
- package com.spring.it.exception;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.ExceptionHandler;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RequestParam;
- @Controller
- public class ExceptionHandlerDemo {
- /**
- *异常处理类
- */
- @RequestMapping("/testExceptionHandlerExceptionResolver")
- public String testExceptionHandlerExceptionResolver(@RequestParam("i") int i) {
- System.out.println("result="+(10/i));
- return "success";
- }
- /**
- * 异常的处理
- */
- @ExceptionHandler({ArithmeticException.class})
- public String handlerArithmeticException(Exception ex) {
- System.out.println("come a exception:"+ex);
- return "error";
- }
- }
3.error.jsp
- <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
- pageEncoding="ISO-8859-1"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
- <title>Insert title here</title>
- </head>
- <body>
- <h3>Error page</h3>
- </body>
- </html>
4.效果
5.页面显示异常的方式
@ExceptionHandler方法的入参中不能传入Map,若是希望将异常的信息导入到页面,需要使用ModelAndView方法作为返回值。
- package com.spring.it.exception;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.ExceptionHandler;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RequestParam;
- import org.springframework.web.servlet.ModelAndView;
- @Controller
- public class ExceptionHandlerDemo {
- /**
- *异常处理类
- */
- @RequestMapping("/testExceptionHandlerExceptionResolver")
- public String testExceptionHandlerExceptionResolver(@RequestParam("i") int i) {
- System.out.println("result="+(10/i));
- return "success";
- }
- /**
- * 异常的处理
- */
- @ExceptionHandler({ArithmeticException.class})
- public ModelAndView handlerArithmeticException(Exception ex) {
- System.out.println("come a exception:"+ex);
- ModelAndView mv=new ModelAndView("error");
- mv.addObject("exception", ex);
- return mv;
- }
- }
6.error。jsp
获取异常信息
- <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
- pageEncoding="ISO-8859-1"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
- <title>Insert title here</title>
- </head>
- <body>
- <h3>Error page</h3>
- ${exception }
- </body>
- </html>
7.效果
8.优先级
如果出现多个异常的处理方法,走哪一个方法呢?
是找与异常匹配度更高的处理异常方法。
9.@ControllerAdvice
如果在当前的@ExceptionHandler处理当前方法出现的异常,则去由@ControllerAdvice标记的类中查找@ExceptionHandler标记的方法
结构:
ExceptionHandlerDemo:
- package com.spring.it.exception;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.ExceptionHandler;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RequestParam;
- import org.springframework.web.servlet.ModelAndView;
- @Controller
- public class ExceptionHandlerDemo {
- /**
- *异常处理类
- */
- @RequestMapping("/testExceptionHandlerExceptionResolver")
- public String testExceptionHandlerExceptionResolver(@RequestParam("i") int i) {
- System.out.println("result="+(10/i));
- return "success";
- }
- }
HandlerException:
- package com.spring.it.exception;
- import org.springframework.web.bind.annotation.ControllerAdvice;
- import org.springframework.web.bind.annotation.ExceptionHandler;
- import org.springframework.web.servlet.ModelAndView;
- @ControllerAdvice
- public class HandlerException {
- /**
- * 异常的处理
- */
- @ExceptionHandler({ArithmeticException.class})
- public ModelAndView handlerArithmeticException(Exception ex) {
- System.out.println("come a exception:"+ex);
- ModelAndView mv=new ModelAndView("error");
- mv.addObject("exception", ex);
- return mv;
- }
- }
三:ResponseStatusExceptionResolvler
1.介绍
2.@ResponseStatus注解的类
- package com.spring.it.exception;
- import org.springframework.http.HttpStatus;
- import org.springframework.web.bind.annotation.ResponseStatus;
- @ResponseStatus(value=HttpStatus.FORBIDDEN,reason="用户名与密码不匹配")
- public class UserNameNotMatchPasswordException extends RuntimeException{
- private static final long serialVersionUID=1L;
- }
3.处理异常类
- package com.spring.it.exception;
- import org.apache.tomcat.util.buf.UEncoder;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.ExceptionHandler;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RequestParam;
- import org.springframework.web.servlet.ModelAndView;
- @Controller
- public class ExceptionHandlerDemo {
- /**
- *异常处理类,test ExceptionHandlerExceptionResolver
- */
- @RequestMapping("/testExceptionHandlerExceptionResolver")
- public String testExceptionHandlerExceptionResolver(@RequestParam("i") int i) {
- System.out.println("result="+(10/i));
- return "success";
- }
- /**
- *异常处理类,test ExceptionHandlerExceptionResolver
- */
- @RequestMapping("/testResponseStatusExceptionResolver")
- public String testResponseStatusExceptionResolver(@RequestParam("i") int i) {
- if(i==12) {
- throw new UserNameNotMatchPasswordException();
- }else {
- System.out.println("conmmon execute");
- }
- return "success";
- }
- }
4.效果
四:DefaultHandlerExceptionResolver
1.介绍
五:SimpleMappingExceptionResolver
1.介绍
2.处理类
- package com.spring.it.exception;
- import org.apache.tomcat.util.buf.UEncoder;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.ExceptionHandler;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RequestParam;
- import org.springframework.web.servlet.ModelAndView;
- @Controller
- public class ExceptionHandlerDemo {
- /**
- *异常处理类,test ExceptionHandlerExceptionResolver
- */
- @RequestMapping("/testExceptionHandlerExceptionResolver")
- public String testExceptionHandlerExceptionResolver(@RequestParam("i") int i) {
- System.out.println("result="+(10/i));
- return "success";
- }
- /**
- *异常处理类,test ExceptionHandlerExceptionResolver
- */
- @RequestMapping("/testResponseStatusExceptionResolver")
- public String testResponseStatusExceptionResolver(@RequestParam("i") int i) {
- if(i==12) {
- throw new UserNameNotMatchPasswordException();
- }else {
- System.out.println("conmmon execute");
- }
- return "success";
- }
- /**
- *异常处理类,test ExceptionHandlerExceptionResolver
- */
- @RequestMapping("/testSimpleMappingExceptionResolver")
- public String testSimpleMappingExceptionResolver(@RequestParam("i") int i) {
- String[] array=new String[10];
- String num=array[i];
- System.out.println("num:"+num);
- return "success";
- }
- }
2.效果
3.解决方式
这个异常可以有SimpleMappingExceptionResolver来处理。
在xml中注册。
出现什么异常转到哪一个页面。
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:mvc="http://www.springframework.org/schema/mvc"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-4.0.xsd
- http://www.springframework.org/schema/mvc
- http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
- <!-- 配置自定义扫描的包 -->
- <context:component-scan base-package="com.spring.it" ></context:component-scan>
- <!-- 配置视图解析器 -->
- <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
- <property name="prefix" value="/WEB-INF/views/" />
- <property name="suffix" value=".jsp" />
- </bean>
- <mvc:annotation-driven></mvc:annotation-driven>
- <!-- 转换器 -->
- <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
- <property name="converters">
- <set>
- <ref bean="employeeConverter"/>
- </set>
- </property>
- </bean>
- <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
- <mvc:default-servlet-handler/>
- <mvc:annotation-driven ignore-default-model-on-redirect="true"></mvc:annotation-driven>
- <!-- 国家化 -->
- <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
- <property name="basename" value="i18n"></property>
- </bean>
- <!-- <mvc:view-controller path="/i18n" view-name="i18n"/> -->
- <mvc:view-controller path="/i18n2" view-name="i18n2"/>
- <!-- 配置SessionLocaleResolver -->
- <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"></bean>
- <mvc:interceptors>
- <!-- 配置自定义拦截器 -->
- <bean class="com.spring.it.interceptors.FirstInterceptor"></bean>
- <!-- 配置拦截器的作用路径 -->
- <mvc:interceptor>
- <mvc:mapping path="/emps"/>
- <bean class="com.spring.it.interceptors.SecondInterceptor"></bean>
- </mvc:interceptor>
- <!-- 配置LocaleChangeInterceter拦截器 -->
- <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"></bean>
- </mvc:interceptors>
- <!-- 配置CommonsMultipartResolver -->
- <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
- <property name="defaultEncoding" value="UTF-8"></property>
- <property name="maxUploadSize" value="102400"></property>
- </bean>
- <!-- 配置SimpleMappingExceptionResolver来映射异常 -->
- <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
- <property name="exceptionMappings">
- <props>
- <prop key="java.lang.ArrayIndexOutOfBoundsException">error</prop>
- </props>
- </property>
- </bean>
- </beans>
4.效果
在页面上可以看到异常的情况。
024 SpringMvc的异常处理的更多相关文章
- SpringMVC 全局异常处理
在 JavaEE 项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的.不可预知的异常需要处理.每个过程都单独处理异常,系统的代码耦合度 ...
- springmvc 中异常处理
springmvc 中异常处理常见三种处理方式: 1:SimpleMappingExceptionResolver处理的是处理器方法里面出现的异常 2 3.自定义异常处理器:处理的是处理器方法里面出现 ...
- springMvc全局异常处理
本文中只测试了:实现Spring的异常处理接口HandlerExceptionResolver 自定义自己的异常处理器 对已有代码没有入侵性等优点,同时,在异常处理时能获取导致出现异常的对象,有利于提 ...
- 012医疗项目-模块一:统一异常处理器的设计思路及其实现(涉及到了Springmvc的异常处理流程)
我们上一篇文章是建立了一个自定义的异常类,来代替了原始的Exception类.在Serice层抛出异常,然后要在Action层捕获这个异常,这样的话在每个Action中都要有try{}catch{}代 ...
- springMVC对异常处理的支持
无论做什么项目,进行异常处理都是非常有必要的,而且你不能把一些只有程序员才能看懂的错误代码抛给用户去看,所以这时候进行统一的异常处理,展现一个比较友好的错误页面就显得很有必要了.跟其他MVC框架一样, ...
- 【Spring】18、springMVC对异常处理的支持
无论做什么项目,进行异常处理都是非常有必要的,而且你不能把一些只有程序员才能看懂的错误代码抛给用户去看,所以这时候进行统一的异常处理,展现一个比较友好的错误页面就显得很有必要了.跟其他MVC框架一样, ...
- 【Spring】SpringMVC之异常处理
java中的异常分为两类,一种是运行时异常,一种是非运行时异常.在JavaSE中,运行时异常都是通过try{}catch{}捕获的,这种只能捕获显示的异常,通常项目上抛出的异常都是不可预见.那么我们能 ...
- Java springmvc 统一异常处理的方案
前言:为什么要统一异常处理?经常在项目中需要统一处理异常,将异常封装转给前端.也有时需要在项目中统一处理异常后,记录异常日志,做一下统一处理. Springmvc 异常统一处理的方式有三种. 一.使用 ...
- 一起学SpringMVC之异常处理
在系统开发过程中,异常处理是不可避免,如果异常处理不好,会给用户造成很差的体验,本文主要讲解在SpringMVC开发过程中,异常处理的相关知识点,仅供学习分享使用,如有不足之处,还请指正. 概述 在S ...
随机推荐
- luogu P1081 开车旅行
传送门 这题的暴力做法显然是照题意模拟,从每个点出发暴力跳.而这个暴跳显然是可以倍增优化的,就是预处理出从每个点,(一开始是A)往后跳\(2^k\)步,能到哪里,以及\(A\)和\(B\)的路程,然后 ...
- CF875D High Cry
传送门 题目要求合法的区间个数,这里考虑用总区间个数减去不合法的个数 假设某个数为区间最大值,那么包含这个数的最长区间内,所有数小于他并且所有数没有这个最大值没有的二进制位,可以按位考虑每个数\(i\ ...
- Java基础中的一些概念理解
同步 和 异步区别 同步和异步通常用来形容一次方法的调用. 同步方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为.而异步方法调用更像一个消息传递,一旦开始,方法调用就会立即返回,调用 ...
- Delpher 必记-delphi环境安装
//Delpher 必记 环境: 安装包: 1.所有第三方控件包放在没有中文名的路径:如F:\DComp 安装包放在对应的版本的文件夹里面(实际中没有分类),然后看安装包的引用路径和输出路径,都要设定 ...
- Picasso的使用
相信做Android开发的对Square公司一定不会陌生,大名鼎鼎的网络请求框架Retrofit就来源于它,今天学习的是该公司出品的图片加载框架Picasso. 项目地址 https://github ...
- 解决ipad连接不上电脑的问题
检查一下信息: 1.iTunes是否安装 2.数据线是否完好 3.检查下图中的两个设备是否开启 4.最后一步是最恶心的:是否关闭了防火墙!!!! 操作步骤如下图示 我就是因为打开了防火墙,所以一直连接 ...
- 【比赛游记】FJOI2019瞎打记
\(\mathrm{day}\) \(-4\) 又是睡到中午才起来,这样下去省选会睡迟的. 然后下午在补 WF2019 的题目,很快就能补完的(大雾). \(\mathrm{day}\) \(-3\) ...
- 边沿检测方法-FPGA入门教程
本节实验主要讲解FPGA开发中边沿检测方法,我们在设计中会经常用到.这个地方大家一定要理解. 1.1.1.原理介绍 学习HDL语言设计与其他语言不一样,HDL语言设计需要考虑更多的信号的电气特性,时序 ...
- win10-Anaconda2-Theano-cuda7.5-VS2013
两天的辗转反侧,终于灵光一现找到了错误. 首先,我在win10下配置好了gpu和cudnn版本的caffe.但是因为win平台的限制,caffe用的不够舒服.因为之前用过一阵子theano,虽然很慢, ...
- Faster rcnn代码理解(2)
接着上篇的博客,咱们继续看一下Faster RCNN的代码- 上次大致讲完了Faster rcnn在训练时是如何获取imdb和roidb文件的,主要都在train_rpn()的get_roidb()函 ...