Spring MVC

 1.Spring MVC

Spring Web MVC is the original web framework built on the Servlet API and has been included in the Spring Framework from the very beginning. The formal name, "Spring Web MVC," comes from the name of its source module (spring-webmvc), but it is more commonly known as "Spring MVC". 

这是官方对于Spring MVC的描述。转换成中文:

Spring Web MVC是基于Servlet API构建的原始Web框架,从一开始就包含在Spring框架中。正式名称“SpringWebMVC”来源于其源模块(Spring-webmvc)的名称,但更常见的名称是“SpringMVC”。

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

1.1MVC定义

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

View(视图):指在应⽤程序中专⻔⽤来与浏览器进⾏交互,展⽰数据的资源。

Model(模型):是应⽤程序的主体部分,⽤来处理程序中数据逻辑的部分。

Controller(控制器):可以理解为⼀个分发器,⽤来决定对于视图发来的请求,需要⽤哪⼀个模型 来处理,以及处理完后需要跳回到哪⼀个视图。即⽤来连接视图和模型。

 1.2什么是Spring MVC

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

总结来说,Spring MVC是⼀个实现了MVC 模式的Web框架。

2.学习Spring MVC 

学习Spring MVC就是学习如何通过浏览器和用户程序之间进行交互。

主要分以下三个方面

1.建立连接:将用户(浏览器)和Java程序连接起来。也就是访问一个地址能够调用到我们的Spring程序。

2.请求用户:请求的时候会带一些参数,要在程序中想办法获取到参数。

3.响应:执行了业务逻辑后要把程序执行的结果返回给用户。

2.1项目创建

 

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

 2.2建立连接

在Spring MVC项目中实现连接操作之前,我们先解决一个问题:什么是路由映射?

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

Spring MVC项目实现连接的操作就与路由映射密切相关,实现路由映射可以使用注解

用来实现注册接口的路由映射的常见注解有@RequestMapping@PostMapping@GetMapping

2.2.1使用@RequestMapping

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

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

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

这个时候就可以访问到了

注意:@RequestMapping既支持Get请求也支持Post请求

2.2.2指定Get/Post方法

我们可以指定@RequestMapping来接收Get方法,如图所示:

3. Spring MVC参数获取

访问不同的路径,就是发送不同的请求。在发送请求时,可能会带⼀些参数,所以学习Spring的请求,主要是学习如何传递参数到后端以及后端如何接收。

3.1传递单个参数

代码如下:

 对代码进行检测:

可以看到后端程序 正确拿到了name参数的值。

Spring MVC会根据方法的参数名找到对应的参数赋值给方法

如果参数不一致是无法获取到参数的:

3.2传递多个参数 

代码如下:

 对代码进行测试:

 与传递单个参数一样,传递多个参数直接发送请求。参数的顺序可以调换。

注意:

 如果传参的类型为基本数据类型,必须要传值,如果不传值会报错。

此时我们的参数类型为基本数据类型,进行测试:

 当我们使用包装类再进行测试时:

这样不传值就不会报错了。

3.3传递对象

如果参数⽐较多时,⽅法声明就需要有很多形参。并且后续每次新增⼀个参数,也需要修改⽅法声明。我们不妨把这些参数封装为⼀个对象。

Spring MVC也可以⾃动实现对象参数的赋值,此时我们创建一个Person对象

public class Person {
    Integer id;
    String name;
    Integer age;

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

传递对象代码实现:

 测试结果:

3.4传递数组

当我们请求中,同一个参数有多个时,浏览器会帮我们给封装成一个数组。

测试结果:

 

3.5传递集合 

默认情况下,请求中参数名相同的多个值,是封装到数组。如果要封装到集合,要使⽤@RequestParam 绑定参数关系。

和数组类似,同⼀个请求参数名有为多个,且需要使⽤@RequestParam 绑定参数关系。

测试结果:

 如果没有使用@RequestParam呢?

测试一下:

可以看到如果没有使用@RequestParam 就会出现500错误。此时我们就要去后端的日志查看问题了

