springmvc(5)

今天休息我们还是来继续复习吧
springmvc的东西,加油
自定义异常类
需求:使用自定义异常处理器解决直接向浏览器抛出异常信息问题。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>错误页面</title>
</head>
<body>
    程序执行出错!!!
</body>
</html>

步骤2:创建自定义异常处理类
MyExceptionHandler.java

//如果是纯XML配spring容器中注册全局异常处理器
@Component
public class MyExceptionHandler implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object o, Exception e) {
        e.printStackTrace();//打印异常信息,如果这里不打印,则异常信息无法打印,从而无法准备定位异常
        ModelAndView view = new ModelAndView();        
        //如果是ajax请求
        if ("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))) {
            response.setStatus(500);
            FastJsonJsonView jsonView = new FastJsonJsonView();
            HashMap<String, String> json = new HashMap<>();
            json.put("message","服务器异常");
            jsonView.setAttributesMap(json);
            view.setView(jsonView);
        }else{//如果是普通请求
            view.setViewName("error.html");
        }
        return view;
    }
}

步骤3:测试自定义异常处理类

	@RequestMapping("/")
    public String index(){
        int i=1/0;
        return "download";
    }

第二种:
步骤1:创建全局异常总类

@RestControllerAdvice//返回json格式
public class GlobalExceptionHandler{
    @ExceptionHandler({NullPointerException.class})
    public Result handlerNullPointException(){
        return new Result(false, StatusCode.ERROR,"空指针异常",null);
    }
    @ExceptionHandler({Exception.class})
    public Result handlerException(){
        return new Result(false, StatusCode.ERROR,"服务器异常",null);
    }
}

2:测试

	@RequestMapping("/")
    public String index(){
        User user=null;
        user.getUsername();
        int i=1/0;
        return "download";
    }

拦截器

	spring MVC中拦截器必须实现HandlerInterceptor接口。

			需求:测试spring MVC拦截器的使用。

步骤1:创建拦截器类
public class FirstInterceptor implements HandlerInterceptor {
/**
* 拦截器的preHandle方法会在控制器的方法执行之前执行
* 如果有多个拦截器形成拦截器链,第一个拦截器的preHandle方法执行完成后
* 会按照在XML中的配置顺序向后执行其他拦截器的preHandle方法,最后执行控制器方法
* 该方法的返回值决定了是否放行
* true:放行
* false:拦截,不放行
* 可以使用参数request和response进行跳转
*/
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println(“第一个拦截器预处理方法执行了。。。”);
return true;
}

/**
 * postHandle方法会在控制器方法执行之后执行
 * 如果有多个拦截器形成拦截器链,最后一个拦截器的preHandle方法执行完成后
 * 会按照在XML中的配置顺序倒序执行其他拦截器的preHandle方法,最后跳转到对应的视图
 */
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    System.out.println("第一个拦截器后处理方法执行了。。。");
    request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);
}

/**
 * 视图渲染完成后,拦截器才执行的方法
 */
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    System.out.println("第一个拦截器最终方法执行了。。。");
}

}

public class SecondInterceptor implements HandlerInterceptor {

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    System.out.println("第二个拦截器预处理方法执行了。。。");
    return true;
}

public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    System.out.println("第二个拦截器后处理方法执行了。。。");
    request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);
}

public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    System.out.println("第二个拦截器最终方法执行了。。。");
}

}
步骤2:修改springmvc.xml

  <!-- 配置拦截器 -->
    <mvc:interceptors>
        <!-- 配置具体的拦截器,通过子标签指定用哪个拦截器拦截用户请求中映射的哪个控制器方法,
            如有多个拦截器,需要配置多个<mvc:interceptor>
        -->
        <mvc:interceptor>
            <!-- 配置拦截器拦截哪个方法
                path为拦截器拦截请求中映射控制器方法部分,可使用通配符
                /**:代表拦截任意层路径下的任意方法
                /user/*:代表拦截@RequestMapping设置了一级路径为student的控制器中所有方法
             -->
            <mvc:mapping path="/user/*"/>            
            <!-- 配置拦截器 -->
            <bean class="com.woniu.interceptor.FirstInterceptor"/>
        </mvc:interceptor>
        
        <mvc:interceptor>
            <!-- 拦截所有 -->
            <mvc:mapping path="/**"/>
            <!-- exclude为排除,也就是不拦截哪个方法
            <mvc:exclude-mapping path="/page/*"/>-->
            <!-- 放行部分 -->
            <mvc:exclude-mapping path="/page/*"/>
            <bean class="com.woniu.interceptor.SecondInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

总结:
复习了自定义异常(mplements HandlerExceptionResolve),全局异常,拦截器

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员小小刘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值