spring mvc

介绍下 Spring MVC 的核心组件?

有很多,主要以下三个常用

HandlerMapping

HandlerAdapter

HandlerExceptionResolver

Spring MVC容器初始化过程(Spring和Servlet集成)

当我们启动一个WEB项目容器时,容器包括(JBoss,Tomcat等)。首先会去读取web.xml配置文件里的配置。

http://svip.iocoder.cn/Spring-MVC/context-init-Root-WebApplicationContext/

web.xml中会配置两个关键项:listen : ContextLoaderListener 和 servlet : DispatcherServlet

  1. ContextLoaderListener 会监听tomcat启动创建的servletContext,并根据application.xml创建一个ROOT WebApplicationContext  容器(1).同时,会将这个容器注入到servletContext容器中。
  2. DispatcherServlet 创建一个Servlet WebApplicationContext 容器 (2),但(2)容器是(1)容器的子容器

ROOT WebApplicationContext 

上面的ContextLoaderListener类继承关系如下,这是它能监听tomcat启动,并创建spring业务容器的原因。

这个过程创建的是业务层的容器,比如service, dao等

0d9cc26edc0673d5b332097da1f42191184.jpg

Servlet WebApplicationContext

创建的是web层的容器,比如Controller、HandlerMapping、ViewResolver等

DispatchServlet的类层次如下

5e50cea5290fabf4c2841d7e402ccd57f2a.jpg

 

整个过程如下:

0e3c1188d3bd430485125cb2dad0a36a044.jpg

 

描述一下 DispatcherServlet 的工作流程?

大致流程

7a342270daed16b9882dfa02c5ad8ae5b03.jpg

(1)发送请求:被DispatcherServlet的servlet-mapping捕获

(2)映射处理器:DispatcherServlet根据URL,调用HandlerMapping返回配置的handler

(3)处理适配器:DispatcherServlet根据返回的handler,选择一个合适的HandlerAdapter,进行拦截(prehandler),业务处理handler(即controler中的逻辑),结果加工(数据校验,参数转换,数据格式化,返回结果实例化等)

(4)handlerAdapter处理完handler之后DispatcherServlet将返回ModelAndView 对象(也可能是JSON,用 HttpMessageConverter 转换)

(5)根据返回的ModelAndView,DispatchServlet选择合适的ViewResolver,解析出view对象,再返回给DispatchServlet

(6)DispatchServlet调用ViewResolver 解析Modle和View生成页面返回给客户端

注意,如果第(4)步返回的是JSON,那么就没有第(5)和第(6)步了,也就是前后端分离的场景。

整个过程流程如下

5cd9825e82dcc59395b86bfec1273ef530a.jpg

 

Spring MVC 的异常处理?

Spring mvc提供了异常解析器 Handler,它可以将handler处理期间发生的异常,装换成对应的ModelAndView结果。

具体方法:

  1. 就是用controller去继承基类,基类中用@ExceptionHandler去注解用来处理异常的方法,最终解析成ModelAndView
  2. 与上面类似的方法是去实现一个接口(JDK8),接口中用@ExceptionHandler去注解default方法。
  3. 最优雅的方法,定义全局异常处理器,用@ControllerAdvice注解全局异常处理类,相当于给每个controller类都做了增强代理。

 

详细介绍下 Spring MVC 拦截器?Spring MVC 的拦截器可以做哪些事情?

接口 org.springframework.web.servlet.HandlerInterceptor

方法:

preHandle(), 在HandlerAdapter.handle之前执行。多个preHandle执行只要一个返回false,controller就不再调用

postHandle() , 在handle之后执行

afterCompletion() ,处理完hanle(即controller)返回结果后执行(可修改结果?)

 

拦截器作用:

  • 记录访问日志。
  • 记录异常日志。
  • 需要登陆的请求操作,拦截未登陆的用户。
  • 。。。。。

 

HttpMessageConverter 在 Spring REST 中代表什么?

HttpMessageConverter是一个策略接口,Spring REST(根据HTTP头的accept类型)使用对应的接口返回HTTP 请求的格式的数据

 

 

 

 

转载于:https://my.oschina.net/u/3300976/blog/3032193

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值