第六章 拦截器,注解配置springMVC,springMVC执行流程

1.拦截器:
①springMVC中的拦截器用于拦截控制器方法的执行。
②springMVC的拦截器需要实现HandlerInterceptor或者继承HandlerInterceptorAdapter类。
③springMVC的拦截器必须在springMVC的配置文件中进行配置。
(1)拦截器的配置:

<a th:href="@{/testInterceptor}">测试拦截器</a><br>
@Controller
public class TestController {@RequestMapping("/testInterceptor")public String testInterceptor(){return "success";}
}
public class FirstInterceptor implements HandlerInterceptor {public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("FirstInterceptor------- preHandle");return true;//false是拦截}public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("FirstInterceptor------- postHandle");}public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("FirstInterceptor------- afterCompletion");}
}
 <!--配置拦截器--><mvc:interceptors>
<!--        <bean class="com.mvc.demo5.interceptor.FirstInterceptor"></bean>-->
<!--        <ref bean="firstInterceptor"></ref>-->
<!-- 以上两种配置方式都是对DispatcherServlet所处理的所有的请求进行拦截 --><mvc:interceptor><mvc:mapping path="/*"/><mvc:exclude-mapping path="/"/><ref bean="firstInterceptor"></ref></mvc:interceptor>
以上配置方式可以通过ref或bean标签设置拦截器,通过mvc:mapping设置需要拦截的请求,通过mvc:exclude-mapping设置需要排除的请求,即不需要拦截的请求</mvc:interceptors>

(2)拦截器的三个抽象方法:
①preHandle:控制器方法执行之前执行preHandle(),其中boolean类型返回值表示是否拦截或者放行,返回true为放行,即调用控制器方法;返回false表示拦截,即不调用控制器方法。
②postHandle:拦截器方法执行之后执行postHandle()。
③afterCompletion:处理完视图和模型数据,渲染视图完毕之后执行afterCompletion()。
(3)多个拦截器的执行顺序:
①若每个拦截器的preHandle()都返回true,
此时多个拦截器的执行顺序和拦截器在springMVC的配置文件的配置顺序有关:
preHandle()会按照配置的顺序执行,而postHandler()和afterComplation()会按照配置的反序执行。
②若某个拦截器的preHandle()返回了false,preHandle()返回false和它之前的拦截器的preHandle()都会执行,postHandle()都不执行,返回false的拦截器之前的拦截器的afterComplation()会执行。
2.注解配置springMVC:
使用配置类和注解代替web.xml和springMVC配置文件的功能。
(1)创建初始化类,代替web.xml:

@Configuration
public class WebConfig {}
@Configuration
public class SpringConfig {}
//web工程的初始化类,用来代替web.xml
public class WebInit extends AbstractAnnotationConfigDispatcherServletInitializer {//指定spring的配置类protected Class<?>[] getRootConfigClasses() {return new Class[]{SpringConfig.class};}//指定springMVC的配置类protected Class<?>[] getServletConfigClasses() {return new Class[]{WebConfig.class};}//指定DispatcherServlet的映射规则,即url-patternprotected String[] getServletMappings() {return new String[]{"/"};}//注册过滤器@Overrideprotected Filter[] getServletFilters() {CharacterEncodingFilter characterEncodingFilter=new CharacterEncodingFilter();characterEncodingFilter.setEncoding("UTF-8");characterEncodingFilter.setForceResponseEncoding(true);HiddenHttpMethodFilter hiddenHttpMethodFilter=new HiddenHttpMethodFilter();return new Filter[]{characterEncodingFilter,hiddenHttpMethodFilter};}
}

(2)创建SpringConfig配置类,代替spring的配置文件:

@Configuration
public class SpringConfig {//ssm整合之后,spring的配置信息写在此类中
}

(3)创建WebConfig配置类,代替SpringMVC的配置文件:

