目录

Spring-Web-MVC快速上手,高效开发Web应用

Spring Web MVC:快速上手,高效开发Web应用

Spring Web MVC 入门指南

1. 本节目标

本节我们将介绍 Spring Web MVC 的基础知识,涵盖以下内容:

  1. 学习常见的 Spring Web MVC 注解
  2. 掌握使用 Spring MVC 完成基础功能开发
  3. 了解 MVC 和三层架构的设计模式
  4. 掌握企业开发中的命名规范

通过本节内容,您将能够快速上手 Spring Web MVC,并能够在实际项目中应用相关知识。


2.什么是 Spring Web MVC?

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

从上述定义我们可以得出⼀个信息: Spring Web MVC 是⼀个 Web 框架.

下⾯咱们简称之为: Spring MVC

然而要真正的理解什么是 Spring MVC?我们首先要搞清楚什么是 MVC。

2.1 MVC 定义

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

https://i-blog.csdnimg.cn/direct/9f846cb2bcd94c4bad2296989f7f6a01.png

• View(视图) 指在应用程序中专门用来与浏览器进行交互,展示数据的资源。

• Model(模型) 是应用程序的主体部分,用来处理程序中数据逻辑的部分。

• Controller(控制器)可以理解为⼀个分发器,用来决定对于视图发来的请求,需要用哪⼀个模型来处理,以及处理完后需要跳回到哪⼀个视图。即用来连接视图和模。

比如: 厨房可以用来做饭, 但真实实现做饭功能的是火以及各种做饭相关的⻝材和工具。

厨房就好比是SpringBoot, 厨房可以装柜子, 实现收纳功能, 装燃气灶等, 实现做饭功能。

做饭这个事, 就是MVC, 在几千年前, 有火有食材就可以实现。

学习Spring MVC, 重点也就是学习如何通过浏览器和用户程序进行交互。

主要分以下 三个方面 :

  1. 建立连接 :将用户(浏览器)和 Java 程序连接起来,也就是访问⼀个地址能够调用到我们的Spring 程序。
  2. 请求
    用户请求的时候会带⼀些参数,在程序中要想办法获取到参数, 所以请求这块主要是 获取参数的功能。
  3. 响应: 执行了业务逻辑之后,要把程序执行的结果返回给用户, 也就是响应。

比如用户去银行存款

1.建立连接: 去柜台

2.请求: 带着银行卡, 身份证去存款

3.响应: 银行返回⼀张存折

对于 Spring MVC 来说,掌握了以上 3 个功能就相当于掌握了 Spring MVC。

2.2 项目准备

Spring MVC 项⽬创建和 Spring Boot 创建项⽬相同,在创建的时候选择 Spring Web 就相当于创建了Spring MVC 的项⽬。

创建项⽬时, 勾选上 Spring Web 模块即可,如下图:

https://i-blog.csdnimg.cn/direct/15080a7e562f4290899509090052a446.png

3. 常见的 Spring Web MVC 注解

3.1 @RestController

  • 作用 :标注在类上,是 @Controller 和 @ResponseBody 的组合注解。使用 @RestController 注解的类,其所有方法的返回值都会被直接作为响应体返回,而不会进行视图解析。通常用于开发 RESTful 风格的 Web 服务。
  • 特点 :要求返回的数据直接作为 JSON 或 XML 响应,而无需视图解析。
@RestController
@RequestMapping("MyController")
public class MyController {
    @RequestMapping("hello")
    private String hello(){
        return "hello spring mvc!";
    }
}

访问链接: http://127.0.0.1:8080/MyController/hello ,就可以看到数据了。

https://i-blog.csdnimg.cn/direct/b0d56951b2694a4bbcc6f09a63782991.png


3.2 @Controller

作用:用于标记一个类为 Spring Web MVC 的控制器。被 @Controller 注解的类会被 Spring 容器扫描并识别为控制器,从而可以处理客户端的请求.

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HelloController {

    @GetMapping("/hello")
    @ResponseBody
    public String sayHello() {
        return "Hello, Spring Web MVC!";
    }
}

**解释:**HelloController 类被 @Controller 注解标记,Spring 容器会将其作为控制器来处理请求。


3.3 @ResponseBody

**作用:**要用于将控制器方法的返回值直接写入到 HTTP 响应的正文(body)中,而不需要进行视图解析。它通常用于 RESTful Web 服务中,返回 JSON、XML 或其他类型的数据。

使用场景:

返回 JSON 数据:当你需要返回 JSON 格式的数据时,@ResponseBody 会自动将Java对象转换为 JSON,并写入到响应的正文中。

返回字符串:可以直接返回一个字符串,@ResponseBody会将字符串内容写入到响应的正文中。

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class MyController {
    
    @RequestMapping("/data")
    @ResponseBody
    public String getData() {
        return "Hello, Spring!";
    }
}

访问: http://127.0.0.1:8080/data ,在上述例子中,当访问 /data 时,会直接返回 “Hello, Spring!” 到客户端,而不是跳转到一个视图页面。

https://i-blog.csdnimg.cn/direct/bd4042eb7e0c41e487bfbf042b6df161.png

3.4 @RequestMapping

  • 作用 :标注在类或方法上,指定请求的 URI 和 HTTP 方法。
  • 属性value (或 path )指定请求路径, method 指定 HTTP 方法。
@RestController
@RequestMapping("MyController")
public class MyController {
    public String getUser() {
        return "获取用户信息";
    }
}

访问: http://127.0.0.1:8080/MyController/getUser

https://i-blog.csdnimg.cn/direct/c2c390eeeace45c9ad82ea96cebcc103.png

3.5 @GetMapping@PostMapping

