开发者社区> ghost丶桃子> 正文

javaweb异常提示信息统一处理(使用springmvc,附源码)

简介:
+关注继续查看

目录(?)[+]

一、前言

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

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

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

这里写图片描述

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

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

$.ajax({ 
    type: "post", 
    url: "<%=request.getContextPath()%>" + "/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<String, Object> map = new HashMap<String, Object>();
            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<String, Object> map = new HashMap<String, Object>();
                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配置文件添加如下配置:

<!-- 框架异常处理Handler -->
<bean id="exceptionResolver" class="com.luo.exceptionresolver.MySimpleMappingExceptionResolver"></bean>

下面我们直接看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代码没什么好解释的,下面我们直接看结果吧:

(1)如果跳转页面过程中出现异常,访问http://localhost:8080/web_exception_project/exceptionForPageJumps.jhtml的结果:

这里写图片描述

(2)如果ajax请求过程中出现异常,访问http://localhost:8080/web_exception_project/index.jhtml,然后,点击业务异常按钮结果:

这里写图片描述

点击其他异常按钮结果:

这里写图片描述

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

<!-- 错误跳转页面 -->
<error-page>
    <!-- 路径不正确 -->
    <error-code>404</error-code>
    <location>/WEB-INF/view/404.jsp</location>
</error-page>

然后404.jsp代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<taglib uri="http://java.sun.com /jsp/jstl/core" prefix="c" />
<html>
<head>
<title>错误页面</title>
</head>
<body>
页面被黑洞吸走了......
</body>
</html>

然后访问一个不存在的连接:http://localhost:8080/web_exception_project/123456.jhtml,结果如下:

这里写图片描述

三、本工程源码下载

http://download.csdn.net/detail/u013142781/9424969




















版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
实战:第十四章:Springboot集成jsp页面报404四种解决方案
实战:第十四章:Springboot集成jsp页面报404四种解决方案
122 0
Webscoket通信,java使用springboot集成,实现页面无刷新消息提示
Webscoket通信,java使用springboot集成,实现页面无刷新消息提示
121 0
在JavaEE项目中设置忽略错误(显示红叉的解决方案)
在Eclipse导入项目时, 由于当前环境的jdk或者是其他的一些原因导致出现一些不影响项目正常启动的报错(多半在JS文件中)
297 0
WEB核心【Servlet配置和注解重构用户登录】第八章
本篇章主要讲Servlet,两个重点:Servlet路径配置,Servlet注解开发,了解内容Servlet继承数及生命周期,Servlet路径配置,ServletConfig配置
50 0
WEB核心【案例:JSP回显信息】第七章
本篇章主要介绍JSP。jsp的概述以及格式,用jsp打印99乘法表,jsp作用域的回显,以及jsp的导包和集合的回显。最后一个案例帮助大家更好的巩固和学习
88 0
WEB核心【response对象(重点),案例:读取WEB工程资源文件】第十一章
本章:主要介绍response对象详情,案例SE 和 EE 读取web工程的资源文件
55 0
springboot基础入门之json转换框架 、全局异常捕捉以及JPA连接数据库
springboot基础入门之json转换框架 、全局异常捕捉以及JPA连接数据库
202 0
全网最全的JavaWeb---EL表达式 没有之一!!!
EL表达式语言是一种简单的语言,提供了在JSP中简化表达式的方法,目的是为了尽量减少JSP页面中的Java代码,使得JSP页面的处理程序编写起来更加简洁,便于开发和维护。
116 0
SpringBoot 实战 (十四) | 统一处理异常
如题,今天介绍 SpringBoot 是如何统一处理全局异常的。SpringBoot 中的全局异常处理主要起作用的两个注解是 @ControllerAdvice 和 @ExceptionHandler ,其中 @ControllerAdvice 是组件注解,添加了这个注解的类能够拦截 Controller 的请求,而 ExceptionHandler 注解可以设置全局处理控制里的异常类型来拦截要处理的异常。 比如:@ExceptionHandler(value = NullPointException.class) 。
199 0
javaWeb第二天~Servlet【既是规范,也是组件】
javaWeb第二天~Servlet【既是规范,也是组件】
57 0
+关注
ghost丶桃子
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载
相关实验场景
更多