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

相关推荐
JAVA百练成神2 小时前
深度理解spring——BeanFactory的实现
java·后端·spring
yuren_xia3 小时前
示例:Spring JDBC编程式事务
java·后端·spring
MerlinTheMagic4 小时前
Spring AI 核心概念
java·人工智能·spring
西洼工作室5 小时前
黑马商城-微服务笔记
java·笔记·spring·微服务
异常君5 小时前
Spring 定时任务执行一次后不再触发?5 大原因与解决方案全解析
java·后端·spring
风,停下6 小时前
C#基于Sunnyui框架和MVC模式实现用户登录管理
设计模式·c#·mvc
等什么君!6 小时前
SpringMVC处理请求映射路径和接收参数
java·开发语言·spring
-曾牛7 小时前
Spring Boot常用注解详解:实例与核心概念
java·spring boot·后端·spring·java-ee·个人开发·spring boot 注解
Code哈哈笑9 小时前
【Spring Boot】深入解析:#{} 和 ${}
java·spring boot·后端·spring·mybatis