目录

SpringMVC深入解析-RequestMapping-注解的概念及使用和-MVC-介绍

【SpringMVC】深入解析@ RequestMapping 注解的概念及使用和 MVC 介绍

https://i-blog.csdnimg.cn/direct/a9d3553301c848ff9cad6aa4116248ea.gif#pic_center

https://i-blog.csdnimg.cn/direct/6d1b39ab217a443297d787a397501175.png

https://i-blog.csdnimg.cn/direct/cd5abfb0ba1c49128b69f4ebb5922bac.gif#pic_center


Spring Web MVC入门


1. Spring Web MVC


什么是 Spring Web MVC?

Spring Web MVC是Spring框架中的一个用来做网站开发的部分,它是基于Servlet技术的。

虽然它的正式名字叫“Spring Web MVC”,但大家一般都简称它“SpringMVC”。

什么是 Servlet ?

Servlet是一种技术,用来创建动态网页。

它其实是一种规范,也就是规定了如何写Java Web应用的规则。但单靠规范本身不能做任何事,必须要开发者根据这些规则写代码,才能实现它的功能。

很多公司都可以根据这个规范来开发相应的软件,比如Tomcat、Weblogic、Jetty等,它们被叫做“Servlet容器”。

这些容器的作用就是管理和运行开发者写的Servlet代码。

从上述定义我们可以得出一个信息:Spring Web MVC是一个Web框架。 下面咱们简称之为:Spring MVC

然而要真正的理解什么是Spring MVC?我们首先要搞清楚什么是MVC?


1.1 MVC 定义


MVC是Model View Controller的缩写,它是软件工程中的一种软件架构设计模式,它把 软件系统 分为 模型视图控制器 三个基本部分。

https://i-blog.csdnimg.cn/direct/16e6ddd26718410bb56eebd1ea47cffb.png

  • Model :数据的管理者,负责存取和处理数据,如数据库操作。
  • View :数据的展示者,用户看到的界面,如网页或APP界面。
  • Controller :协调者,接收用户请求,选择对应的Model处理,并返回结果到View。
  • Model :是看不见的数据管家 (数据库操作/计算逻辑), 后厨
  • View :是看得见的界面(你操作的按钮/表格), 点餐菜单
  • Controller: 是传话小秘书 (在界面和数据之间跑腿传话), 传菜单的服务员

1.2 什么是Spring MVC?


MVC是一种架构设计模式,也是一种思想,而Spring MVC是对MVC思想的具体实现。除此之外,Spring MVC还是一个Web框架。

总结来说,Spring MVC是一个实现了MVC模式的Web框架。所以,Spring MVC主要关注有两个点:

  1. MVC
  2. Web框架

Spring MVC 全称是 Spring Web MVC。

https://i-blog.csdnimg.cn/direct/5cc64e5ffdd94995a8e44bfc41ccbb39.png

其实,Spring MVC我们在前面已经用过了,在创建Spring Boot项目时,我们勾选的 Spring Web 框架其实就是Spring MVC框架:

可以看到,Spring Web的介绍是:

Build web, including RESTful, applications using Spring MVC. Uses Apache Tomcat as the default embedded container.

这时候可能有些 uu 就懵了,前面创建的不是SpringBoot项目吗?怎么又变成了Spring MVC项目?他们之间到底有着什么样的关系?

  • SpringBoot是2014年发布的,Spring是2004年发布的,在2014年发布之前,就不能用Spring实现MVC架构吗?显然不是了。
  • Spring Boot只是实现Spring MVC的其中一种方式而已。
  • Spring Boot可以添加很多依赖,借助这些依赖实现不同的功能。Spring Boot通过添加Spring Web MVC框架,来实现web功能。

不过Spring在实现MVC时,也结合自身项目的特点,做了一些改变,相对而言,下面这个图或许更加合适一些……

https://i-blog.csdnimg.cn/direct/46da265298cb47a6a7c9241d567b3a60.png


https://i-blog.csdnimg.cn/direct/0d7230f5cde945f58394ac99e39f6af2.png

现在请求不再先走 view 再走 controller ,请求可以直接发送到 controller

controller 在受到 model 传回来的响应后,可以返回给 view ,也可以直接返回 浏览器

后端开发一般就不会让请求和响应交互过程走 view ,不过核心没变 ,比如上面的例子中,去饭店吃饭:

  • 一些饭店是前厅来负责接待客户,帮助客户点餐,也就是 Controller 来负责接收用户的请求。
  • 去公司面试,直接由面试官来接待候选人,省去了HR中间的交接过程。

2. 学习Spring MVC


既然是Web框架,那么当用户在浏览器中输入了 url 之后,我们的Spring MVC项目就可以感知到用户的请求,并给予响应。

咱们学习Spring MVC,重点也就是学习如何通过 浏览器用户程序 进行交互。主要分以下三个方面:

  1. 建立连接 :让用户(浏览器)能找到并访问你的 Spring 程序,简单来说就是让用户输入网址时能够打开你的网页。
  2. 请求 :用户在网页上点击、输入等操作时,会发送一些信息(比如表单数据)。你的程序需要能接收到这些信息,以便做进一步处理。
  3. 响应 :当程序处理完用户的请求后,需要把处理结果(比如网页内容)返回给用户,这就是响应。

总结一下:就是让用户通过浏览器访问程序,获取信息,再把结果返回给用户。

对于Spring MVC来说,掌握了以上3个功能就相当于掌握了Spring MVC。


2.1 项目准备


Spring MVC项目创建和Spring Boot创建项目相同,在创建的时候选择Spring Web就相当于创建了Spring MVC的项目。

Spring MVC使用Spring Boot的方式创建

创建项目时,勾选上Spring Web模块即可,如下图所示:

