项目异常映射搭建

作用:
就是管理项目中的异常,1.抛出异常,2.显示异常信息①普通请求:在页面上显示异常信息,自定义一个异常信息显示页面。 ②ajax请求:返回JSON数据。
那么在做异常映射搭建时就需要了解一下它的工作机制:
在这里插入图片描述

差不多就是这样子。那么说判断请求类型,那怎么去看请求类型呢?
判断依据:就是在浏览器里看request Headers。
在这里插入图片描述

1、从这里就可以看到这是个json,也就是ajax提交的请求。就需要创建一个工具类来判断当前是否是ajax请求。

/**
 * 判断当前请求是否为ajax请求
 * @param request
 * @return
 */
public static boolean   judgeRequestType(HttpServletRequest request){
    //获取表行头
    String acceptHeader=request.getHeader("Accept");
    String xRequestHeader=request.getHeader("X-Requested-With");

    //判断

    return (acceptHeader!=null&&acceptHeader.contains("application/json"))
            ||
            (xRequestHeader!=null&&xRequestHeader.equals("XMLHttpRequest"));
}

嗯因为目前只是学了ssm,这里面异常映射实现方式是基于xml。
2、Spring-web-mvc.xml

<!--配置基于xml的异常映射-->
<bean id="simpleMappingExceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <!--配置异常类型和具体视图页面对应的关系-->
    <property name="exceptionMappings" >
        <props>
            <!--key是属性指定异常的全类名-->
            <!--标签体内写页面的名称-->
            <prop key="java.lang.Exception">system-error</prop>
        </props>
    </property>

</bean>

3、新建一个接收异常信息的jsp页面。

<script type="text/javascript">
$(function(){
$("button").click(function(){
// 调用 back()方法类似于点击浏览器的后退按钮
window.history.back();
});
});
</script>
<div class="container" style="text-align: center;">
<h3>系统信息页面</h3>
<h4>${requestScope.exception.message }</h4>
<button style="width: 300px;margin: 0px auto 0px auto;" class="btn
btn-lg btn-success btn-block">返回刚才页面</button>
</div>

4、基于gson依赖(处理JSON数据)

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.5</version>
</dependency>

5、就是创建异常处理器类

@ControllerAdvice //@ControllerAdvice表示当前类是基于注解的异常处理器类
public class CrowdExceptionResolver {
    //处理新增时账号重复异常
    @ExceptionHandler(value = LoginAcctAlreadyInUserException.class)
    public ModelAndView resolveLoginAcctAlreadyInUserException(
            LoginAcctAlreadyInUserException exception,
            HttpServletRequest request,
            HttpServletResponse response
    ) throws IOException {
        String viewName = "admin-add";
        return commonResolve(viewName, exception, request, response);
    }

    // @ExceptionHandler将一个具体的异常类型和一个方法关联起来
    private ModelAndView commonResolve(
            // 异常处理完成后要去的页面
            String viewName,
            // 实际捕获到的异常类型
            Exception exception,
            // 当前请求对象
            HttpServletRequest request,
            // 当前响应对象
            HttpServletResponse response) throws IOException {
        // 1.判断当前请求类型
        boolean judgeResult = CrowdUtil.judgeRequestType(request);
        // 2.如果是Ajax请求
        if(judgeResult) {
            // 3.创建ResultEntity对象
            ResultEntity<Object> resultEntity = ResultEntity.failed(exception.getMessage());
            // 4.创建Gson对象
            Gson gson = new Gson();
            // 5.将ResultEntity对象转换为JSON字符串
            String json = gson.toJson(resultEntity);

            // 6.将JSON字符串作为响应体返回给浏览器
            response.getWriter().write(json);
            // 7.由于上面已经通过原生的response对象返回了响应,所以不提供ModelAndView对象
            return null;
        }
        // 8.如果不是Ajax请求则创建ModelAndView对象
        ModelAndView modelAndView = new ModelAndView();
        // 9.将Exception对象存入模型
        modelAndView.addObject(CrowdConstant.ATTR_NAME_EXCEPTION, exception);
        // 10.设置对应的视图名称
        modelAndView.setViewName(viewName);
        // 11.返回modelAndView对象
        return modelAndView;
    }
}

类似这样 modelAndView.addObject(CrowdConstant.ATTR_NAME_EXCEPTION, exception);里面的CrowdConstant.ATTR_NAME_EXCEPTION是创建类来管理常量属性名。
总结:

先清楚是什么请求提交。 在类里面写一下判断提交的是什么请求。 配置xml文件和创建自定义异常信息页面。引入依赖创建异常处理器类。
创建一个异常映射能在开发过程中更快的明白错误所在,在用户不正当操作时也能提示用户的一个操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值