@Configuration
//扫描组件
@ComponentScan("com.atguigu.mvc.controller")
//开启MVC注解驱动
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {//使用默认的servlet处理静态资源@Overridepublic void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer){configurer.enable();}//配置文件上传解析器@Beanpublic CommonsMultipartResolver multipartResolver(){return new CommonsMultipartResolver();}//配置拦截器@Overridepublic void addInterceptors(InterceptorRegistry registry) {FirstInterceptor firstInterceptor = new FirstInterceptor();registry.addInterceptor(firstInterceptor).addPathPatterns("/**");}//配置视图控制/*@Overridepublic void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/").setViewName("index");}*///配置异常映射/*@Overridepublic void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {SimpleMappingExceptionResolver exceptionResolver = new SimpleMappingExceptionResolver();Properties prop = new Properties();prop.setProperty("java.lang.ArithmeticException", "error");//设置异常映射exceptionResolver.setExceptionMappings(prop);//设置共享异常信息的键exceptionResolver.setExceptionAttribute("ex");resolvers.add(exceptionResolver);}*///配置生成模板解析器@Beanpublic ITemplateResolver templateResolver() {WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();// ServletContextTemplateResolver需要一个ServletContext作为构造参数,可通过WebApplicationContext 的方法获得ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(webApplicationContext.getServletContext());templateResolver.setPrefix("/WEB-INF/templates/");templateResolver.setSuffix(".html");templateResolver.setCharacterEncoding("UTF-8");templateResolver.setTemplateMode(TemplateMode.HTML);return templateResolver;}//生成模板引擎并为模板引擎注入模板解析器@Beanpublic SpringTemplateEngine templateEngine(ITemplateResolver templateResolver) {SpringTemplateEngine templateEngine = new SpringTemplateEngine();templateEngine.setTemplateResolver(templateResolver);return templateEngine;}//生成视图解析器并未解析器注入模板引擎@Beanpublic ViewResolver viewResolver(SpringTemplateEngine templateEngine) {ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();viewResolver.setCharacterEncoding("UTF-8");viewResolver.setTemplateEngine(templateEngine);return viewResolver;}
}

(4)测试功能:

@RequestMapping("/")
public String index(){return "index";
}

3.springMVC执行流程
(1)springMVC常用组件:
①DispatchServlet:前端控制器,统一处理请求和响应,整个流程控制的中心,由它调用其他组件处理用户请求。
②HandlerMapping:处理器映射器,根据请求的URL,method等信息查找Hnadler,即控制器方法。
③Handler:处理器,在DispatchServlet的控制下,Handler对具体的用户请求进行处理。
④HandlerAdapter:处理器适配器,通过HandlerAdapter对处理器(控制器方法)进行执行。
⑤ViewResolver:视图解析器,进行视图解析,得到相对应的视图。例如:ThymeleafView,RedirectView。
⑥View:模型,将模型数据通过页面展示给用户。
(2)springMVC执行流程:
1)用户向服务器发送请求,请求被springMVC前端控制器DispatcherServlet捕获。
2)DispatcherServlet对请求URL进行解析,得到请求资源标识符URI,判断请求URI对应的映射。
3) 根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain执行链对象的形式返回。
4) DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。
5) 如果成功获得HandlerAdapter,此时将开始执行拦截器的preHandler(…)方法【正向】
6) 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)方法,处理请求。在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:
① HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息
②数据转换:对请求消息进行数据转换。如String转换成Integer、Double等
③数据格式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等
④数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
7) Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象。
8) 此时将开始执行拦截器的postHandle(…)方法【逆向】。
9) 根据返回的ModelAndView(此时会判断是否存在异常:如果存在异常,则执行HandlerExceptionResolver进行异常处理)选择一个适合的ViewResolver进行视图解析,根据Model和View,来渲染视图。
10) 渲染视图完毕执行拦截器的afterCompletion(…)方法【逆向】。
11) 将渲染结果返回给客户端。

