Spring MVC 学习学习

一.Spring MVC概述

1.1三层架构模式

浏览器----->web,service,dao

image-20241022142703995

  • web:页面数据收集,产生页面
  • service:业务处理
  • dao:数据的持久化处理

一个serverlet只能处理一个请求;

1.2 MVC模式

浏览器----->Controller,View,Model,service,dao

image-20241022144118398

流程控制:

​ controller调用service,service调dao,得到Model

image-20241022144644596

  • SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架,属于 SpringFrameWork 的后续产品,已经融合在 Spring Web Flow 中。

  • ​ SpringMVC 已经成为目前最主流的MVC框架之一,它通过一套注解,让一个简单的 Java 类成为处理请求的控制器,而无须实现任何接口。同时 它还支持 RESTful 编程风格的请求。

123abc.png

1.3 SpringMVC的开发步骤

  1. 导入SpringMVC相关坐标
  2. 配置SpringMVC核心控制器DispathcerServlet
  3. 创建Controller类和视图页面
  4. 使用注解配置Controller类中业务方法的映射地址
  5. 配置SpringMVC核心文件 spring-mvc.xml
  6. 客户端发起请求测试

二.常用注解解析

@RequestMapping

作用:用于建立请求 URL 和处理请求方法之间的对应关系

位置:

  • 类上,请求URL 的第一级访问目录。此处不写的话,就相当于应用的根目录

  • 方法上,请求 URL 的第二级访问目录,与类上的使用@ReqquestMapping标注的一级目录一起组成访问虚拟路径

属性:

  • value:用于指定请求的URL。它和path属性的作用是一样的
  • method:用于指定请求的方式
  • params:用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的key和value必须和配置的一模一样

​ 例:

params = {"accountName"},表示请求参数必须有accountName

params = {"moeny!100"},表示请求参数中money不能是100

@EnableWebMvc

作用:启用Spring MVC的注解驱动功能,用于配置Spring MVC。

位置:通常放在配置类上,以启用Spring MVC的各种功能。

属性:无特定属性,一般不需要设置。

示例:

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    // 其他配置
}

@RequestBody

作用:用于将HTTP请求体中的JSON或XML数据转换为Java对象。

位置:方法参数前,用于接收请求体中的数据。

属性:无特定属性,一般不需要设置。

示例:

@PostMapping("/createUser")
public ResponseEntity<User> createUser(@RequestBody User user) {
    // 处理用户创建逻辑
    return new ResponseEntity<>(user, HttpStatus.CREATED);
}
    

@RequestParam

作用:用于将HTTP请求中的查询参数绑定到控制器的方法参数上。

位置:方法参数前,用于接收请求中的查询参数。

属性:

  • value:指定请求参数的名称。
  • required:是否为必需参数,默认为true。
  • defaultValue:当请求参数缺失时使用的默认值。

示例:

@GetMapping("/getUser")
public ResponseEntity<User> getUser(@RequestParam("id") Long id) {
    // 根据ID获取用户信息
    User user = userService.findById(id);
    return new ResponseEntity<>(user, HttpStatus.OK);
}

三.MVC实现数据请求方式

3.1 基本类型参数

基本类型参数包括int, long, float, double, boolean, String等。这些参数可以直接作为方法参数传递。

@Controller
public class BasicTypeController {

    @RequestMapping("/basic")
    public String handleBasicTypes(@RequestParam("id") int id,
                                   @RequestParam("name") String name,
                                   @RequestParam("active") boolean active) {
        // 处理逻辑
        System.out.println("ID: " + id);
        System.out.println("Name: " + name);
        System.out.println("Active: " + active);
        return "result";
    }
}

3.2 POJO类型参数

POJO(Plain Old Java Object)类型参数可以通过表单提交或者JSON格式的数据进行绑定。

public class User {
    private String username;
    private String password;
    // getters and setters
}

@Controller
public class PojoController {

    @RequestMapping("/pojo")
    public String handlePojo(User user) {
        // 处理逻辑
        System.out.println("Username: " + user.getUsername());
        System.out.println("Password: " + user.getPassword());
        return "result";
    }
}

3.3 JSON格式数据

@RestController
public class PojoJsonController {

    @PostMapping("/pojoJson")
    public ResponseEntity<String> handlePojoJson(@RequestBody User user) {
        // 处理逻辑
        System.out.println("Username: " + user.getUsername());
        System.out.println("Password: " + user.getPassword());
        return new ResponseEntity<>("Success", HttpStatus.OK);
    }
}

3.4 数组类型参数

数组类型参数可以通过多个同名请求参数传递。

@Controller
public class ArrayController {

    @RequestMapping("/array")
    public String handleArray(@RequestParam("ids") int[] ids) {
        // 处理逻辑
        for (int id : ids) {
            System.out.println("ID: " + id);
        }
        return "result";
    }
}

3.5 日期型参数

日期型参数可以通过自定义格式化器或使用@DateTimeFormat注解进行格式化。

使用@DateTimeFormat注解

import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;

public class Event {
    private String name;
    private Date date;
    // getters and setters
}

@Controller
public class DateController {

    @RequestMapping("/date")
    public String handleDate(@RequestParam("name") String name,
                             @DateTimeFormat(pattern = "yyyy-MM-dd") @RequestParam("date") Date date) {
        // 处理逻辑
        System.out.println("Name: " + name);
        System.out.println("Date: " + date);
        return "result";
    }
}

使用自定义格式化器

import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import org.springframework.stereotype.Component;
import org.springframework.format.Formatter;

@Component
public class CustomDateFormatter implements Formatter<Date> {
    private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

    @Override
    public Date parse(String text, Locale locale) throws ParseException {
        return dateFormat.parse(text);
    }

    @Override
    public String print(Date object, Locale locale) {
        return dateFormat.format(object);
    }
}

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addFormatter(new CustomDateFormatter());
    }
}

四.REST风格

Restful是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。主要用于客户端和服务 器交互类的软件,基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存机制等。

Restful风格的请求是使用“url+请求方式”表示一次请求目的的,HTTP 协议里面四个表示操作方式的动词如下:

  • GET:用于获取资源

  • POST:用于新建资源

  • PUT:用于更新资源

  • DELETE:用于删除资源

例如:

  • /user/1 GET : 得到 id = 1 的 user
  • /user/1 DELETE: 删除 id = 1 的 user
  • /user/1 PUT: 更新 id = 1 的 user
  • /user POST: 新增 user