本文源码:GitHub·点这里 || GitEE·点这里

一、SpringMvc框架简介

1、Mvc设计理念

MVC是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个组件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑,MVC分层有助于管理和架构复杂的应用程序

  • M:代表模型Model

模型就是数据,应用程序的核心。

  • V:代表视图View

回显数据的界面,例如JSP就是用来展示模型中的数据。

  • C:代表控制器Controller

控制器的作用就是根据入参,把不同的响应数据(Model),显示在不同的视图(View)上。

2、SpringMvc简介

  • 框架描述

SpringMVC是一种基于Java实现的MVC设计模式的请求驱动类型的轻量级Web框架,出自Spring框架全家桶,与Spring框架无缝整合,使用了MVC架构模式的思想,将Web层进行职责解耦。

  • 框架优点

结构松散,几乎可以在SpringMVC中使用各类视图,各个模块分离而且耦合度非常低,且易于扩展。与Spring无缝集成,且简单,灵活,容易上手。

二、SpringMvc执行流程

1、流程图解

2、步骤描述

(1)、发起请求到前端控制器DispatcherServlet;

(2)、前端控制器请求HandlerMapping查找,Handler可以根据xml配置、注解进行查找;

(3)、处理器映射器HandlerMapping向前端控制器返回Handler;

(4)、前端控制器调用处理器适配器去执行Handler;

(5)、处理器适配器去执行Handler ;

(6)、Handler执行完成给适配器返回ModelAndView ;

(7)、处理器适配器向前端控制器返回ModelAndView,ModelAndViewspringmvc框架的一个底层对象,包括Modelview ;

(8)、前端控制器请求视图解析器去进行视图解析,根据逻辑视图名解析成真正的视图 ;

(9)、视图解析器向前端控制器返回View ;

(10)、前端控制器进行视图渲染,视图渲染将模型数据(在ModelAndView对象中)填充到request域中;

(11)、前端控制器向用户响应结果 ;

3、核心组件

  • 前端控制器

DispatcherServlet:请求离开浏览器后,最先到达的就是DispatcherServlet,是整个流程控制的中心,作用接收请求,响应结果,相当于转发器,中央处理器。减少各个组件之间的耦合度。

  • 处理器映射器

HandlerMapping:根据请求的url路由到指定接口,用户请求找到Handler处理器,springmvc提供不同类型映射器,例如:Xml配置方式,注解方式等。

  • 处理器适配器

HandlerAdapter:按照特定规则去执行Handler,SpringMvc支持多种处理器,各种处理器中的处理方法各不相同,为了解决适应多种处理器,就出现了处理器适配器。

  • 处理器

Handler:处理用户请求,涉及具体业务逻辑,需要程序员根据业务需求开发。编写Handler时按照HandlerAdapter的规则开发,这样适配器才可以正确执行Handler。

  • 视图解析器

ViewResolver:负责将请求的响应结果生成View,根据逻辑视图名解析成物理视图名,就是具体页面地址,生成View视图对象,对View进行渲染,通过页面展示给用户。

  • 视图

View:SpringMvc框架提供很多的View视图类型的支持,包括:jsp、freemarker、pdf等。通过页面标签或页面模版解析模型数据回显到页面,需要根据业务开发具体页面。

三、整合Spring框架配置

1、spring-mvc配置

<!-- 扫描文件 -->
<context:component-scan base-package="com.spring.mvc.controller" />
<!-- MVC默认的注解映射的方式 -->
<mvc:annotation-driven />
<mvc:default-servlet-handler/>
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/page/" />
<property name="suffix" value=".jsp" />
</bean>

2、Web.xml配置

<servlet>
<servlet-name>spring-mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring-mvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

3、测试接口

@Controller
public class HelloController {
@RequestMapping("/getInfo")
public @ResponseBody String getInfo (String name){
return name ;
}
}

4、常用注解说明

  • @Controller