【 第六章 拦截器,注解配置springMVC,springMVC执行流程】相关推荐

  1. Spring Boot——自定义多个拦截器(HandlerInterceptor)配置方法与执行顺序

    执行顺序 源代码 拦截器类 package com.jd.m.tg.interceptor;import org.slf4j.Logger; import org.slf4j.LoggerFactor ...

  2. gtw-050090|执行拦截器时发生异常_执行流程 | 你真的了解Spring AOP的执行顺序吗?...

    Hi! 我是小小,我们又见面了,今天的主要内容是,你真的了解Spring AOP的执行顺序吗?跟随着我的脚步,一块丈量世界,了解世界,重新认识,重新了解Spring AOP的执行顺序. 聊一聊毕业四个 ...

  3. SpringBoot | 第六章:常用注解介绍及简单使用

    前言 之前几个章节,大部分都是算介绍springboot的一些外围配置,比如日志 配置等.这章节开始,开始总结一些关于springboot的综合开发的知识点.由于SpringBoot本身是基于Spri ...

  4. springboot + 拦截器 + 注解 实现自定义权限验证

    springboot + 拦截器 + 注解 实现自定义权限验证 最近用到一种前端模板技术:jtwig,在权限控制上没有用springSecurity.因此用拦截器和注解结合实现了权限控制. 1.1 定 ...

  5. Spring事务配置方式(一) 拦截器方式配置

    一.使用<tx:advice>和<aop:config>配置事务 <!-- 配置事务管理器 --><bean id="transactionMana ...

  6. vue2中使用axios,以及axios拦截器的配置

    目录 一.vue2项目中如何实现异步请求 1.axios:是一个基于Promise的网络请求库.既可以在node.js(服务器端)使用,也可以在浏览器端使用 2.vue中的使用方法 ​ (2)引用方法 ...

  7. vue跨域和拦截器的配置

    最近项目中需要使用vue框架.虽然vue在前端开发人员里也不算是什么新鲜的事儿了.只要是搞前端的都会一些vue的操作.我也不多说,直接进入正题.(这儿我以vue2.x为例) 安装什么的,我就不在这儿说 ...

  8. 给axios的请求拦截器中配置token

    axios 1. 配置token 用户第一次登录系统时,服务器端会返回一个身份秘钥信息(token),表明当前用户有资格.权限访问服务器,客户端获取token之后,通过sessionStorage存储 ...

  9. CC00038.kafka——|Hadoopkafka.V23|——|kafka.v23|消费者拦截器参数配置|

    一.消费者拦截器参数配置:消费者参数配置补充 配置项 说明 bootstrap.servers 建立到Kafka集群的初始连接用到的host/port列表. 客户端会使用这里指定的所有的host/po ...

最新文章

  1. mysql comment
  2. python3 “from PIL import...“报错
  3. 南陵中学2021高考成绩查询,南陵中学2019高考成绩喜报、一本二本上线情况
  4. 使用TCP可靠吗?为什么可靠?
  5. 五分钟学会企业的OpenStack(T版)——简介及安装方式
  6. The 4+1 view model
  7. Unity3D 之UGUI 滑动条(Slider)
  8. 语言认知偏差_我们的认知偏差正在破坏患者的结果数据
  9. 程序员像瞎子,产品经理像跛子
  10. rtt面向对象oopc——0.类、对象及派生
  11. Jquery 实现动态加入table tr 和删除tr 以及checkbox的全选 和 获取加入TR删除TR后的数据...
  12. 学习Jsoup(一)
  13. golang 遍历list_golang服务开发平滑升级之优雅重启
  14. Ubuntu pycharm配置conda已安装好的环境,以及conda激活环境的命令相关操作
  15. 转载 JavaScript的24条实用建议
  16. Android开发学习总结——appcompat_v7项目说明
  17. LTE时代的定位技术:OTDOA,LPP,SUPL2.0
  18. oeasy php,oeasy之PhotoshopCS3视频教程 - 轻松自学网
  19. 14.荔枝派 zero(全志V3S)-驱动OV2640拍照、录制视频
  20. 干同一份工作,工资为什么比同事低很多?

热门文章

  1. 分布式与微服务系列 - Dubbo
  2. 安卓打气筒_12.安卓,ListView,打气筒的初次使用
  3. 用 layoutInflater打气筒创建一个view对象
  4. app安卓开发教程!Android组件化架构实践,高级面试题+解析
  5. Java实现分布式锁的三种方式
  6. 鬼畜视频创作神器——EDIUS Pro 非线性视频编辑软件(9.0)汉化特别版
  7. 状态模式(State模式)
  8. Flash For Server[FFS]
  9. STM8单片机ADC采样功能通过定时器触发
  10. pip3 install 指定路径