ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Spring MVC拦截器与异常处理机制

2022-02-27 22:33:27  阅读:170  来源: 互联网

标签:拦截器 处理 Spring MVC 处理器 ModelAndView 异常 public


目录

1. SpringMVC拦截器

1.1 拦截器(interceptor)的作用

Spring MVC 的拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理后处理

将拦截器按一定的顺序联结成一条链,这条链称为拦截器链(Interceptor Chain)。在访问被拦截的方

法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。拦截器也是AOP思想的具体实现。

1.2 拦截器和过滤器的区别

区别 过滤器(Filter) 拦截器(Interceptor)
使用范围 是servlet规范中的一部分,任何Java Web工程都可以使用 是Spring MVC框架自己的,只有使用了Spring MVC框架的工程才可以使用
拦截范围 在url-pattern 中配置了/*后,可以对所有要访问的资源拦截 在<mvc:mapping path=" "/>中配置了/**之后,也可以对所有资源进行拦截,但是可以通过<mvc:exclude-mapping path=" "/>标签 排除不需要拦截的资源

1.3 拦截器的快速入门

自定义拦截器很简单,只有如下三步:

  1. 创建拦截器类 实现HandlerInterceptor接口
  2. 配置拦截器
  3. 测试拦截器的拦截效果
  • 创建拦截器类 实现HandlerInterceptor接口
public class MyHandlerInterceptor implements HandlerInterceptor{
    public boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handler){
        System.out.println("preHandle running...");
        return true;
    }
    
    public boolean postHandler(HttpServletRequest request,HttpServletResponse response,Object handler){
        System.out.println("postHandler running....");
    }
    public void afterCompletion(HttpServletRequest request,HttpServletResponse response,Object handler){
        System.out.println("aferCompletion running...");
    }
}
  • 配置拦截器
<!-- 配置拦截器-->
<mvc:interceptors>
	<mvc:interceptor>
    	<mvc:mapping path="/**"/>
        <bean class = "com.cs.interceptor.MyHandlerInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>
  • 测试拦截器的拦截效果\
@ResponseMapping("/test1")
@ResponseBody
public ModelAndView quickMethod() throws Exception{
    System.out.println("目标方法执行");
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.addObject("name","bestcollc");
    modelAndView.setViewName("index");
    return modelAndView;
}

测试结果:
    preHandle running....
    目标方法执行
    postHandle running...
    afterCompletion running...

1.4 多拦截器操作

同上,在编写一个MyHandlerInterceptor2操作,测试执行顺序

1.5 拦截器方法说明

方法名 说明
preHandle() 方法将在请求处理之前进行调用,该方法的返回值是布尔值Boolean类型的,当它返回为false 时,表示请求结束,后续的Interceptor 和Controller 都不会再执行;当返回值为true 时就会继续调用下一个Interceptor 的preHandle 方 法
postHandle() 该方法是在当前请求进行处理之后被调用,前提是preHandle 方法的返回值为true 时才能被调用,且它会在DispatcherServlet 进行视图返回渲染之前被调用,所以我们可以在这个方法中对Controller 处理之后的ModelAndView 对象进行操作
afterCompletion() 该方法将在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图之后执行,前提是preHandle 方法的返回值为true 时才能被调用

2. SpringMVC异常处理

2.1 异常处理的思路

系统中异常包括两类:预期异常运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后

者主要通过规范代码开发、测试等手段减少运行时异常的发生。

系统的DaoServiceController出现都通过throws Exception向上抛出,最后由SpringMVC前端控制器交

由异常处理器进行异常处理,如下图:

在这里插入图片描述

2.2 异常处理的两种方式

  • 使用Spring MVC提供的简单异常处理器 SimpleMappingExceptionResolver
  • 实现Spring 的异常处理接口HandlerExcepionResolver自定义自己 的异常处理器

2.3 简单的异常处理器SimpleMappingExceptinResolver

SpringMVC已经定义好了该类型转换器,在使用时可以根据项目情况进行相应异常与视图的映射配置

<!--配置简单映射异常处理器 -->
<bean
      class = "org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
		<property	name="defaultErrorView" value="error"/>   默认错误视图
    	<property name="exceptionMappings"
    			<map>
    					<entry key="com.cs.exception.Myexception" value="error"/>
                    	<entry key="java.lang.ClassCastException" value="error"/>
    			</map>
		</property>
</bean>

2.4 自定义异常处理步骤

① 创建异常处理器类实现HandlerExceptionResolver

② 配置异常处理器

③ 编写异常页面

④ 测试异常跳转

① 创建异常处理器类实现HandlerExceptionResolver

public class MyExceptionResolver implements HandlerExceptionResolver {
	@Override
    public ModelAndView resolveException(HttpServletRequest request, 
    HttpServletResponse response, Object handler, Exception ex) {
        //处理异常的代码实现
        //创建ModelAndView对象
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("exceptionPage");
        return modelAndView;
	} 
}

② 配置异常处理器

<bean id="exceptionResolver"
      	class="com.cs.exception.MyExceptionResolver"/>

③ 编写异常页面

<%@pagecontentType="text/html;charset=UTF-8"language="java"%>
<html>
<head>
    	<title>Title</title>
</head>
<body>
    	这是一个最终异常的显示页面 
</body>
</html>

④测试异常跳转

@RequestMapping("/quick22")
@ResponseBody 
publicvoidquickMethod22()throwsIOException,ParseException{
    SimpleDateFormatsimpleDateFormat=newSimpleDateFormat("yyyy-MM-dd");
    simpleDateFormat.parse("abcde");
}

2.5 知识要点

异常处理方式

  • 配置简单异常处理器SimpleMappingExceptionResolver

  • 自定义异常处理器

①创建异常处理器类实现HandlerExceptionResolver

②配置异常处理器

③编写异常页面

④测试异常跳转

标签:拦截器,处理,Spring,MVC,处理器,ModelAndView,异常,public
来源: https://www.cnblogs.com/tryAgainCs/p/15943710.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有