Spring WebMVC入门实战:从概念到连接建立全解析

1. 什么是SpringWebMVC?

官方对于SpringMVC的描述是这样的:

Spring WebMVCistheoriginalwebframeworkbuiltontheServletAPIandhasbeenincluded in the Spring Frameworkfromtheverybeginning.Theformalname,"SpringWebMVC",comes from thenameofitssourcemodule(spring-webmvc)

引用来自:https://docs.spring.io/spring-framework/reference/web/webmvc.html

翻译为中文:

Spring WebMVC是基于ServletAPI构建的原始Web框架,从⼀开始就包含在Spring框架中。它的 正式名称"SpringWebMVC"来⾃其源模块的名称(Spring-webmvc),但它通常被称为"Spring MVC

什么是Servlet呢?

Servlet 是⼀种实现动态页面的技术.准确来讲Servlet是⼀套JavaWeb开发的规范,或者说是⼀套 Java Web开发的技术标准.只有规范并不能做任何事情,必须要有人去实现它.所谓实现Servlet规 范,就是真正编写代码去实现Servlet规范提到的各种功能,包括类、方法、属性等. Servlet 规范是开放的,除了Sun公司,其它公司也可以实现Servlet规范,⽬前常⻅的实现了 Servlet 规范的产品包括Tomcat、Weblogic、Jetty、Jboss、WebSphere等,它们都被称 为"Servlet 容器".Servlet 容器⽤来管理程序员编写的Servlet类.

从上述定义我们可以得出⼀个信息:

SpringWebMVC是⼀个Web框架.

1.1 MVC定义

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

  • View (视图) 指在应用程序中专门用来与浏览器进行交互,展示数据的资源.
  • Model (模型) 是应用程序的主体部分,用来处理程序中数据逻辑的部分.
  • Controller(控制器) 可以理解为一个分发器,用来决定对于视图发来的请求,需要用哪一个模型来处理,以及处理完后需要跳回到哪一个视图。即用来连接视图和模型

比如去饭店吃饭客户进店之后,服务员来接待客户点餐,客户点完餐之后,把客户菜单交给前厅,前厅根据客户菜单给后厨下达命令。

后厨负责做饭,做完之后,再根据菜单告诉服务员,这是 X 号餐桌客人的饭.在这个过程中服务员就是 View (视图),

负责接待客户,帮助客户点餐,以及给顾客端饭前厅就是 Controller (控制器),

根据用户的点餐情况,来选择给哪个后厨下达命令.后厨就是 Model (模型), 根据前厅的要求来完成客户的用餐需求

比如去公司面试我们到了公司之后,HR 会给我们安排会议室,根据候选人去通知不同的部门来安排面试,面试结束后,

由 HR 来告诉面试结果在这个过程中HR 就是 View (视图), 负责接待候选人,并告知候选人面试结果不同的部门,就是 Controller (控制器),

HR 根据候选人来选择对应的部门来进行面试 ,面试官,就是 Model 层,来处理面试这个事情.

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

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

可以看到,SpringWeb的介绍是: Build web, including RESTful, applications using Spring MVC. Uses Apache Tomcat as the default embeddedcontainer

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

SpringBoot 是 2014 年发布的,Spring 是 2004 年发布的,在 2014 年发布之前,就不能用 Spring 实现 MVC 架构吗?显然不是了.

Spring Boot 只是实现 Spring MVC 的其中一种方式而已.

Spring Boot 可以添加很多依赖,借助这些依赖实现不同的功能.Spring Boot 通过添加 Spring Web MVC 框架,来实现 web 功能.

比如:厨房可以用来做饭,但真实实现做饭功能的是火以及各种做饭相关的食材和工具.厨房就好比是 SpringBoot, 厨房可以装柜子,实现收纳功能,装燃气灶等,实现做饭功能.做饭这个事,就是 MVC, 在几千年前,有火有食材就可以实现做饭.

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

不过核心没变

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

2.学习 Spring MVC

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

咱们学习 Spring MVC, 重点也就是学习如何通过浏览器和用户程序进行交互.

主要分以下三个方面:

  1. 建立连接:将用户(浏览器)和 Java 程序连接起来,也就是访问一个地址能够调用到我们的 Spring 程序。
  2. 请求:用户请求的时候会带一些参数,在程序中要想办法获取到参数,所以请求这块主要是 获取参数的功能.
  3. 响应:执行了业务逻辑之后,要把程序执行的结果返回给用户,也就是响应.

比如用户去银行存款

  1. 建立连接:去柜台
  2. 请求:带着银行卡,身份证去存款
  3. 响应:银行返回一张存折.

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

2.1 项目准备

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

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

2.2 建立连接

在 Spring MVC 中使用@RequestMapping来实现 URL 路由映射,也就是浏览器连接程序的作用我们先来看看代码怎么写创建一个 UserController 类,实现用户通过浏览器和程序的交互,具体实现代码如下

java 复制代码
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 
@RestController
 public class UserController {
    // 路由器规则注册
     @RequestMapping("/sayHi")
    public String sayHi(){
         return "hello,Spring MVC";
     }
 }

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