标记一个类是Handler,也就是开发的Controller,然后使用@RequestMapping或其他相关注解(@GetMapping、@PostMapping、@PutMapping、@DeleteMapping),用来关联请求和Controller方法之间的映射关系,这样的Controller 就可以被请求访问。

  • @RequestMapping

处理请求地址映射的注解,可作用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以类上标注地址作为父路径。

  • @requestParam

主要用于在SpringMvc框架的控制层获取参数,三个常用参数:defaultValue表示设置默认值,required 通过boolean设置是否是必须要传入的参数,value值表示传入的参数名称。

  • @RequestBody

接收请求体中传递给后端的Json字符串数据的,GET方式无请求体,所以使用@RequestBody接收数据时,不能使用GET方式提交数据,需要用POST方式进行提交。

  • @ResponseBody

该注解用于方法的返回对象,可以通过配置转换器为指定数据响应格式,如果希望返回的数据不是View试图页面,而是指定数据格式的时候使用,例如:Json、Xml等。

  • @Autowired

按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用。

  • @Resource

按照ByName自动注入,需要导入包javax.annotation.Resource。@Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。

  • @PathVariable

用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数。

四、常见参数映射

1、普通映射

@RequestMapping("/getSum")
public Integer getSum (int a,int b){
return a+b ;
}

测试:

http://localhost:6003/getSum?a=1&b=2

传参名称和方法参数保持一致。

2、指定参数名

@RequestMapping("/getInfo")
public String getInfo (@RequestParam("name") String var1,
@RequestParam("say") String var2){
return var1+":"+var2 ;
}

测试:

http://localhost:6003/getInfo?name=cica&say=hello

传参名和 @RequestParam 指定的参数名要对应。

3、数组参数

@GetMapping("/getArray")
public String getArray (String[] ids){
return ids[0]+"-"+ids[1] ;
}

测试:

http://localhost:6003/getArray?ids=2&ids=3

传递并解析数组类型的参数格式。

4、Map参数

@RequestMapping("/getMap")
public String getMap (@RequestParam Map<String,String> paramMap){
return paramMap.get("name") ;
}

测试:

http://localhost:6003/getCityEntity?province=浙江&name=杭州

这里以Post方式将相关参数传递CityEntity实体对象中。

5、包装参数

@PostMapping("/getCityEntity")
public CityEntity getCityEntity (CityEntity cityEntity){
return cityEntity ;
}

测试:

http://localhost:6003/getCityEntity?province=浙江&name=杭州

这里以Post方式将相关参数传递CityEntity实体对象中。

6、Rest风格参数

@GetMapping("/getId/{id}")
public String getId (@PathVariable("id") Integer id){
return "id="+id ;
}

测试:

http://localhost:6003/getId/1

RestFul 风格参数映射。

五、源代码地址

GitHub·地址
https://github.com/cicadasmile/spring-mvc-parent
GitEE·地址
https://gitee.com/cicadasmile/spring-mvc-parent

