Spring MVC的工作流程:
(1)客户端发起HTTP请求:客户端将请求提交到DisPatcherServlet(前端控制器)【所有的请求都有经过它来统一分发,在DispatcherServlet将请求分发给Spring Controller之前,需要借助于Spring提供的HandlerMapping定位到具体的Controller。】。 ---控制配置详见位置1
(2)寻找处理器:由DisPatcherServlet控制器查询一个或多个HandlerMapping【完成客户请求到Controller映射】,找到处理该请求的Controller。 --处理配置器详见位置2
(3)调用处理器:DisPatcherServlet将请求提交到Controller。 --Controller扫描配置详见位置3
(4)调用业务逻辑并返回结果:Controller调用业务处理逻辑后,返回ModelAndView【模型(Model)和视图(View)】。
(5)处理视图映射并返回模型:由DisPatcherServlet控制器查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图。 --视图解析配置详见位置4
(6)HTTP响应:视图负责将结果在客户端浏览器上渲染和展示。
位置 1【配置于web.xml】
<!-- spring-mvc核心控制器配置 -->
<servlet>
<servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!-- contextConfigLocation:指定spring-mvc配置的加载位置 -->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc_context.xml</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!-- url-pattern:*.action的请交给DispatcherServlet处理,对请求URL进行解析,得到请求资源标识符(URI),判断请求URI对应的映射 -->
<url-pattern>*.action</url-pattern>
</servlet-mapping>
位置 2【配置于springmvc_context.xml】
<!-- 这两个类用来启动基于Spring MVC的注解功能,将控制器与方法映射加入到容器中 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" />
也等同于
<!-- 自动注册 HandlerMapping(实现为 RequestMappingHandlerMapping) 和 HandlerAdapter(实现为 RequestMappingHandlerAdapter) 两个类型的 Bean-->
<mvc:annotation-driven />和
位置 3【配置于springmvc_context.xml】
<!-- ①:对web包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能 ,context:component-scan 的作用是扫描对应的 base-package,将 base-package 及其子包中被 @Component、@Controller、@Service、@Repository 等注解的类,注册到为 Spring Context,即在上下文环境中注册一个这样的 Bean-->
<context:component-scan base-package="com.xsc.controller" />
位置 4【配置于springmvc_context.xml】
<!-- 这个类用于Spring MVC视图解析,将ModelAndView及字符串解析为具体的页面 -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- prefix指定在视图逻辑名前所添加的前缀 -->
<property name="prefix" value="/WEB-INF/pages/" />
<!-- suffix指定在视图逻辑名后所添加的后缀 -->
<property name="suffix" value=".jsp" />
</bean>