Spring Web MVC入门

1.什么是Spring Web MVC:

1.1 MVC定义:

官方解释:Spring Web MVC是基于Servlet API构建的原始Web的框架,从一开始就包含在Spring框架中。它的正式名字"Spring Web MVC",用于构建基于java的web应用程序,遵循模型(Moder)-视图(View)-控制器(Controller)

View(视图):指在运用程序中专门用来与浏览器进行交互, 展示数据资源。

Model(模型):是应用程序的主体部分,代表了程序的数据和业务逻辑。

Controller(控制器):可以理解为一个分发器,用来决定视图传来的请求,并调用相应的模型进行相应的处理,以及处理完后需要调回哪一个视图,即用来连接模型和视图。

1.2 什么是Spring Web MVC:

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

总结来说,Spring Web MVC是一个实现了MVC思想的Web框架。

不过Spring在实现MVC思想时,也结合了自身项目的特点,做出了一些改变,如下图:

Controller也可以负责接受用户的请求,并调用相应的模型进行进行处理。

2.学习Spring MVC:

既然是Web框架,在浏览器输入了URL之后,我们的Spring MVC项目就可以感知到用户的请求,并给于相应。重点也就是学习如何通过浏览器和用户程序进行交互。包括下面三个方面:

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

**2.请求:**用户在发起请求时,会带有一些参数,在程序中要想办法获取到这些参数,所以请求最主要的就是获取参数。

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

2.1 建立连接:

@RequestMapping介绍:

Spring MVC中使用@RequestMapping来实现URL路由映射

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

@RestController介绍(后面会详细说):

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

Spring会对所有类进行扫描 ,如果类加了RestController,spring才会去这个类里面的方法看有没有加@RequestMapping。(作用并不止于此)

例1:

在浏览器中输入127.0.0.1:8080/Test/hello

@RequestMapping的使用:

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

@RequestMappiing标识一个类,设置映射请求的请求路径的初始信息

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

