Spring MVC

目录

什么是MVC模型

什么是SpringMVC

[Spring MVC 的组件和工作流程](#Spring MVC 的组件和工作流程)

[步骤 1:新建 Spring Boot 项目](#步骤 1:新建 Spring Boot 项目)

步骤2:编写核心代码

[(1)Controller 层(核心)](#(1)Controller 层(核心))

Integer和int这两个代码之间的差异是什么?

[Spring MVC 请求映射注解总结](#Spring MVC 请求映射注解总结)

[1. @RequestMapping基础用法:](#1. @RequestMapping基础用法:)

[2. 专用请求映射注解](#2. 专用请求映射注解)

[3. 请求参数接收方式](#3. 请求参数接收方式)

[方式2:参数重命名 @RequestParam](#方式2:参数重命名 @RequestParam)

方式3:绑定对象参数(推荐)当参数较多时,封装为对象:java

注意事项总结

什么是MVC模型

MVC是一种设计创建Web应用程序的模式。

这三个单词分别代表Web应用程序的三个部分:

Model(模型):指数据模型。用于存储数据以及处理用户请求的业务逻辑。

在Web应用中,JavaBean对象,业务模型等都属于Model。

View(视图):用于展示模型中的数据的,一般为jsp或html文件。

Controller(控制器):是应用程序中处理用户交互的部分。接受视图提出的请求,将数据交给模型处理,并将处理后的结果交给视图显示。

三者关系,如图所示

什么是SpringMVC

SpringMVC 是 Spring 框架的核心模块之一,是基于 MVC(Model-View-Controller)设计模式的轻量级 Web 框架 ,用于简化 Java Web 开发。

Spring MVC 的组件和工作流程

想象一个餐厅的点餐过程:

各组件对应角色:

DispatcherServlet:餐厅 前台接待员

HandlerMapping:点餐目录/菜单

HandlerAdapter:厨师长(负责分配任务给具体厨师)

Controller:具体厨师

ViewResolver:服务员(负责摆盘上菜)

完整工作流程:

  1. 客户点餐(发送请求)

text

顾客 → 前台接待员:我要一份牛排

对应:浏览器发送请求到 DispatcherServlet

  1. 查找菜单(HandlerMapping)

text

接待员查看菜单,发现:

  • 牛排 → 西餐厨师处理

  • 寿司 → 日料厨师处理

  • 披萨 → 意餐厨师处理

对应:DispatcherServlet 问 HandlerMapping:"这个URL请求该由哪个Controller处理?"

  1. 分配任务(HandlerAdapter)

text

接待员告诉厨师长:有位客人点了牛排

厨师长知道:牛排需要找西餐厨师张三来做

对应:DispatcherServlet 通过 HandlerAdapter 找到合适的 Controller 方法

  1. 烹饪制作(Controller)

text

西餐厨师张三开始制作牛排

做好后放在盘子里

对应:Controller 执行业务逻辑,返回 ModelAndView(数据+视图名)

  1. 摆盘上菜(ViewResolver)

text

服务员拿到做好的牛排:

  • 如果是普通客人 → 用白色盘子

  • 如果是VIP客人 → 用金色盘子

  • 如果是外卖 → 用打包盒

对应:ViewResolver 根据视图名找到具体的 JSP/Thymeleaf 等视图文件

  1. 上菜完成(渲染视图)

text

服务员把摆好盘的牛排端给顾客

对应:将数据填充到视图模板中,生成HTML返回给浏览器

步骤 1:新建 Spring Boot 项目

步骤2:编写核心代码

(1)Controller 层(核心)

com.example.springmvcdemo下新建包controller → 新建HelloController.java

Haskell 复制代码
package org.xiuxiu.springdemo;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller // 标识为SpringMVC控制器
public class HelloController {
        // 方式1:返回视图(结合Thymeleaf)
        @GetMapping("/hello")
        public String hello(Model model) {
            // Model传递数据到视图
            model.addAttribute("msg", "Hello SpringMVC!");
            // 返回视图名(对应templates/hello.html)
            return "hello";
        }
        // 方式2:返回m1(RESTful接口,无视图)
        @GetMapping("/m1")
        @ResponseBody // 直接返回数据,不解析视图
        public String getm1() {
            return "{\"name\":\"张三\",\"age\":20}";
        }
    }
}

SpringMVC支持参数注入的方式用于获取请求数据,即将请求参数直接封装到方法的参数当中。用法如下:

  1. 编写控制器方法
java 复制代码
// 封装为简单数据类型类型参数
 @RequestMapping("/r1")
    public String r1(String username,String password){
        return "用户名"+username+"密码"+password;
    }

访问该方法时,请求参数名和方法参数名相同,即可完成自动封装。

http://localhosthttp://:8080/user/r1?username=admin&password=12345

**Integer和int**这两个代码之间的差异是什么?

java 复制代码
public class testCotroller {
    @RequestMapping("/r5")
    public String r5(Integer number){
        return "接收参数"+number;
    }
    @RequestMapping("/r6")
    public String r6(int number){
        return "接收参数"+number;
    }
}

1. Integer numberr5 方法)

使用包装类 Integer,是引用类型

可以接收 null

如果请求中没有 number 参数,参数值会是 null

如果参数值为 null,方法会正常执行,返回 "接收参数null"

2. int numberr6 方法)

使用基本类型 int,是值类型

不能接收 null

如果请求中没有 number 参数,会发生以下情况:

Spring 会尝试使用默认值(对于 int 是 0)

但更常见的是会抛出异常(因为 Spring 不知道要用什么值填充)

实际行为取决于 Spring MVC 版本和配置

具体差异示例:

Spring MVC 请求映射注解总结

1. @RequestMapping

基础用法:

java 复制代码
@Controller
@RequestMapping("/user")  // 类路径
public class UserController {
    
    @RequestMapping("/info")  // 方法路径
    public String getUserInfo() {
        return "user-info";
    }
}

访问路径:`/user/info`(类路径 + 方法路径)

指定请求方法:

java 复制代码
@RequestMapping(value = "/save", method = RequestMethod.POST)
public String saveUser() {
    // 只能通过POST请求访问
    return "success";
}

2. 专用请求映射注解

@GetMapping - 只处理GET请求

@PostMapping - 只处理POST请求

@PutMapping` - PUT请求

@DeleteMapping` - DELETE请求

@PatchMapping` - PATCH请求

3. 请求参数接收方式

方式1:参数名匹配(默认方式)

java 复制代码
@GetMapping("/detail")
public String getUserDetail(@RequestParam String name, 
                           @RequestParam Integer age) {
    // 前端参数名必须为 name 和 age
    return "user-detail";
}

方式2:参数重命名 @RequestParam

java 复制代码
    @RequestMapping("/r10")
    public String r9(@RequestParam(value = "q",required=false)String keyword)
    {
        return"接收参数:keyword="+keyword;
    }

@RequestParam 参数说明:**

value/name`:指定前端参数名

required`:是否必须(默认true)

defaultValue`:默认值

方式3:绑定对象参数(推荐)

当参数较多时,封装为对象:java

java 复制代码
public class UserInfo {
    private String name;
    private Integer gender;
    private Integer age;
    public String getName() {
        return name;
    }

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

    public Integer getGender() {
        return gender;
    }

    public void setGender(Integer gender) {
        this.gender = gender;
    }

    public Integer getAge() {
        return age;
    }

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


    @Override
    public String toString() {
        return "UserInfo{" +
                "name='" + name + '\'' +
                ", gender=" + gender +
                ", age=" + age +
                '}';
    }
}
  
@RequestMapping("/r9")
        
public String r9(UserInfo userinfo)
{
  return"接收参数:userinfo="+userinfo.toString();
}

方式4:接收集合/数组参数

java 复制代码
 @RequestMapping("/r2")//传递数组
    public String r2(String[]arr)
    {
       return"接收参数:arr"+ Arrays.toString(arr);
    }

  @RequestMapping("/r3")//传递集合
    public String r3(@RequestParam List<Integer>list)
    {
        return("接收参数:list"+ list);
    }
  1. 完整示例```java
java 复制代码
@RestController
@RequestMapping("/api/users")
public class UserController {
    
    // GET请求,参数名匹配
    @GetMapping("/simple")
    public User simpleGet(String name, Integer age) {
        return new User(name, age);
    }
    
    // GET请求,参数重命名
    @GetMapping("/search")
    public List<User> search(@RequestParam("keyword") String searchKey,
                            @RequestParam(required = false, defaultValue = "1") Integer page) {
        return userService.search(searchKey, page);
    }
    
    // POST请求,接收对象
    @PostMapping("/create")
    public ResponseEntity<String> createUser(@RequestBody User user) {
        userService.save(user);
        return ResponseEntity.ok("创建成功");
    }
    
    // 接收集合参数
    @DeleteMapping("/batch")
    public String batchDelete(@RequestParam List<Long> ids) {
        userService.batchDelete(ids);
        return "删除成功";
    }
}

// 实体类
class User {
    private String username;
    private Integer age;
    // 构造器、getter、setter省略
}

注意事项总结

  1. 路径组合:类级别`@RequestMapping` + 方法级别映射注解 = 完整访问路径

  2. 参数绑定

简单参数:参数名需一致,或使用`@RequestParam`重命名

对象参数:自动绑定匹配的字段

集合参数:必须使用`@RequestParam`

  1. 可选参数:使用`required = false`标记

  2. 请求方式:使用专用注解(`@GetMapping`等)更清晰

  3. RESTful风格:推荐使用`@RestController`配合`@GetMapping`、`@PostMapping`等

相关推荐
wjs20242 小时前
PHP $_GET 变量详解
开发语言
思茂信息2 小时前
CST仿真实例:手机Type-C接口ESD仿真
c语言·开发语言·单片机·嵌入式硬件·智能手机·cst·电磁仿真
2501_944526422 小时前
Flutter for OpenHarmony 万能游戏库App实战 - 收藏功能实现
android·java·开发语言·javascript·python·flutter·游戏
君生我老2 小时前
C++ list类容器常用操作
开发语言·c++
云中飞鸿2 小时前
C#哪些类型需要 手动初始化
开发语言·c#
!停2 小时前
C语言文件操作
c语言·开发语言
历程里程碑2 小时前
Linux 1 指令(1)入门:6大基础指令详解
linux·运维·服务器·c语言·开发语言·数据结构·c++
少控科技6 小时前
QT新手日记024 - QT001程序代码
开发语言·qt
码农水水11 小时前
国家电网Java面试被问:TCP的BBR拥塞控制算法原理
java·开发语言·网络·分布式·面试·wpf