SpringMVC执行流程(与代码映照)

概述

SpringMVC 是一种轻量级的,基于 MVC 的 web 层应用框架。偏前端而不是基于业务逻辑层。是 Spring 框架的一个后续产品。

特点

有清晰的角色划分:

  1. 中央调度器(DispatcherServlet):作为前端控制器,整个流程的控制中心,控制其它组件执行,同一调度。
  2. 处理器映射器(HandlerMapping):负责根据用户请求的 url 找到 Handler 处理器(Handler 是执行一个特定功能的函数)。
  3. 处理器适配器(HandlerAdapter):执行处理器。
  4. 视图解析器(ViewResolver):解析 ModelAndView 。

之所以有角色的划分是为了让程序能更好的解耦,提高程序的扩展性。

执行流程

在这里插入图片描述

在这里插入图片描述

  1. 中央调度器(DispatcherServlet)接收请求并且调用处理器映射器(HandlerMapping)。
  2. 处理器映射器(HandlerMapping)负责根据用户请求的 url 找到与之绑定的函数(即 Handler 处理器),并返回给中央调度器。
  3. 中央调度器(DispatcherServlet)调用处理器适配器(HandlerAdapter)处理一系列操作,如:参数封装,数据格式转换,数据验证等,再执行处理器。
  4. 处理器(Handler)执行完成后返回 ModelAndView。
  5. 处理器适配器(HandlerAdapater)将处理器返回的结果 ModelAndView 也返回给中央调度器。
  6. 中央调度器(DispatcherServlet)将 ModelAndView 返回给 ViewReslover(视图解析器)进行解析。解析后返回具体的 view。
  7. 中央调度器(DispatcherServlet)对 view 进行渲染视图并响应用户。

代码对应

整个代码

  1. web.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
复制代码<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>myweb</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

<!-- 自定义 springmvc 读取的配置文件的位置 -->
<init-param>
<!-- springmvc 的配置文件的位置的属性-->
<param-name>contextConfigLocation</param-name>
<!-- 指定自定义文件的位置-->
<param-value>classpath:springmvc.xml</param-value>
</init-param>

<!-- 在 tomcat 启动后,创建 servlet 对象
load-on-startup:表示 tomcat 启动后创建对象的顺序。他的值时整数,
数值越小,tomcat 创建对象的时间越早,大于等于 0 的整数。
-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>myweb</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
  1. springmvc.xml
1
2
3
4
5
6
7
8
9
10
11
12
复制代码<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 https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp" />
<property name="suffix" value=".jsp" />
</bean>
<!-- 声明组件扫描器 -->
<context:component-scan base-package="com.manman.controller"/>
</beans>
  1. Controller
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
复制代码package com.manman.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

/**
* @Controller:创建处理器对象,对象放在 springmvc 容器中。
* 能处理请求的都是控制器(处理器):MyController 能处理请求,叫做后端控制器
*/
@Controller("myController")
public class MyController {

@RequestMapping(value = "/some.do")
public ModelAndView doSome(){
// 处理 some.do 请求
ModelAndView mv = new ModelAndView();
mv.addObject("msg", "hello world");
mv.addObject("fun", "执行的是 doSome 方法");
mv.setViewName("/show.jsp");
// 返回 mv
return mv;
}
}

代码解析

  1. 中央调度器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
复制代码<servlet>
<servlet-name>myweb</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 自定义 springmvc 读取的配置文件的位置 -->
<init-param>
<!-- springmvc 的配置文件的位置的属性-->
<param-name>contextConfigLocation</param-name>
<!-- 指定自定义文件的位置-->
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 在 tomcat 启动后,创建 servlet 对象
load-on-startup:表示 tomcat 启动后创建对象的顺序。他的值时整数,
数值越小,tomcat 创建对象的时间越早,大于等于 0 的整数。
-->
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>myweb</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
  1. 处理器映射器
1
2
复制代码@RequestMapping(value = "/some.do")
public ModelAndView doSome(){}
  1. 调用处理器适配器并执行处理器
1
2
3
4
5
6
7
8
9
复制代码public ModelAndView doSome(){
// 处理 some.do 请求
ModelAndView mv = new ModelAndView();
mv.addObject("msg", "hello world");
mv.addObject("fun", "执行的是 doSome 方法");
mv.setViewName("/show.jsp");
// 返回 mv
return mv;
}
  1. 视图解析器进行解析
1
2
3
4
5
复制代码<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp" />
<property name="suffix" value=".jsp" />
</bean>

本文使用 mdnice 排版

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%