 3.6传递JSON数据

我们先来了解一下什么是JSON

JSON是⼀种轻量级的数据交互格式。它基于ECMAScript(欧洲计算机协会制定的js规范)的⼀个⼦集, 采⽤完全独⽴于编程语⾔的⽂本格式来存储和表⽰数据。

简单来说,JSON就是⼀种数据格式,有⾃⼰的格式和语法,使⽤⽂本表⽰⼀个对象或数组的信息,因此 JSON本质是字符串。主要负责在不同的语⾔中数据传递和交换。 

JSON是一个字符串,其格式如下:

{  
  "name": "lzx",  
  "age": 21,  
  "city": "FuZhou"  
}

了解完JSON, 现在来传递JSON数据:

需要注意的是:传递JSON数据需要使用@RequestBody这个注解

@RequestBody:请求正⽂,意思是这个注解作⽤在请求正⽂的数据绑定,请求参数必须在写在请求正⽂中。

测试一下:

3.7获取URL参数 

获取到URL的参数,需要使用@PathVariable注解。

path variable是路径变量的意思,和字面表达的意思一样,这个注解主要作用在请求URL路径上的数据绑定。

 获取URL参数可以获取一个也可以获取多个。

获取一个URL参数的代码实现:

测试结果如下:

获取多个URL参数的代码如下:

获取多个URL参数的测试结果:

但是,需要注意它们的顺序。而且,请求格式必须和后端定义的URL格式匹配

3.8上传文件

上传文件需要使用@RequestPart注解。

测试结果如下:

3.9获取Cookie

获取Cookie的传统代码:

 测试结果:

 接下来我们来手动制造Cookie流程:

当我们手动制造Cookie后,我们就能获取到Cookie的值。

接下来我们用更简洁的方式来获取Cookie:使用@CookieValue注解

接下来来测试一下获取到的Cookie的值:

3.10获取Session

这是传统使用HttpServletRequest来获取到Session:

检测一下:

Object getAttribute(String name):返回在该Session会话中具有指定名称的对象,如果没有指定名 称的对象,则返回null。

下面是简洁获取Session:

 测试结果:

但是获取Session需要注意:

1)使用@SessionAttribute 注解进行获取Session的操作,该注解里的参数的参数名要与Session列表里面的Session名要一致。

2)存储Session操作没有与之对应的注解,只有获取Session操作才有对应的注解@SessionAttribute 进行简便获取。

3)Cookie能通过手动添加,但Session不能手动添加,只能通过代码进行Session创建后添加。

 3.11获取Header

传统也是使用HttpServletRequest来获取到Header:

接下来看看获取到的Header结果:

简洁获取Header方式: 

简洁获取Header的结果:

接下来我们来使用 Fiddler抓包看看获取到的User-Agent是否正确:

很显然这是正确的。

但是获取Header也有需要注意的地方:

使用@RequestHeader 注解进行获取Header中的参数操作,该注解里的参数的参数名要与Header里面的参数名要一致。

 4.Spring MVC数据输出

我们上面学习了Spring MVC传递参数,接下来是Spring MVC的数据输出。

4.1返回静态页面

这是HTML的代码:

返回静态页面的代码:

这是返回的结果:

 与 参数获取不同的地方是,数据输出使用@Controller注解而不是@RestController

接下来我们使用@RestController来试试

结果发现,⻚⾯未正确返回,HTTP响应把 "/index.html" 当做了HTTP响应正⽂的数据。

这是因为,使⽤的 @RestController 是返回的数据。 

4.2返回数据

返回数据的代码:

需要使用@ResponseBody注解,@ResponseBody 是定义返回的数据格式为⾮视图,返回⼀个text/html信息。

测试结果:

4.3返回HTML

后端返回数据时,如果数据中有HTML代码,也会被浏览器解析。

运行程序,浏览器的响应结果:

4.4返回JSON

首先先定义一个Person类

 然后返回JSON对象:

最后在 浏览器查看结果:

此时我们通过Fiddler观察到,响应结果Content-Type 为application/json   

4.5设置状态码

Spring MVC会根据我们⽅法的返回结果⾃动设置响应状态码,我们也可以⼿动指定状态码,通过Spring MVC的内置对象HttpServletResponse提供的⽅法来进⾏设置。

 

浏览器响应结果:

我们再通过Fiddler来观察响应结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值