当然,以下是对 @GetMapping@PostMapping 的更详细说明:


  1. @GetMapping
  • 用途

    用于映射 HTTP 的 GET 请求,processing incoming HTTP GET requests.

  • 特点

    • GET 请求是通过 URL 参数传递数据的。
    • 适用于查询、获取资源、检索数据等场景。
    • 数据是可见的,通常用于安全性要求不高的场景。
    • GET 请求是 幂等 的(Idempotent),即多次调用同一个接口,结果不会改变。
    • GET 请求的数据大小有限制,因为数据是通过 URL 传递的。
  • 示例

    @GetMapping("/users")
    public List<User> getAllUsers() {
        return userService.getAllUsers();
    }
  • 常用属性

    • valuepath :指定映射的 URL路径。

      @GetMapping(path = "/users/{id}")
      public User getUserById(@PathVariable Long id) {
          return userService.getUserById(id);
      }

  1. @PostMapping
  • 用途

    用于映射 HTTP 的 POST 请求,processing incoming HTTP POST requests.

  • 特点

    • POST 请求通常通过请求体(Body)传递数据。
    • 适用于提交表单、创建新资源、更新数据等场景。
    • POST 请求是 非幂等 的(Non-Idempotent),即多次调用同一个接口,可能会创建多个资源。
    • POST 请求可以传递更大的数据,适合复杂的提交操作。
  • 示例

    @PostMapping("/users")
    public User createUser(@RequestBody User user) {
        return userService.createUser(user);
    }
  • 常用属性

    • valuepath :指定映射的 URL路径。

    • consumes :指定接收的内容类型(如 application/json )。

    • produces :指定返回的内容类型(如 application/json )。

      @PostMapping(path = "/users", consumes = "application/json", produces = "application/json")
      public User createUser(@RequestBody User user) {
          return userService.createUser(user);
      }

3. 主要区别

特性@GetMapping@PostMapping
HTTP 方法GETPOST
数据传递方式URL 参数请求体(Body)
数据大小限制URL 长度限制较大,不受 URL 长度限制
幂等性(Idempotent)是(多次调用结果相同)否(可能创建多个资源)
使用场景查询数据、获取资源创建资源、提交表单、更新数据

4. 实际应用场景

  • GET
    • 查询用户列表: @GetMapping("/users")
    • 获取单个用户信息: @GetMapping("/users/{id}")
  • POST
    • 创建新用户: @PostMapping("/users")
    • 提交表单数据: @PostMapping("/forms")

2.4 @RequestParam@PathVariable

  • @RequestParam :获取请求参数。

    @GetMapping("/search")
    public String search(@RequestParam String keyword) {
        return "搜索结果:关键词为 " + keyword;
    }
  • @PathVariable :获取 URL 路径上的变量。

    @GetMapping("/user/{id}")
    public String getUser(@PathVariable Long id) {
        return "用户 ID 为 " + id;
    }

2.5 @SpringBootApplication

  • 作用 :标注在主类上,表示这是一个 Spring Boot 应用程序。
  • 示例
@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

4. 使用 Spring MVC 完成基础功能开发

4.1 创建一个简单的 CRUD 功能

4.1.1 用户控制器(Controller)
@RestController
@RequestMapping("/api/users")
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping
    public List<User> getAllUsers() {
        return userService.findAllUsers();
    }

    @PostMapping
    public User createUser(@RequestBody User user) {
        return userService.saveUser(user);
    }

    @PutMapping("/{id}")
    public User updateUser(@PathVariable Long id, @RequestBody User user) {
        return userService.updateUser(id, user);
    }

    @DeleteMapping("/{id}")
    public void deleteUser(@PathVariable Long id) {
        userService.deleteUser(id);
    }
}
4.1.2 服务层(Service)
@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;

    public List<User> findAllUsers() {
        return userRepository.findAll();
    }

    public User saveUser(User user) {
        return userRepository.save(user);
    }

    public User updateUser(Long id, User user) {
        User existingUser = userRepository.findById(id).orElse(null);
        if (existingUser != null) {
            existingUser.setName(user.getName());
            existingUser.setEmail(user.getEmail());
            return userRepository.save(existingUser);
        }
        return null;
    }

    public void deleteUser(Long id) {
        userRepository.deleteById(id);
    }
}
4.1.3 数据访问层(Repository)
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}

5. MVC 和三层架构的设计模式

5.1 MVC 模式

  • Model(模型) :负责数据管理和业务逻辑。
  • View(视图) :负责展示数据。
  • Controller(控制器) :负责处理用户请求,并协调 Model 和 View。

5.2 三层架构

  • 表现层(Web层) :负责与用户交互,接收请求并返回响应。
  • 业务逻辑层(Service层) :负责处理业务逻辑。
  • 数据访问层(DAO层) :负责与数据库交互。

6. 企业开发中的命名规范

  1. 类名

    • 使用大驼峰命名法(首字母大写)。
    • 例如: UserControllerUserServiceImpl
  2. 方法名

    • 使用小驼峰命名法(首字母小写)。
    • 例如: getUserByIdsaveUser
  3. 变量名

    • 使用小驼峰命名法。
    • 例如: userNameuserEmail
  4. 包名

    • 使用小写字母,分层命名。
    • 例如: com.example.controllercom.example.service
  5. API 命名

    • 使用动词 + 名词的形式。
    • 例如: GET /api/usersPOST /api/users

7. 结语

通过本节内容,我们学习了 Spring Web MVC 的基础知识,包括常见注解、功能开发、设计模式和命名规范。掌握这些知识可以帮助您快速上手 Spring MVC,并在企业开发中写出规范、高效的代码。