在上面的例1中,在@RequestMapping的URL的路径前加不加 **/**都是可以的,但是在企业中还是加上比较好。

扩展:

因为RequestMapping既是GET也是POST请求,但是我们如果只想要支持GET请求怎么办呢?

其实在RequestMapping可以指定GET/POST请求。

2.2传参(软件POSTMAN):

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

学习HTTP的时候,我们通过URL来访问互联网中的某一资源:

URL格式如下:

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

2.form-data(完整表示为:multipart/form-data)

表单提交数据,在form标签中加上 enctyped="multipart/form-data",通常用于提交一些文件/图片,对应Body中:Content-Type:multipart/form-data

3.x-www-form-urlencoded:

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

4.raw:

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

2.3 请求:

1.传递单个参数:

java 复制代码
@RequestMapping("/param")
@RestController
public class ParamController {
    @RequestMapping("/m1")
    public String m1(String name){
        return "姓名:"+name;
    }
}

可以看到,后端成功的拿到了name参数。

Spring MVC会根据方法的参数名,找到对应的参数,并赋值给方法,如果参数名不对,则不能赋值成功。

注意事项:

1.如果传参的类型是基本类型(整数类型:byte,short,int,long 浮点类型:float,double 字符类型:char),参数必须传(除boolean外),否则会报错500

2.类型不匹配时,也会报错400

2.传递多个参数:

接受多个参数,和接受单个参数是一样,直接使用方法的参数接受即可,使用多个形参。

java 复制代码
@RequestMapping("/m2")
    public String m2(String name,Integer age){
        return "姓名: "+name+" age: "+age;
    }

当有多个参数传参时,前后端进行参数匹配时,是以参数的名称进行匹配的,因此参数的位置是不影响后端获取参数的结果的。

3.传递对象:

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

Spring MVC可以自动实现对象参数的赋值

创建一个对象Person

java 复制代码
public class Person {
    private String name;
    private Integer age;

    public Integer getAge() {
        return age;
    }

    public String getName() {
        return name;
    }

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

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

    @Override
    public String toString() {
        return "Person{" +
                "姓名='" + name + '\'' +
                ", 年龄=" + age +
                '}';
    }
}
java 复制代码
 @RequestMapping("/m3")
    public String m3(Person person){
        return person.toString();
    }

Spring会根据各个的参数的名字自动绑定到对象的各个属性中去,如果某个属性未传递,则赋值为null(基本类型则是默认初始值)

4.后端参数重命名:

有些情况,前端传参的值的名称和后端接受的参数的名字有可能不一样,这样就会出现接受不到的情况,如果出现这种情况,我们可以使用@RequestParam来重命名后端的参数值。

java 复制代码
@RequestMapping("/m4")
    public String m4(@RequestParam("name") String n){
        return n;
    }

注意:

1.使用@RequestParam进行参数重命名时,请求参数只能和@RequestParam声明的名称一样,才能进行参数绑定和赋值

2.使用@RequestParam进行参数重命名时,此时参数就成了必传参了,要想让他是非必传参,只需要修改@RequestParam中的require为false

此时参数就是非必传参数了。

5.传递数组:

Spring MVC可以自动绑定数组参数的赋值。

java 复制代码
  @RequestMapping("/m5")
    public String m5(String[] str){
        return Arrays.toString(str);
    }

6.传递集合:

集合传递和数组传递是相似的,集合传递需要@RequestParam来绑定参数关系。

java 复制代码
@RequestMapping("/m6")
    public String m6(@RequestParam List<String> str){
    return "结果:"+str;
    }

7.传递JSON:

7.1 JSON(JavaScript Object Notation)概念:

json是一种轻量级的数据交互格式,有着自己的格式和语法,使用文本表示一个对象或者数组的信息,因此JSON的本质是一个字符串,主要负责在不同语言中数据的传递和交换。

7.2Json语法:

Json是一个字符串,我们看一段Json代码:

java 复制代码
{
    "squadName": "Super hero squad",
    "homeTown": "Metro City",
    "formed": 2016,
    "secretBase": "Super tower",
    "active": true,
    "members": [
        {
            "name": "Molecule Man",
            "age": 29,
            "secretIdentity": "Dan Jukes",
            "powers": [
                "Radiation resistance",
                "Turning tiny",
                "Radiation blast"
            ]
        },
        {
            "name": "Madame Uppercut",
            "age": 39,
            "secretIdentity": "Jane Wilson",
            "powers": [
                "Million tonne punch",
                "Damage resistance",
                "Superhuman reflexes"
            ]
        },
        {
            "name": "Eternal Flame",
            "age": 1000000,
            "secretIdentity": "Unknown",
            "powers": [
                "Immortality",
                "Heat Immunity",
                "Inferno",
                "Teleportation",
                "Interdimensional travel"
            ]
        }
    ]
}

也可以压缩表示为:

java 复制代码
{"squadName":"Super hero squad","homeTown":"Metro City","formed":2016,"secretBase":"Super tower","active":true,"members":[{"name":"Molecule Man","age":29,"secretIdentity":"Dan Jukes","powers":
["Radiation resistance","Turning tiny","Radiation blast"]},{"name":"Madame Uppercut","age":39,"secretIdentity":"Jane Wilson","powers":["Million tonne punch","Damage resistance","Superhuman reflexes"]},{"name":"Eternal Flame","age":1000000,"secretIdentity":"Unknown","powers":["Immortality","Heat Immunity","Inferno","Teleportation","Interdimensional travel"]}]}

两种数据的描述方式都一样,只不过第一种进行了格式化,更易读。

语法:

1.数据在键值对(Key/Value)中。

2.数据由逗号分隔开。

3.对象用{ }表示

4.数组用[ ]表示

5.值可以为对象,也可以为数组,数组中也可以包含多个对象。

7.3 Json的两种格式:

1.对象:大括号{ }保存的对象是一个无序的键值对集合,一个对象以左括号 { 开始,右括号 } 结束,每个键后面用:(冒号)键值对之间用,(逗号)隔开

2.数组:中括号[ ]保存的数组是值(value)有序的集合,一个数组以左中括号 [ 开始,右中括号 ] 结束,值之间使用逗号,隔开。

7.4 Json字符串和Java对象互转:

Spring MVC中也集成了JSON的转换工具,我们可以直接使用,来完成JSON字符串和JAVA对象的互转。

本质上是Jackson-databind提供的功能,Spring MVC把该工具包引入进来了,直接使用即可。

如果脱离了Spring MVC,我们就需要引入依赖。

< dependency >
< groupId >com.fasterxml.jackson.core</ groupId >
< artifactId >jackson-databind</ artifactId >
< version >2.13.5</ version >
</ dependency >

json的转换工具很多,Jackson-databind只是其中一种。

java 复制代码
public class JSONutils {
    private static ObjectMapper objectMapper = new ObjectMapper();
    public static void main(String[] args) throws JsonProcessingException {
        Person person = new Person();
        person.setName("酷酷的森");
        person.setAge(18);
        //java对象转json字符串
        String json=objectMapper.writeValueAsString(person);
        System.out.println("json字符串为:"+json);
        //json字符串转java对象
        Person p=objectMapper.readValue(json, Person.class);
        System.out.println("name"+p.getName()+",age"+p.getAge());
    }
}

总结:

使用ObjectMapper对象提供的两种方法,可以完成java对象和json的互转。

writeValueAsString:把对象转为JSON字符串。

readValue:把字符串转成对象。

7.5JSON的优点:

1 简单易用:语法简单,易于理解和编写,可以快速的进行数据交换。

2 跨平台支持:JSON可以被多种语言解析和生成,可以在不同平台和语言之间进行数据交互和传输。

3.轻量级:相较于XML格式,JSON数据格式更加轻量级,传输数据时占用带宽较小,可以提高传输数据的速度。

4.易于扩展:JSON数据格式灵活,支持嵌套对象和数组等复杂的数据结构,便于扩展和使用。

5.安全性高:JSON是纯文本格式,不包含可执行代码,不会执行恶意代码。

注意:传递JSON字符串时,后端要用RequestBody注解,才能接收到JSON字符串。

2.4 获取URL中参数:

这里要介绍一个新的注解:@PathVariable

PathVariable:路径变量。

和字面表达的一样,其主要作用于请求URL路径上的数据绑定。


1.如果方法参数名称和需要绑定的URL中的变量名称⼀致时, 可以简写, 不⽤给@PathVariable的属性赋值, 如上述例⼦中的id变量
2.如果⽅法参数名称和需要绑定的URL中的变量名称不⼀致时, 需要@PathVariable的属性value赋值, 如上述例⼦中的userName变量

注意:上传文件时,介绍新的注解:@RequestPart

相关推荐
sg_knight7 小时前
Ribbon负载均衡实战指南:7种策略选择与生产避坑
java·spring boot·spring·spring cloud·微服务·ribbon·负载均衡
书语时9 小时前
Spring @Autowired解析
java·后端·spring
迢迢星万里灬12 小时前
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
java·spring boot·spring·mybatis·spring mvc·面试指南
面朝大海,春不暖,花不开12 小时前
Spring AI与Spring Modulith核心技术解析
人工智能·spring·flask
有梦想的攻城狮13 小时前
spring中的ImportSelector接口详解
java·后端·spring·接口·importselector
LUCIAZZZ14 小时前
Java设计模式基础问答
java·开发语言·jvm·spring boot·spring·设计模式
KotlinKUG贵州16 小时前
Spring开发,从Kotlin开始
spring boot·spring·kotlin
攒了一袋星辰17 小时前
Spring类型转换融入IOC生命周期
java·后端·spring
考虑考虑17 小时前
Springboot3.4.x中的RestClient 和 RestTemplate
spring boot·后端·spring
大白爱琴17 小时前
八股文——JVM
java·jvm·spring