一、前言

后台出现异常如何友好而又高效地回显到前端呢?直接将一堆的错误信息抛给用户界面,显然不合适。

先不考虑代码实现,我们希望是这样的:

(1)如果是页面跳转的请求,出现异常了,我们希望跳转到一个异常显示页面,如下:

当然,这里的界面不够美观,但是理论是这样的。

(2)如果是ajax请求,那么我们,希望后台将合理的错误显示返回到ajax的回调函数里面,如下:

$.ajax({

type: "post",

url: "" + "/businessException.json",

data: {},

dataType: "json",

contentType : "application/json",

success: function(data) {

if(data.success == false){

alert(data.errorMsg);

}else{

alert("请求成功无异常");

}

},

error: function(data) {

alert("调用失败....");

}

});

将回调函数的data.errorMsg打印出来:

下面,我们根据上面的思路我们来看看代码的实现。因此本文实例包含了异常自定义分装,为了无障碍阅读下文,请猿友移步先看完博主的另外一篇文章:Java异常封装(自己定义错误码和描述,附源码)。

二、实例详解

本实例使用的环境 eclipse+maven,其中maven只是为了方便引入jar包。

使用的技术:springmvc

在Spring MVC中,所有用于处理在请求映射和请求处理过程中抛出的异常的类,都要实现HandlerExceptionResolver接口。HandlerExceptionResolver接口有一个方法resolveException,当controller层出现异常之后就会进入到这个方法resolveException。

下面我们直接实现HandlerExceptionResolver接口,代码如下:

package com.luo.exceptionresolver;

import java.io.IOException;

import java.io.PrintWriter;

import java.util.HashMap;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;

import com.alibaba.druid.support.json.JSONUtils;

import com.luo.exception.BusinessException;

import org.springframework.web.servlet.HandlerExceptionResolver;

public class MySimpleMappingExceptionResolver implements

HandlerExceptionResolver {

public ModelAndView resolveException(HttpServletRequest request,

HttpServletResponse response, Object object, Exception exception) {

// 判断是否ajax请求

if (!(request.getHeader("accept").indexOf("application/json") > -1 || (request

.getHeader("X-Requested-With") != null && request.getHeader(

"X-Requested-With").indexOf("XMLHttpRequest") > -1))) {

// 如果不是ajax,JSP格式返回

// 为安全起见,只有业务异常我们对前端可见,否则否则统一归为系统异常

Map map = new HashMap();

map.put("success", false);

if (exception instanceof BusinessException) {

map.put("errorMsg", exception.getMessage());

} else {

map.put("errorMsg", "系统异常!");

}

//这里需要手动将异常打印出来,由于没有配置log,实际生产环境应该打印到log里面

exception.printStackTrace();

//对于非ajax请求,我们都统一跳转到error.jsp页面

return new ModelAndView("/error", map);

} else {

// 如果是ajax请求,JSON格式返回

try {

response.setContentType("application/json;charset=UTF-8");

PrintWriter writer = response.getWriter();

Map map = new HashMap();

map.put("success", false);

// 为安全起见,只有业务异常我们对前端可见,否则统一归为系统异常

if (exception instanceof BusinessException) {

map.put("errorMsg", exception.getMessage());

} else {

map.put("errorMsg", "系统异常!");

}

writer.write(JSONUtils.toJSONString(map));

writer.flush();

writer.close();

} catch (IOException e) {

e.printStackTrace();

}

}

return null;

}

}

上面的代码,归结为以下几点:

(1)判断如果不是ajax请求,那么统一跳转到error.jsp页面,否则返回json数据。

(2)如果是业务异常,我们直接打印异常信息,否则,我们统一归为系统异常,如果不明白这里的业务异常为何物,请阅读博主博客:Java异常封装(自己定义错误码和描述,附源码)。

另外,需要在springmvc配置文件添加如下配置:

下面我们直接看controller代码:

package com.luo.controller;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.ResponseBody;

import org.springframework.web.servlet.ModelAndView;

import com.luo.errorcode.LuoErrorCode;

import com.luo.exception.BusinessException;

@Controller

public class UserController {

@RequestMapping("/index.jhtml")

public ModelAndView getIndex(HttpServletRequest request) throws Exception {

ModelAndView mav = new ModelAndView("index");

return mav;

}

@RequestMapping("/exceptionForPageJumps.jhtml")

public ModelAndView exceptionForPageJumps(HttpServletRequest request) throws Exception {

throw new BusinessException(LuoErrorCode.NULL_OBJ);

}

@RequestMapping(value="/businessException.json", method=RequestMethod.POST)

@ResponseBody

public String businessException(HttpServletRequest request) {

throw new BusinessException(LuoErrorCode.NULL_OBJ);

}

@RequestMapping(value="/otherException.json", method=RequestMethod.POST)

@ResponseBody

public String otherException(HttpServletRequest request) throws Exception {

throw new Exception();

}

}

关于controller代码没什么好解释的,下面我们直接看结果吧:

点击其他异常按钮结果:

