今天休息我们还是来继续复习吧
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),全局异常,拦截器