目录

什么是MVC模型

什么是SpringMVC

Spring MVC 的组件和工作流程

步骤 1:新建 Spring Boot 项目

步骤2:编写核心代码

(1)Controller 层(核心)

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

Spring MVC 请求映射注解总结

1. @RequestMapping基础用法:

2. 专用请求映射注解

 3. 请求参数接收方式

方式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

2. 查找菜单(HandlerMapping)
text
接待员查看菜单,发现:
- 牛排 → 西餐厨师处理
- 寿司 → 日料厨师处理
- 披萨 → 意餐厨师处理
对应:DispatcherServlet 问 HandlerMapping:"这个URL请求该由哪个Controller处理?"

3. 分配任务(HandlerAdapter)
text
接待员告诉厨师长:有位客人点了牛排
厨师长知道:牛排需要找西餐厨师张三来做
对应:DispatcherServlet 通过 HandlerAdapter 找到合适的 Controller 方法

4. 烹饪制作(Controller)
text
西餐厨师张三开始制作牛排
做好后放在盘子里
对应:Controller 执行业务逻辑,返回 ModelAndView(数据+视图名)

5. 摆盘上菜(ViewResolver)
text
服务员拿到做好的牛排:
- 如果是普通客人 → 用白色盘子
- 如果是VIP客人 → 用金色盘子
- 如果是外卖 → 用打包盒
对应:ViewResolver 根据视图名找到具体的 JSP/Thymeleaf 等视图文件

6. 上菜完成(渲染视图)
text
服务员把摆好盘的牛排端给顾客
对应:将数据填充到视图模板中,生成HTML返回给浏览器

步骤 1:新建 Spring Boot 项目

步骤2:编写核心代码

(1)Controller 层(核心)

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

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. 编写控制器方法
// 封装为简单数据类型类型参数
 @RequestMapping("/r1")
    public String r1(String username,String password){
        return "用户名"+username+"密码"+password;
    }

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

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

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

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
基础用法:

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


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

指定请求方法:

@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:参数名匹配(默认方式)

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

方式2:参数重命名 @RequestParam

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

@RequestParam 参数说明:**
value/name`:指定前端参数名
required`:是否必须(默认true)
defaultValue`:默认值

方式3:绑定对象参数(推荐)
当参数较多时,封装为对象: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:接收集合/数组参数

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

  @RequestMapping("/r3")//传递集合
    public String r3(@RequestParam List<Integer>list)
    {
        return("接收参数:list"+ list);
    }

4. 完整示例```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`
3. 可选参数:使用`required = false`标记
4. 请求方式:使用专用注解(`@GetMapping`等)更清晰
5. RESTful风格:推荐使用`@RestController`配合`@GetMapping`、`@PostMapping`等

    Logo

    助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

    更多推荐