一、全局异常处理的两种方式
方式一:注解处理异常
- 使用注解@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 "操作成功";
}
方式二: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 "操作成功";
}
二、拦截器
1、拦截器与过滤器的区别
过滤器
过滤器是servlet规范中的一部分,任何javaweb工程都可以使用
在url-pattern中配置/*之后,可以对所有访问的资源进行拦截
拦截器
- 拦截器是AOP思想的具体应用,是SpringMVC框架所有的,只有使用了SpringMVC框架才能使用
- 拦截器只会拦截访问的控制器方法,如果访问呢的是jsp/html/css/js是不会进行拦截的
- 声明拦截器要实现HandlerInterceptor 接口
- 接口中的三个方法
-
- preHandle 预处理方法,在进入控制器之前执行,一般拦截器使用该方法即可
- postHandle 在控制器执行之后执行
- 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");
}
}
- 配置文件
- path: 拦截的地址
- 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、拦截器的执行顺序
测试结果:
三、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("添加成功");
}
}
- 添加
- 删除