接下来访问:http://127.0.0.1:8080/sayHi, 就可以看到程序返回的数据了

404:资源路径不存在,没找到你这个url

2.2.1 @RequestMapping 注解介绍

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

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

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

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

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

可以看到,程序报了404,找不到该页面. 这就是 @RestController 起到的作用

⼀个项目中,会有很多类,每个类可能有很多的方法,Spring程序怎么知道要执行哪个方法呢?

Spring 会对所有的类进行扫描,如果类加了注解 @RestControlle r,Spring 才会去看这个类里面的方法有没有加 @RequestMapping 这个注解,当然他的作用不止这一点,咱们先用,后面再详细讲

2.2.2 @RequestMapping

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

.@RequestMapping 标识一个类:设置映射请求的请求路径的初始信息

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

java 复制代码
  @RequestMapping("/user")
   @RestController
    public class UserController {
        @RequestMapping("/sayHi")
         public String sayHi(){
             return "hello,Spring MVC";
   }
}

访问地址:http://127.0.0.1:8080/user/sayHi

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

java 复制代码
@RequestMapping("user")
@RestController
public class UserController {
     @RequestMapping("sayHi")
     public String sayHi(){
         return "hello,Spring MVC";
     }
 }

访问http://127.0.0.1:8080/user/sayHi, 依然可以正确响应.通常情况下,我们加上 /

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

java 复制代码
 @RequestMapping("/user/m1")
@RestController
 public class UserController {
     @RequestMapping("/say/hi")
     public String sayHi(){
         return "hello,Spring MVC";
     }
 }

访问路径: http://127.0.0.1:8080/user/m1/say/hi

2.2.3 @RequestMapping 是 GET 还是 POST 请求?

我们来测试一下就知道结论了

**GET 请求:**浏览器发送的请求类型都是 get, 通过以上案例,可以看出来 @RequestMapping 支持 get 请求.

**POST 请求:**我们通过 form 表单来构造请求:创建 test.html,html 代码:

java 复制代码
 <!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title>Title</title>
 </head>
 <body>
     <form action="/user/sayHi" method="post">
         <input type="submit" value="提交">
     </form>
 </body>
 </html>

前端代码放在 static 目录下,访问方式为:http://127.0.0.1:8080/test.html

如上图,访问链接为: http://127.0.0.1:8080/html/test.html

打开Fildder,抓一下包看看post信息

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

那如何指定 GET 或者 POST 类型呢?指定 GET/POST 方法类型我们可以显示的指定 @RequestMapping 来接收 POST 的情况,如下所示:

java 复制代码
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.ResponseBody;
 
 @RestController
 public class UserController {
     @RequestMapping(value = "/getRequest",method= RequestMethod.POST)
     public String sayHi(){
         return "get request...";
     }
 }

2.3 Postman

介绍从上面的案例中,也发现了一个新的问题,就是我们测试后端方法时,还需要去写前端代码。这对我们来说,是一件麻烦又痛苦的事情.随着互联网的发展,也随着项目难度的增加,企业也按照开发的功能,把人员拆分成了不同的团队。

界面显示交给 "前端开发工程师", 业务逻辑的实现交给 "后端开发工程师".后端开发工程师,不要求也不需要掌握前端技能了.那后端开发工程师,如何测试自己的程序呢?

  • 使用专业的接口测试工具使用的是 Postman, 接下来我们来学习 Postman 的使用.

2.3.1 下载安装 postman

下载链接:https://www.postman.com/downloads/

2.3.2 创建请求界面

这是我在ee阶段创建的,大家可以看一下我这个界面,创建一个名为SpringMVC的项目名

创建请求:

点击项目的右边有三个点,进行创建,这是我创建的request请求

界面介绍

2.3.3 传参介绍

1. 普通传参,也就是通过查询字符串来传参

其中,查询字符串就是请求的参数

这就是平时我们看到url是一串好像是乱码的字符串,其实就是参数

2. form-data(完整表示为:multipart/form-data)
3. x-www-form-urlencoded

form表单,对应 Content-Type: application/x-www-from-urlencoded

4. raw

可以上传任意格式的⽂本,可以上传text、json、xml、html等

干货太多了,内容太多了,就把后面放到下一个博客里了

相关推荐
Savvy..2 小时前
RabbitMQ
java·rabbitmq·java-rabbitmq
TT哇2 小时前
Spring Boot 项目中关于文件上传与访问的配置方案
java·spring boot·后端
峥嵘life2 小时前
Android16 EDLA 认证测试BTS过程介绍
android·java·linux
韩立学长2 小时前
Springboot考研自习室预约管理系统1wdeuxh6(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
残花月伴2 小时前
天机学堂-day5(互动问答)
java·spring boot·后端
北友舰长3 小时前
基于Springboot+thymeleaf图书管理系统的设计与实现【Java毕业设计·安装调试·代码讲解】
java·spring boot·mysql·课程设计·图书管理·b/s·图书
陈文锦丫10 小时前
MQ的学习
java·开发语言
乌暮10 小时前
JavaEE初阶---线程安全问题
java·java-ee
爱笑的眼睛1110 小时前
GraphQL:从数据查询到应用架构的范式演进
java·人工智能·python·ai