SpringMVC注解、xml两种处理异常方式,restful基本使用场景、拦截器的执行顺序于过滤器的区别

285 阅读3分钟

一、全局异常处理的两种方式

方式一:注解处理异常

  • 使用注解@RestControllerAdvice 或者@ControllerAdvice,两者之间的区别在于 前者 返回类型是json后者返回类型不是json
  • 全局异常处理:只要有异常,自动触发,不需要调用
  • ExceptionHandler:异常适配注解,作用在方法上
  • 如果包异常跳转页面,异常方法的返回类型为Sting , return 指定页面即可
package com.zking.controller;
​
import com.zking.util.Results;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
​
@RestControllerAdvice  //数据 返回前台
//@ControllerAdvice   // 数据进视图解析器
public class MyExceptionHandler {
    @ExceptionHandler(NullPointerException.class)
//    跳页面,写String
    public Results  ex1(NullPointerException ex) {
        ex.printStackTrace();
        return  Results.err("空指针异常");
    }
    @ExceptionHandler(ArrayIndexOutOfBoundsException.class)
    public Results  ex2(ArrayIndexOutOfBoundsException ex) {
        ex.printStackTrace();
        return  Results.err("下标越界,越界信息"+ ex.getMessage());
    }
    @ExceptionHandler(Exception.class)
    public Results  ex3(Exception ex) {
        ex.printStackTrace();
        return  Results.err("服务器报错"+ ex.getMessage());
    }
}
  • 测试类
    @RequestMapping("err2")
    public String b() {
        String [] arr = {};
        System.out.println(arr[10]);
        return "操作成功";
    }

注解处理异常.png

方式二:xml方式处理异常(不推荐)

  • 主配置文件
  • 报错只能跳转页面,不能显示异常
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="defaultErrorView" value="WEB-INF/err"></property>
<!--        自定义不同的异常处理页面-->
        <property name="exceptionMappings">
            <props >
                <!--            key类的名称-->
                <prop key="java.lang.NullPointerException">WEB-INF/kzz</prop>
            </props>
        </property>
    </bean>
  • 测试
 @RequestMapping("err1")
    public String a() {
        String s =null;
        System.out.println(s.indexOf("abc"));
        return "操作成功";
    }

xml处理报错异常信息.png

二、拦截器

1、拦截器与过滤器的区别

  • 过滤器

  1. 过滤器是servlet规范中的一部分,任何javaweb工程都可以使用

  2. 在url-pattern中配置/*之后,可以对所有访问的资源进行拦截

  • 拦截器

  1. 拦截器是AOP思想的具体应用,是SpringMVC框架所有的,只有使用了SpringMVC框架才能使用
  2. 拦截器只会拦截访问的控制器方法,如果访问呢的是jsp/html/css/js是不会进行拦截的
  • 声明拦截器要实现HandlerInterceptor 接口
  • 接口中的三个方法
    1. preHandle 预处理方法,在进入控制器之前执行,一般拦截器使用该方法即可
    2. postHandle 在控制器执行之后执行
    3. afterCompletion 请求处理方法完毕后的回调方法
package com.zking.MyInterceptor;
​
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
​
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
​
public class MyInterceptor implements HandlerInterceptor {
//    预处理方法,进入控制器进入之前执行,一般拦截器使用该方法就可以
//    返回true,表示继续流程,false终端流程
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle1");
        return true;
    }
​
//    在控制器执行之后,页面渲染之前执行方法
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("psotHandle1");
    }
//整个请求处理完毕回调方法
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion1");
​
    }
}
  • 配置文件
  1. path: 拦截的地址
  2. exclude-mapping: 不拦截的地址
     <mvc:interceptors>
            <mvc:interceptor>
                <mvc:mapping path="/emps/**"/>
                <mvc:exclude-mapping path="/emps/find*"/>
                <mvc:exclude-mapping path="/emps/find/to*"/>
​
                <bean class="com.zking.MyInterceptor.MyInterceptor"></bean>
            </mvc:interceptor>
        </mvc:interceptors>

2、拦截器的执行顺序

测试结果:

拦截器.png

三、pringmvc中restful的基本使用

  • 定义
  • 使用restful请求,地址栏不需要改变,请求方式不同,如果是查询某一个具体事务,需要带上事物的id,在注解中加载id,restful中注解可以简写,get请求,可以简写成getMapping
  • /*
        suts:表示一种资源,例如:学生
        get : 对该资源做什么请求
    * stus      get 查询全部学生
    * stus/123  get 查询指定学生
    * stus      post :添加
    * stus      put 修改
    * suts/123  delete 删除
    * */
    
package com.zking.controller;
​
import com.zking.util.Results;
import org.springframework.web.bind.annotation.*;
​
@RestController
@RequestMapping("stus")
public class ResutfulController {
​
    @GetMapping
    public Results find() {
        return Results.ok("查询全部成功");
    }
    @GetMapping("{id}")
    public Results find(@PathVariable Integer id) {
        return Results.ok("查询指定学生"+id);
    }
    @PutMapping
    public Results update() {
        return Results.ok("修改成功");
    }
    @DeleteMapping("{id}")
    public Results delete(@PathVariable Integer id) {
        return Results.ok("删除成功"+id);
    }
    @PostMapping
    public Results add() {
        return Results.ok("添加成功");
    }
}
  • 添加

添加rstful请求方式.png

  • 删除

删除restful请求方式.png