Spring mvc原理介绍

Spring ioc容器+spring mvc容器初始化过程

  1. Tomcat在启动的过程中,生成servletContext对象,然后通知给ServletContextLister接口下的所有实现类,其中,spring的ContextLoaderListener在接收到servletcontext对象后,就会开始spring ioc容器 - webapplicationcontext  创建,并保存到servletcontext中。Spring ioc是spring根容器:servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.context);
  2. DispatcherServet在被实例化时,会生成spring mvc容器-ConfigurableWebApplicationContext(执行initServletBean方法),并设置spring mvc容器的父容器为spring ioc(spring 根容器):cwac.setParent(rootContext);
  3. Tomcat容器、spring容器、springmvc容器:tomcat容器就是管理servlet对象的。Spring容器就是spring ioc,管理servicedaodatasorce等对象;spring mvc容器管理controllerhandlerMappinghandlerAdapter等对象。  请注意,Spring MVC容器可以访问父容器中的Bean,但是父容器不能访问子容器的Bean 也就是说Spring根容器不能访问SpringMVC容器里的Bean。说的通俗点就是,在Controller里可以访问Service对象,但是在Service里不可以访问Controller对象。子容器找不到对应的Bean时,会去父容器中去找。子容器有父容器的引用,父容器没子容器的引用,所以父容器不能访问子容器的bean
  4. 客户端发送请求 -> web容器(tomcat),在web容器里需要经过过滤器(XSS攻击等,过滤器是在WEB容器执行的)拦截,拦截器执行通过后,执行servlet对象service方法(dispatcherServlet) -> 进入spring mvc容器,执行拦截器和控制器方法

注:过滤器是在WEB容器执行的,拦截器是在spring mvc容器执行的

Spring mvc介绍

  1. WebMvcConfigurer:为方便配置各类组件,一般用WebMvcConfigurerAdapter
  2. @RequestMapping:将请求URL与控制器的方法做个对应,并将控制器中的方法封装成一个handler,同时和拦截器组合成handlerExecutoinChain,handler执行链
  3. handlerAdapter:handler适配器去执行handler链,先是执行拦截器,然后通过转换器将请求里的参数绑定到控制器方法参数上(转换的过程中还可以通过验证器验证,@Validtor),执行控制器方法,把控制器方法返回的结果又封装成数据模型-model,交给指定的view-视图,去渲染数据。如果视图是逻辑视图,还需要把视图交给视图解析器进行解析。

控制器接收请求参数

  1. 参数名与属性名一样,spring mvc自动进行对应
  2. @requestparam获取参数,参数名与属性名不一样
  3. @pathvariable从url获取参数
  4. @requestBody:从请求体获取json对象,转为参数实例
  5. @Validtor:验证接收到的参数是否符合要求,验证器

数据模型-model

控制器方法返回的结果会被封装成一个model,交给指定的view去渲染

视图-view

视图类型:

  1. 逻辑视图:最终能定位到具体界面名的,需要在浏览器界面展示的
  2. 非逻辑视图:像json字符串视图、pdf视图、excel视图等

常用视图类:

  1. MappingJackson2JsonView:将model解析成字符串
  2. PdfView:将model解析成pdf文件
  3. XlsView:将model解析成excel文件
  4. FreeMarkerView:将model解析成freemarker模板文件

上传文件

MultipartResolver解析器

高级应用

转换器

作用:将请求里的参数绑定到方法参数上,或将控制器方法返回值进行转换

有3种转换器:

  1. Converter:一对一转换器,一个请求参数绑定到一个方法参数上
  2. GenericConverter:数组和集合转换器,
  3. HttpMessageConverter:将@RequestBody请求体里的参数绑定到方法参数上,转换控制器方法返回值,像@ResponseBody,将返回结果转换成JSON字符串。控制器方法参数绑定和返回值转换时,默认菜用的是MappingJackson2HttpMessageConverter,依赖ObjectMapper类。

拦截器

在控制器方法执行前或执行后或视图渲染后执行。HandlerInterceptor接口。

多个拦截器串行执行,其中一个拦截器方法执行结果是false,后面的拦截器就不在执行了。

控制器通知类

@ControllerAdvice,标识类为控制器通知类,它有3个特有的注解:

  1. @ExceptionHandler,注解到方法级别上,表示当控制器方法执行抛出指定的异常时,该方法能捕获当该异常,并作出业务处理
  2. @InitBinder,注解到方法级别上,表示在控制器方法执行前,可以对方法参数做编辑,比方说日期时间格式,或者数据验证
  3. @ModelAttribute,注解到方法级别上,表示在控制器方法执行前,可以操作方法的Model-数据模型对象。

控制器通知类实现也是基于动态代理,控制器在IOC容器中也是以代理对象存在的,往代理逻辑里面添加了异常捕获、控制器方法参数编辑、控制器方法数据模型操作逻辑。

过滤器与拦截器区别

    1. 过滤器-filter是在tomcat容器执行的,是在tomcat容器初始化,生成的实例对象,在调用servlet.service方法前执行。
    2. 拦截器-handlerInterceptor是在spring mvc容器执行的,在handlerAdapter里,被封装成了handlerExecutionChain
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值