springMVC源码分析
springMVC源码学习,留作记录
springMVC组件说明:
1.前端控制器(DispatcherServlet)由框架提供作用,主要用于接收请求,处理请求分发,处理响应结果
2.处理映射器(HandlerMapping),根据请求url,找到对应的处理器
3.处理适配器(HandlerAdapter),调用对应处理器
4.处理器(Controller),业务代码,返回模型视图对象
5.视图解析器(ViewResolver),处理返回模型视图,返回给浏览器
springMVC运行流程:####
<!--
1.声明处理器映射器
选择哪一个处理器处理当前请求
-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<!--
1.声明处理器适配器
调用哪一个处理器处理当前请求
-->
<bean class="org.springframework.web.servlet.mvc.RequestMappingHandlerAdapter"></bean>
源码方法
》org.springframework.web.servlet.DispatcherServlet.doService
org.springframework.web.servlet.DispatcherServlet.doDispatch
org.springframework.web.servlet.DispatcherServlet.getHandler
//视图渲染
》org.springframework.web.servlet.DispatcherServlet.processDispatchResult
》org.springframework.web.servlet.DispatcherServlet.render
//资源转发
》org.springframework.web.servlet.view.AbstractView.renderMergedOutputModel
》org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel
getHandler方法内调用处理器映射器和处理器适配器
通过handler获取合适的适配器,适配器种类
通过返回的mv对象,获取view并且对其渲染
请求转发,流程结束
SpringMVC具有三种处理器适配器,他们分别是BeanNameUrlHandlerMapping、SimpleControllerHandlerAdapter、ControllerClassNameHandlerMapping
- 1.BeanNameUrlHandlerMapping映射,这种映射使用Bean的name来访问控制器,它根据类名(Mycontroller)类名.do来访问,类名首字母小写。
<?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:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
<bean id="userController" name="/hello.do" class="com.zk.UserController.UserController"></bean>
<!-- 配置处理器映射器 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
- 2.SimpleControllerHandlerAdapter映射,寻找Controller 。根据浏览器url匹配简单url的key,key又Controller的id找到Controller。
<?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:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
<bean id="userController" name="/hello.do" class="com.zk.UserController.UserController"></bean>
<!-- url进行集中配置 -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/min.do">userController</prop>
<prop key="/abc.do">userController</prop>
<prop key="/ss.do">userController</prop>
</props>
</property>
</bean>
<!-- 配置处理器适配器:负责执行UserController,springMVC默认处理器适配器 -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
<bean class="com.zk.UserController.UserController"></bean>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
- 3.ControllerClassNameHandlerMapping,寻找Controller, 根据类名(MyController)类名.do来访问,类名首字母小写。更改SpringMVC.xml文件,配置一个ControllerClassNameHandlerMapping。
<?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:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
<!-- 通过类名.do来访问,类名首字母小写 -->
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"></bean>
<bean class="com.zk.UserController.UserController"></bean>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>