https://i-blog.csdnimg.cn/direct/fe457322834f4899967f59deaed02c6c.png


2.2 建立连接


在Spring MVC中使用 @RequestMapping 来实现 URL 路由映射,也就是浏览器连接程序的作用

我们先来看看代码怎么写,创建一个 UserController 类,实现用户通过浏览器和程序的交互,具体实现代码如下:

https://i-blog.csdnimg.cn/direct/291454e91c884d96a24c2a7f53355609.png

资源路径:类路径+方法路径;

使用 @ RequestMapping 等注解(注解),如果注解相同,就一定要保证 请求方式 + 资源路径 唯一;

https://i-blog.csdnimg.cn/direct/b7217497ee404081b2b412cf042ade1f.png


错误日志:

https://i-blog.csdnimg.cn/direct/430c7f9813434072b1c5a1ae6d3a3382.png


使用不同注解,请求方式不同,哪怕资源路径相同,也是可以的;

https://i-blog.csdnimg.cn/direct/de5925371bdc42e38eda8d22d9181486.png

程序运行结果:

https://i-blog.csdnimg.cn/direct/3dd524be72ad4c19af0154a945f3814c.png

,建议给所有的类都加上类路径,可以:

  • 使用唯一命名类路径,避免报错;
  • 提高可读性;

方法名和路径名称无需一致

接下来,我们 运行程序 ,访问: ,就可以看到程序返回的数据了:

https://i-blog.csdnimg.cn/direct/c2944a49786648c596c0fa5577823d89.png


加上类路径也可以:

https://i-blog.csdnimg.cn/direct/d63523d30a3147e7814aa9c656ed946c.png


2.2.1 @ RequestMapping 注解介绍

@RequestMapping 是Spring Web MVC应用程序中最常被用到的注解之一,它是用来注册接口的路由映射的。

表示服务收到请求时,路径为 /sayHi 的请求就会调用 sayHi 这个方法的代码。

路由映射 :当用户访问一个URL时,将用户的请求对应到程序中某个类的某个方法的过程就叫路由映射。

既然 @RequestMapping 已经可以达到我们的目的了,我们为什么还要加 @RestController 呢?


我们把 @RestController 去掉,再来访问一次:

https://i-blog.csdnimg.cn/direct/03ec932a03e643e780d1644823a9f356.png

  • 可以看到,程序报了404,找不到该页面。
  • 这就是 @RestController 起到的作用。
  • 一个项目中,会有很多类,每个类可能有很多的方法,Spring程序怎么知道要执行哪个方法呢?
  • Spring会对所有的类进行扫描,如果类加了注解 @RestController ,Spring 才会去看这个类里面的方法有没有加 @RequestMapping 这个注解,当然它的作用不止这一点。

2.2.2 @ RequestMapping使用

@RequestMapping 既可修饰类,也可以修饰方法,当修饰类和方法时,访问的地址是资源路径, 资源路径=类路径+方法路径

  • @RequestMapping 标识一个 :设置映射请求的请求路径的 初始信息
  • @RequestMapping 标识一个 方法 :设置映射请求请求路径的 具体信息

https://i-blog.csdnimg.cn/direct/bbfc1b252edd4ce7ae06f3e341cf4d78.png

访问地址:

https://i-blog.csdnimg.cn/direct/9fb3ab871345494aa960b0fad0dd1564.png


注意:

@RequestMapping 的URL路径最前面加不加 / (斜杠)都可以,Spring程序启动时,会进行判断,如果前面没有加,Spring会拼接上一个 /

https://i-blog.csdnimg.cn/direct/be268e2c15894751b2224a79775c7a78.png

访问 ,依然可以正确响应。

https://i-blog.csdnimg.cn/direct/1ef6733f92a344808f6959eb45806d44.png

通常情况下,我们加上 /

@RequestMapping 的URL路径也可以是多层路径,最终访问时,依然是 类路径+方法路径

https://i-blog.csdnimg.cn/direct/ce14018cb18b4dc3acd21a37c2863c21.png

访问路径:

https://i-blog.csdnimg.cn/direct/06ba9014e7794f458a6e74a2fff8c99b.png


2.2.3 @ RequestMapping 是GET还是POST 请求?

GET请求

浏览器发送的请求类型都是GET;

我们打开 ,并且使用 Fiddler 抓包,抓包结果:

https://i-blog.csdnimg.cn/direct/c9b2a3f8a116479aa80690b8f9c3b63b.png

可以看出来 @RequestMapping 支持GET请求


POST请求

我们通过 form 表单 来构造请求:

创建 test.html ,HTML代码:

https://i-blog.csdnimg.cn/direct/9d3adfcbbb01493787e93e33a9ef9dbc.png


前端代码放在 static 目录下,访问方式为:

https://i-blog.csdnimg.cn/direct/437f43199c05444a9ce033498ad6d98a.png


如果有多层目录,访问链接从 static 目录开始写。

https://i-blog.csdnimg.cn/direct/3f133f8fe5cf4c75a7d0a497e8737fc1.png

如上图,访问链接为: 。

https://i-blog.csdnimg.cn/direct/1fe20a5628cc4e6f997c93202f49a623.png

从运行结果可以看出: @RequestMapping 既支持GET请求,又支持POST请求。同理,也支持其他的请求方式。


那如何指定GET或者POST类型呢?

指定GET/POST方法类型

我们可以显式地指定 @RequestMapping 来接收POST的情况,如下所示:

https://i-blog.csdnimg.cn/direct/0c77c498a2bf401f8a3380552e38db1d.png


https://i-blog.csdnimg.cn/direct/a9d3553301c848ff9cad6aa4116248ea.gif#pic_center

https://i-blog.csdnimg.cn/direct/cd5abfb0ba1c49128b69f4ebb5922bac.gif#pic_center