SpringMVC学习笔记(二)
这一次的学习笔记在于明确学习springMVC容器与spring的异同点,将为次描述其中的异同点。
1、解析容器
在配置一个简单的javaweb时,我们使用spring导入注入依赖或者切面;但是在使用springMVC在干什么呢?
在前面,我们创建一个项目时,我们将controller之外的所有Bean注册到spring中,而在Controller注册到springMVC当中。
所以我们在 resources目录下添加 applicationContext.xml 作为 spring 的配置, 添加springmvc.xml作为springmvc的配置文件。
代码结构目录如下:

(这里请忽略插件加载运行产生的target包和war包呵呵),我们在main下的resources包中加载以上两个xml文件。
1.1 两个容器的异同(一)
首先直观的感觉就是xml文件内容的异同。
spring配置文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
">
<!--spring的配置文件:除了控制器之外的bean对象都在这里扫描-->
<context:component-scan base-package="com.jpg.dao,com.jpg.service"/>
</beans>
springMVC配置文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
">
<!--springmvc的配置文件:控制器的bean对象都在这里扫描-->
<context:component-scan base-package="com.jpg.controller"/>
</beans>
在引入地址中我们需要在springMVC下添加如下地址:xmlns:mvc="http://www.springframework.org/schema/mvc"
当然添加后就要加载好地址,即添加第10、11行代码即可。
后续在调用web.xml时,我们首先是配置spring而后再配置springmvc。
<!--spring的配置-->
<context-param>
<!--contextConfigLocation:表示用于加载 Bean的配置文件-->
<param-name>contextConfigLocation</param-name>
<!--指定spring配置文件的位置这个配置文件也有一些默认规则,它的配置文件名默认就叫 applicationContext.xml ,如果将这个配置文件放在 WEB-INF 目录下,那么这里就可以不用 指定配置文件位置,只需要指定监听器就可以。
这段配置是 Spring 集成 Web 环境的通用配置;一般用于加载除控制器层的 Bean(如dao、service 等),以便于与其他任何Web框架集成。-->
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--springMVC配置-->
<!--前端控制器:所有的请求都会经过此控制器,然后通过此控制器分发到各个分控制器.
前端控制器本质上还是一个Servlet,因为SpringMVC底层就是使用Servlet编写的
-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name> <servletclass>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 创建前端控制器的时候读取springmvc配置文件启动ioc容器 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- Tomcat启动就创建此对象 -->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 配置拦截路径url,所有以.do结尾的请求都会被前端控制器拦截处理 -->
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
1.2 两个容器的异同(二)
当然,功能不一样肯定内容上不一样。所以这里就涉及到其中的解析原理。
当 Spring 和 SpringMVC 同时出现,我们的项目中将存在两个容器。一个是 Spring 容器,另一个是 SpringMVC 容器,Spring 容器通过 ContextLoaderListener 来加载,SpringMVC 容器则通过 DispatcherServlet 来加载。
这两个容器不一样的地方如下:
ContextLoaderListener :初始化的上下文加载的 Bean 是对于整个应用程序共享的,不管是使用什么表现层技术,一般如dao层、service层 的bean;
DispatcherServlet :初始化的上下文加载的 bean 是只对 Spring Web MVC 有效的 bean,如 Controller、HandlerMapping、HandlerAdapter 等等,该初始化上下文应该只加载 Web相关组件。

其中下面是继承上面的类,即DispatcherServlet继承自ContextLoaderListener。
这里就需要注意以下几点:
- spring容器不能够扫描所有的Bean。因为当用户请求达到服务器后会寻找前端控制器
DispatcherServlet去处理,只有在springMVC容器去找,所以Controller必须在springmvc容器中扫描。 - springmvc可以扫描所有的包,但是不建议在以后的工作上这么做。因为(1)为了方便配置文件的管理。(2)未来在整合ssm下,要写的配置内容很多并且会根据功能分开编写。
2、SpringMVC工作流程
2.1 springmvc工作流程详解

如上图所示,在整个工作体系中使用到DispatcherServlet前端控制器、HandlerMapping处理器映射器、HandlerAdaptor处理器适配器、Controller处理器、ViewResolver视图解析器、view试图。
- 用户通过浏览器发送请求到前端控制器DispatcherServlet。
- 前端控制器直接将请求转给处理器映射器HandleMapping。
- 处理器映射器HandleMapping会根据请求,找到负责处理该请求的处理器,并将其封装为处理器 执行链HandlerExecutionChina后返回给前端控制器DispatcherServlet。
- 前端控制器DispatcherServlet根据处理器执行链中的处理器,找到能够执行该处理器的处理器适 配器HandlerAdaptor。
- 处理器适配器HandlerAdaptor调用执行处理器Controller。
- 处理器Controller将处理结果及要跳转的视图封装到一个对象 ModelAndView 中,并将其返回给 处理器适配器HandlerAdaptor。
- 处理器适配器直接将结果返回给前端控制器DispatcherServlet。
- 前端控制器调用视图解析器,将 ModelAndView 中的视图名称封装为视图对象。
- 视图解析器ViewResolver将封装了的视图View对象返回给前端控制器DispatcherServlet.
- 前端控制器DispatcherServlet调用视图对象,让其自己进行渲染,即进行数据填充,形成响应对 象。
- 前端控制器响应浏览器。
2.2 springmvc组件
DispatcherServlet:前端控制器,也称为中央控制器或者核心控制器。
用户请求的入口控制器(它就相当于mvc模式中的c),DispatcherServlet 是整个流程控制的中心,相当于是 SpringMVC 的大脑,由它调用其它组件处理用户的请求,DispatcherServlet 的存在降低了组件之间的耦合性。SpringMVC框架提供的该核心控制器需要我们在web.xml文件中配置。
HandlerMapping:处理器映射器
HandlerMapping也是控制器,即派发请求的控制器。我们不需要自己控制该类,但是他是springmvc运转历程中的重要的一个控制器。 HandlerMapping负责根据用户请求找到 Handler 即处理器(也就是我们所说的 Controller),SpringMVC 提供了不同的映射器实现不同的映射方式,例如:配置文件方式, 实现接口方式,注解方式等,在实际开发中,我们常用的方式是注解方式。
Handler:处理器
Handler 是继 DispatcherServlet 前端控制器的后端控制器,在DispatcherServlet 的控制下 Handler 对具体的用户请求进行处理。由于 Handler 涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发 Handler。(这里所说的 Handler 就是指我们的Controller)
HandlAdapter:处理器适配器
通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用。通过扩展处理器适配器,支持更多类型的处理器,调用处理器传递参数等工作。
ViewResolver:视图解析器
ViewResolver 负责将处理结果生成 View 视图。ViewResolver 首先根据逻辑视图名解析成物理视图名称,即具体的页面地址;再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用户。
SpringMVC 框架提供了很多的 View 视图类型,包括:jstlView、freemarkerView、pdfView 等。 一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。
总结
以上就是springmvc的基本运行原理。之后对于后续的springMVC开发,我们主要以注解方式进行映射操作项目(当然有机会会使用其他的映射处理方式)。谢谢大家的阅读。
1860

被折叠的 条评论
为什么被折叠?