(3)HandlerExceptionResolver接口并不能处理404错误,这种错误我们再web.xml里面添加如下配置:

404

/WEB-INF/view/404.jsp

然后404.jsp代码如下:

错误页面

页面被黑洞吸走了......

三、源码下载

如果重新创建项目然后各种配置,可下载博主的工程尝试一下:

java web 错误处理实例_javaweb异常提示信息统一处理(使用springmvc,附源码)相关推荐

  1. Springboot基于Java Web的华家医疗器械商城设计与实现 毕业设计-附源码261620

    springboot华家医疗器械商城 摘  要 随着科学技术的飞速发展,社会的方方面面.各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,华家医疗器械商城当然也不能排除在外.华家医疗 ...

  2. java计算机毕业设计ssm基于Vue的二手商品交易网站z40n1(附源码、数据库)

    java计算机毕业设计ssm基于Vue的二手商品交易网站z40n1(附源码.数据库) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstor ...

  3. java计算机毕业设计ssm木棉堂水果电商平台1r83i(附源码、数据库)

    java计算机毕业设计ssm木棉堂水果电商平台1r83i(附源码.数据库) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ ...

  4. Java毕设项目信管专业毕业生就业管理信息系统计算机(附源码+系统+数据库+LW)

    Java毕设项目信管专业毕业生就业管理信息系统计算机(附源码+系统+数据库+LW) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm ...

  5. ​​​​Java毕设项目智慧公寓系统演示录屏2021计算机(附源码+系统+数据库+LW)

    Java毕设项目智慧公寓系统演示录屏2021计算机(附源码+系统+数据库+LW) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也 ...

  6. java计算机毕业设计ssm基于SSM的服装商城系统whe10(附源码、数据库)

    java计算机毕业设计ssm基于SSM的服装商城系统whe10(附源码.数据库) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也 ...

  7. JAVA计算机毕业设计猎头公司业务管理系统的设计与实现(附源码、数据库)

    JAVA计算机毕业设计猎头公司业务管理系统的设计与实现(附源码.数据库) 目运行 目运行 环境项配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也 ...

  8. java计算机毕业设计ssm泸定中学宿舍管理系统设计g93gd(附源码、数据库)

    java计算机毕业设计ssm泸定中学宿舍管理系统设计g93gd(附源码.数据库) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也 ...

  9. java中batch基础_详解Spring batch 入门学习教程(附源码)

    详解Spring batch 入门学习教程(附源码) 发布时间:2020-09-08 00:28:40 来源:脚本之家 阅读:99 作者:achuo Spring batch 是一个开源的批处理框架. ...

  10. java万年历设计报告_JAVA《万年历系统》课程设计报告附源码.doc

    JAVA<万年历系统>课程设计报告附源码 学号<> 课程设计报告 万年历系统专业:计算机科学与技术班级:姓名:学号:指导教师:成绩: 计算机与信息工程系 2014年6月6日目录 ...

最新文章

  1. win 2003 IIS如何防止代码注入
  2. embedding 层的详细解释
  3. 破解前端面试系列(3):如何搞定纸上代码环节?
  4. C++大学教程(第九版)2016-07 保罗·戴特尔 (Paul Deitel)、 哈维·戴特尔 (Harvey Deitel)_cafbe(C++中文版)
  5. linux 内核连接跟踪,Linux内核连接跟踪锁的优化分析(1)
  6. 使用执行程序和ThreadPoolExecutor的Java线程池示例
  7. html+css+js实现关键词随机图片
  8. 将一个普通 JAR 文件打包为 plugin 的一个问题
  9. nginx使用用户真实IP做hash(解决经过CND后ip_hash失效问题)
  10. dhcp服务器批量修改ip租期,dhcp服务器的ip地址租期默认是多久
  11. ubuntu安装hexo博客
  12. python字符串索引必须是整数_python – TypeError:字符串索引必须是整数...
  13. 51单片机初学之流水灯程序
  14. python 企业微信接口_python连接企业微信发送消息
  15. Java基础面试题(2012完整版)
  16. 友盟推送 php,laravel5.4+umeng(友盟)集成app消息推送功能
  17. 计算机在欢迎进不到桌面,win10系统一直在欢迎界面进不去桌面的解决教程
  18. 取模运算性质_数学与编程——求余、取模运算及其性质 | 学步园
  19. 浅析幼儿自我服务能力的培养
  20. 爱可生云数据库管理平台助力车企开启创新云服务

热门文章

  1. Dubbo的failsafe容错策略
  2. 【QT】设计一个秒表(跑步计时器)
  3. EDA和数据挖掘实战:漫威与 DC电影收视率和票房分析
  4. 疑犯追踪第一季/全集Person Of Interest迅雷下载
  5. Maven配置MAVEN_OPTS
  6. 计算机相关国内外文献,计算机外文文献
  7. ps的基础知识与教程
  8. ASO优化|五步解锁关键词选择优化正确姿势!
  9. 区块链入门导航-磨链社区
  10. php里macd预测算法,股票MACD指标算法公式