Spring 框架基础(06):Mvc架构模式简介,执行流程详解的更多相关文章

  1. 16S 基础知识、分析工具和分析流程详解

    工作中有个真理:如果你连自己所做的工作的来龙去脉都讲不清楚,那你是绝对不可能把这份工作做好的. 这适用于任何行业.如果你支支吾吾,讲不清楚,那么说难听点,你在混日子,没有静下心来工作. 检验标准:随时 ...

  2. redux基础概念及执行流程详解

    一.执行流程 全局有一个公共的容器(所有组件都可以操作),我们可以在某个组件中把全局容器中的信息进行修改,而只要全局信息修改,就可以通知所有用到该信息的组件重新渲染(类似于发布订阅)==>red ...

  3. UWP开发之Mvvmlight实践二:Mvvmlight的核心框架MVVM与MVC、MVP的区别(图文详解)

    最近UWP开发在海外很潮流,随着微软收购Xamarin,我们这些C#程序员也可以靠这杆小米枪挑战Android,IOS平台了. 那我们为什么选择MVVM做UWP开发?MVC,MVP,MVVM他们之间到 ...

  4. MVC架构模式详细说明

    一.简介: 架构模式是一个通用的.可重用的解决方案,用于在给定上下文中的软件体系结构中经常出现的问题.架构模式与软件设计模式类似,但具有更广泛的范围. 模型-视图-控制器模式,也称为MVC模式(Mod ...

  5. SpringMVC内容略多 有用 熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器、过滤器等Web组件以及MVC架构模式进行Java Web项目开发的经验。

    熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器.过滤器等Web组件以及MVC架构 ...

  6. 转帖: Serverless架构模式简介

    Serverless架构模式简介   原贴地址:https://blog.csdn.net/chdhust/article/details/71250099?utm_medium=referral&a ...

  7. SpringMVC MVC 架构模式

    MVC 架构模式 MVC(Model.View 和 Controller)是一种架构模式,它是按照职责划分的思想将系统操作分为三个模块进行处理,每个模块负责一个职责,而且模块之间可以相互交互通信,共同 ...

  8. [Buffalo]MVC架构模式

    MVC架构模式:即Model(模型)-View(视图)-Controller(控制器). 很多人将MVC和所谓的“三层架构”进行比较,其实两者并没有什么可比性,MVC更不是分别对应着UI.业务逻辑和数 ...

  9. Spring框架基础2

    Spring框架基础2 测试Spring的AOP思想和注解的使用 导包(在前面的基础上添加) SpringAOP名词解释 AOP编程思想:横向重复代码,纵向抽取:就是说多个地方重复的代码可以抽取出来公 ...

随机推荐

  1. egg-sequelize --- nodejs

    项目 egg + sequelize + mysql2 项目结构 配置 安装模块 npm install --save egg-sequelize npm install --save egg-cor ...

  2. Java 用双向循环链表实现 遍历

    package day2; /** * 构建双向循环链表,实现遍历功能 */public class DoubleLB { public static void main(String[] args) ...

  3. mock和axios常见的传参方式

    第一次接手项目,传参方式还有些吃力,因此做一下总结. 首先我们需要会看swagger中的接口.里面写了某个接口需要接收什么样的值,前端怎么传递这个值 在mock中的传参方式: mock中传参的方式有两 ...

  4. 【java基础】为什么重写toString()方法?

    不得不说,有很多java初学者写java实体类的时候,并没有真正理解重写toString() 方法,可能是口头知道也可能是跟风随带添加toString() 方法,并没有真正理解其意义,如果真要被问起来 ...

  5. 大数据之路week01--自学之集合_2(列表迭代器 ListIterator)

    列表迭代器: ListIterator listerator():List集合特有的迭代器 该迭代器继承了Iterator迭代器,所以,就可以直接使用hasNext()和next()方法 特有功能: ...

  6. HTMLTestRunner加入logging输出

    使用HTMLTestRunner生成html的测试报告的时候,报告中只有console输出,logging的输出无法保存, 如果要在报告中加入每一个测试用例执行的logging信息,则需要改HTMLT ...

  7. 查看redis占用内存大小的方法

    查看redis占用内存大小的方法 <pre>redis-cli auth 密码info</pre><pre># Memory used_memory:1349009 ...

  8. nyoj 56-阶乘因式分解(一)(数学)

    56-阶乘因式分解(一) 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:15 submit:16 题目描述: 给定两个数m,n,其中m是一个素数. ...

  9. nyoj 266-字符串逆序输出 (isdigit(), geline(cin, my_string))

    266-字符串逆序输出 内存限制:64MB 时间限制:3000ms 特判: No 通过数:15 提交数:18 难度:0 题目描述: 给定一行字符,逆序输出此行(空格.数字不输出) 输入描述: 第一行是 ...

  10. 搭建Redis三主三从集群

    Redis三主三从集群规划 10.0.128.19   使用端口 7000  7001 10.0.128.22   使用端口 7002  7003 10.0.128.23   使用端口 7004  7 ...