Spring Web MVC入门

什么是Spring Web MVC

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

        MVC定义

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

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

        什么是Spring MVC

        MVC是一种设计框架,Spring MVC就是对MVC思想的一种具体实现,同时Spring MVC还是一个Web框架.总的来说,Spring MVC是一个实现了MVC的web框架.

        在创建Spring Boot项⽬时,我们勾选的Spring Web框架其实就是Spring MVC框架:

        Spring Boot与Spring MVC的关系:Spring Boot是快速开发应用框架,它集成了很多功能,其中包含Spring MVC.在使用Spring Boot开发web时,底层就是在使用Spring MVC.

学习Spring MVC

        学习Spring MVC重点是学习如何通过浏览器与用户程序进行交互.主要分为以下三个方面:

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

        请求:用户请求的时候会带⼀些参数,在程序中要想办法获取到参数,所以请求这块主要是获取参数的功能.

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

        项目准备

        SpringBoot集成了Spring MVC的功能,在创建项目时,创建SpringBoot项目并勾选SpringMVC即可.

        建立链接

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

@RestController
public class Hello {
    // 此处/hello用于访问
    @RequestMapping("/hello")
    public String hello(){
        return "Hello Spring";
    }
}

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

        @RequestMapping注解

        @RequestMapping是SpringMVC中最常被用到的注解之一,他是用来注册接口的路由映射的.表示服务收到请求时,路径为/hello的请求就会调用hello()方法的代码

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

        @RequestMapping的使用

        @RequestMapping既可以修饰方法,也可以修饰类,在修饰类时,用户想要访问就需要访问类路径+方法路径.

@RequestMapping("/request")
@RestController
public class Request {
    @RequestMapping("/r1")
    public String r1(){
        return "hello";
    }
}

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

@RequestMapping("request")
@RestController
public class Request {
    @RequestMapping("r1")
    public String r1(){
        return "hello";
    }
}

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

@RequestMapping("/request/aa")
@RestController
public class Request {
    @RequestMapping("/hello/r1")
    public String r1(){
        return "hello";
    }
}

        @RequestMapping是GET请求还是POST请求?

        对之前的代码进行抓包,发现支持GET请求.

        

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

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/request/r1" method="post">
    <input type="submit" value="提交">
</form>
</body>
</html>

        前端代码放在static⽬录下,访问⽅式为:http://127.0.0.1:8080/test.html.执行结果正常,通过抓包发现请求为POST请求.

        请求

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

        在传递参数时,Spring会自动将请求中的参数列表与方法的参数列表进行匹配,当参数名相同时就会将值赋值给方法,并且参数初始类型为String,当没有传递该参数时参数值为null.

        传递单个参数
@RequestMapping("/request")
@RestController
public class Request {
    @RequestMapping("/r1")
    public String r1(String name){
        return "接收到参数 name:"+name;
    }
}

        

        传递非法参数,如给Integer传递String类型参数,会报错(类型转换错误):

@RequestMapping("/r2")
    public String r2(Integer age){
        return "接收到参数 age:"+age;
    }

       

2025-10-12T17:57:14.077+08:00  WARN 65084 --- [nio-8080-exec-3] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'java.lang.Integer'; For input string: "zhangsan"]

        报错日志:将String类型转换为Integer类型失败.

        使用基本数据类型时,必须要传递参数:

    @RequestMapping("/r2")
    public String r2(Integer age){
        return "接收到参数 age:"+age;
    }
    @RequestMapping("/r3")
    public String r3(int age){
        return "接收到参数 age:"+age;
    }

服务器报错节选,int接收了为null的参数.

java.lang.IllegalStateException: Optional int parameter 'age' is present but cannot be translated into a null value due to being declared as a primitive type. Consider declaring it as object wrapper for the corresponding primitive type
        传递多个参数

        传递多个参数与传递单个参数的区别仅在参数的个数上.当有多个参数时,前后端进⾏参数匹配时,是以参数的名称进⾏匹配的,因此参数的位置是不影响后端获取参数的结果.

    @RequestMapping("/r4")
    public String r4(String name,Integer age){
        return "接收到参数 name:"+name+",age:"+age;
    }

        传递对象

        如果参数⽐较多时,⽅法声明就需要有很多形参.并且后续每次新增⼀个参数,也需要修改⽅法声明.可以把这些参数封装为⼀个对象.SpringMVC也能实现对对象参数的自动赋值.

public class Student {
    private int id;
    private String name;
    private Integer age;

    public int getId() {
        return id;
    }

    public void setId(int 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;
    }
}
    @RequestMapping("/r5")
    public String r5(Student student){
        return student.toString();
    }

        可以看到,后端程序正确拿到了Student对象⾥各个属性的值.

        后端参数重命名

        有时,前端代码中的变量名与后端代码中的变量名无法一一对应,此时就需要对参数进行重命名.使用@RequestParam来对参数进行重命名:

    @RequestMapping("/r6")
    //将前端代码中的name重命名为userName
    public String r6(@RequestParam("name") String userName){
        return "接收到参数 userName:"+userName;
    }

        @RequestParam还有一个能力:让参数必须被传递.

Required request parameter 'name' for method parameter type String is not present

        想要让参数变为非必传参数,可以在使用@RequestParam时,在括号内部添加required=false(该参数默认为true),来来避免不传递时报错:

    @RequestMapping("/r6")
    public String r6(@RequestParam(value = "name",required = false) String userName){
        return "接收到参数 userName:"+userName;
    }

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值