SpringMVC是Spring框架的一个模块,springmvc和spring无需通过中间整合层进行整合,是基于mvc的web框架
一、步骤描述及图解
SpringMVC图解
第1步 浏览器发送请求到前端控制器DispatchServlet
第2步 前端控制器请求HandlerMapping查找Handler,可以根据xml配置、注解进行查找
第3步 处理映射器HandlerMapping向前端控制器返回Handler
第4步 前端控制器请求处理器适配器(HandlerAdapter)执行Handler
第5步 处理器适配器调用Handler
第6步 处理器(Handler)向处理器适配器返回ModelAndView(是spring框架的一个底层对象)
第7步 处理器适配器向前端控制器返回ModelAndView
第8步 前端控制器请求视图解析器(viewResolver)进行视图解析,根据逻辑视图名解析成真正的视图(如jsp页面)
第9步 视图解析器向前端控制器返回view
第10步 前端控制器进行视图渲染,将模型数据(在ModelAndView对象中)填充到request域
第11步 前端控制器向用户响应结果
组件解释:
1、前端控制器 DispatchServlet(框架提供)接收请求、响应结果,相当于转发器(中央处理器),减少了其它组件之间的耦合
2、处理器映射器 HandlerMapping(框架提供),根据请求的url查找Handler
3、处理器适配器 HandlerAdapter 按照HandlerAdapter 要求的规则去执行Handler
4、处理器Handler(需要开发)编写时按照HandlerAdapter的要求,这样适配器才能正确执行Handler
5、视图解析器ViewResolver(框架提供)进行视图解析,根据视图名解析成真正的视图(view)
6、视图 view(需要开发)是一个接口,实现类支持不同的view类型(jsp、freemarke…)
二、编码部分
web.xml配置前端控制器DispatchServlet
<!-- springMvc前端控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- contextConfigLocation配置springmvc加载的配置文件(其中配置处理器映射器,适配器等)
如果不配置contextConfigLocation,默认加载的是WEB-INF/servlet名称-servlet.xml(即springmvc-servlet.xml)
-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!--
1、匹配顺序
该标签处理客户端请求的顺序为:
(1)完全匹配
<url-pattern>/test/userList.action</url-pattern>
完全匹配就是等值匹配,它是最先被匹配到的客户端请求。
(2)路径匹配
<url-pattern>/*</url-pattern> 匹配根路径下的全部请求
路径匹配类似于模糊匹配,对于/list、listInfo.do、checkInfo.action、index.jsp、abc.css、my.js等等url请求,都可以被匹配到。这种匹配的顺序排在完全匹配后面。
(3)扩展名匹配
<url-pattern>*.action</url-pattern>匹配全部action 结尾的请求
<url-pattern>*.css</url-pattern> 匹配全部 css结尾的请求
<url-pattern>*</url-pattern> 不能用 * ,否则报错
说明:这种匹配匹配在开发中用的比较多,但不能使用*代替,否则会报错。
结论:容器会首先查找完全匹配,如果找不到,再查找目录匹配,如果也找不到,就查找扩展名匹配。
(1)<url-pattern>/</url-pattern>
会匹配到 /toIndex 这种类型的 url ,不会匹配到模式为 *.jsp 这样的后缀型 url。
(2)<url-pattern>/*</url-pattern>
会匹配所有路径型的和后缀型的url。
-->
<!--配置方式
第一种:*.action 访问以.ation结尾的路径 由DispatcherServlet进行解析
第二种:/ 所有访问的地址都由DispatcherServlet进行解析,对于静态文件的解析需要配置不让DispatcherServlet解析
使用此种方式可以实现RESTful风格的url
第三种:/* 这样配置错误,使用这种配置最终要转发一个jsp页面时仍然会使用DispatcherServlet解析jsp地址,不能根据jsp页面找到Handler会报错
-->
<url-pattern>*.action</url-pattern>
</servlet-mapping>
spring-mvc.xml配置
配置处理器适配器
<!-- 处理器适配器 所有处理器适配器都实现了HandlerAdapter -->
<bean id="simpleControllerHandlerAdapter" class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
此接口实现了controller的Handler接口
配置处理器映射器
<!-- 处理器映射器 简单url映射
将bean的name作为url进行查找,需要配置Handler时指定beanname(即url)
-->
<bean id="beanNameUrlHandlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
配置视图解析器
<!-- 视图解析器 解析jsp视图,默认使用jstl标签,classpath下得有jstl的包 -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>
配置Handler
<!-- 配置Handler 这里的后缀对应web.xml中url-pattern的配置 -->
<bean id="itemsController" name="/queryList.action" class="com.idea.controller.ItemsController"></bean>
简单的url映射
<bean id="simpleControllerHandlerAdapter" class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter">
<property name="mappings">
<props>
<!-- 对controller进行url映射 填写controller bean标签的id,同一个bean可以有多个url -->
<prop key="/query1.action">itemsController</prop>
</props>
</property>
</bean>
多个映射器可以并存,前端控制器会判断url符合规则的都可以
关于spring注解配置
前端控制器从/org/springframework/web/servlet/DispatcherServlet.properties文件中加载处理器映射器、适配器、视图解析器等组件,如果不在springmvc.xml中配置,则使用默认加载
在spring版本3.1前使用org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping注解映射器
在spring版本3.1后使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping注解映射器
在spring版本3.1之前使用org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter注解适配器
在spring版本3.1之后使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter注解适配器
通过springmvc源码分析执行过程
第一步:前端控制器接收请求
调用 doDispatch方法
第二步:doDispatch方法会执行getHandler方法 返回HandlerExecutionChain
第三步:调用处理器适配器处理Handler,返回ModelAndView
第四步:调用视图解析器得到view
视图渲染 将model数据填充到Request域
视图解析器配置,可配置jsp页面前后缀