锋盈数科-知识库 Logo
首页
软件开发
计算机基础
Hello Halo
新手必读
关于本知识库
登录 →
锋盈数科-知识库 Logo
首页 软件开发 计算机基础 Hello Halo 新手必读 关于本知识库
登录
  1. 首页
  2. 软件开发
  3. JAVA
  4. 【Spring Boot】SpringBoot中的控制器和路由

【Spring Boot】SpringBoot中的控制器和路由

0
  • JAVA
  • 发布于 2024-08-14
  • 0 次阅读
黄健
黄健

本文由 简悦 SimpRead 转码, 原文地址 blog.csdn.net

文章目录

    • 1. SpringBoot 控制器
      • 1.1 控制器的作用
      • 1.2 创建一个控制器
      • 1.3 @Controller 与 @RestController
    • 2. SpringBoot 路由
      • 2.1 路由的定义和作用
      • 2.2 创建并定义路由
      • 2.3 常用的路由注解
    • 3. 实例演示
      • 3.1 创建一个简单的控制器和路由
      • 3.2 测试控制器和路由
    • 4. SpringBoot 路由匹配规则
      • 4.1 路由匹配规则简介
      • 4.2 路由优先级
      • 4.3 常见问题与解决办法
    • 5. 如何在 SpringBoot 控制器中接收请求参数
      • 5.1 接收查询参数
      • 5.2 接收表单参数
      • 5.3 接收路径参数
    • 6. 数据返回
      • 6.1 返回 JSON 数据
      • 6.2 返回视图
      • 6.3 返回文件
    • 7. 总结

1. SpringBoot 控制器

在 Spring Boot 中,控制器是 MVC 模式中的关键组件,负责处理用户请求,并将其分派到适当的服务进行处理。

1.1 控制器的作用

控制器在 Spring Boot 应用程序中的主要任务是接收和处理来自用户的请求。这些请求可以是 HTTP 请求,如 GET 或 POST。一旦接收到请求,控制器通常会与模型(例如,数据模型或服务)交互以处理这些请求,并最终返回一个视图,以便用户可以看到或者直接返回数据给请求方。

1.2 创建一个控制器

在 Spring Boot 中,创建控制器非常简单。只需要一个类,然后在类上使用 @Controller 或 @RestController 注解就可以将该类标记为控制器。让我们看一个简单的示例:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello() {
        return "Hello, Spring Boot!";
    }
}

在上面的代码中,我们首先导入了所需的类。然后,我们使用 @RestController 注解标记这个类是一个控制器。接着,我们定义了一个方法 hello(),该方法返回一个字符串。@GetMapping(“/hello”) 注解告诉 Spring Boot,当用户访问 "/hello" URL 时,应该调用这个方法。

1.3 @Controller 与 @RestController

在 Spring Boot 中,有两种类型的控制器:@Controller 和 @RestController。

@Controller 是一个常规控制器,它通常与一个视图模板(如 Thymeleaf 或 FreeMarker)一起使用,来生成一个 HTML 响应。这是一个典型的例子:

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HelloController {
    @GetMapping("/hello")
    public String hello(Model model) {
        model.addAttribute("name", "Spring Boot");
        return "hello";
    }
}

在上面的代码中,当用户访问 "/hello" URL 时,会调用 hello() 方法,然后返回一个名为 "hello" 的视图。"name" 的值(“Spring Boot”)将传递给视图。

另一方面,@RestController 是一个特殊类型的控制器,它只返回数据,不返回视图。这对于构建 REST API 非常有用。@RestController 的功能与 @Controller 和 @ResponseBody 两个注解的结合效果一样。以上面的 "Hello, Spring Boot!" 例子就是一个 @RestController 的示例。

每种控制器都有其用途,你可以根据你的需要来选择使用哪一种。

2. SpringBoot 路由

在 Spring Boot 中,路由是一种机制,通过它,应用程序可以决定如何响应客户端的请求。路由的定义通常依赖于请求的 URL 和 HTTP 方法。

2.1 路由的定义和作用

路由在 Web 应用程序中起着至关重要的作用。它们定义了当用户访问特定 URL 时应该发生什么。这通常涉及到找到并执行相关的控制器方法来处理请求,然后将结果返回给用户。

例如,你可能有一个博客应用程序,当用户访问 "/posts" URL 时,你可能希望显示所有的博客文章。为此,你将需要定义一个路由,该路由将 "/posts" URL 映射到一个控制器方法,该方法可以检索所有的博客文章并显示它们。

2.2 创建并定义路由

在 Spring Boot 中,路由是通过在控制器类的方法上使用映射注解来定义的。这些注解告诉 Spring Boot 当用户访问与注解参数匹配的 URL 时,应该调用该方法。

以下是一个简单的例子,展示了如何在 Spring Boot 中定义路由:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello() {
        return "Hello, Spring Boot!";
    }
}

在这个例子中,我们在 hello() 方法上使用了 @GetMapping 注解,并给它传递了一个 "/hello" 的参数。这告诉 Spring Boot,当用户访问 "/hello" URL 时,应该调用这个方法。

2.3 常用的路由注解

Spring Boot 提供了一系列的映射注解,对应于 HTTP 的各种方法。以下是最常用的几个:

  • @GetMapping:对应于 HTTP 的 GET 方法,用于获取资源。
  • @PostMapping:对应于 HTTP 的 POST 方法,用于创建新资源。
  • @PutMapping:对应于 HTTP 的 PUT 方法,用于更新现有资源。
  • @DeleteMapping:对应于 HTTP 的 DELETE 方法,用于删除资源。

除了这些,还有一个通用的 @RequestMapping 注解,可以用来处理所有类型的 HTTP 方法。例如,以下的代码与使用 @GetMapping(“/hello”) 是等效的:

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    public String hello() {
        return "Hello, Spring Boot!";
    }
}

使用这些注解,你可以创建复杂的路由来满足你的 Web 应用程序的需求。

3. 实例演示

在本节,我们将创建一个简单的 Spring Boot 应用程序,该应用程序包含一个控制器和几个路由,然后我们将测试这些路由。

3.1 创建一个简单的控制器和路由

首先,让我们创建一个简单的HelloController,它将包含几个路由:

import org.springframework.web.bind.annotation.*;

@RestController
public class HelloController {

    // GET请求
    @GetMapping("/hello")
    public String hello() {
        return "Hello, Spring Boot!";
    }

    // POST请求
    @PostMapping("/hello")
    public String helloPost() {
        return "You posted to /hello!";
    }

    // PUT请求
    @PutMapping("/hello")
    public String helloPut() {
        return "You put to /hello!";
    }

    // DELETE请求
    @DeleteMapping("/hello")
    public String helloDelete() {
        return "You deleted /hello!";
    }
}

在这个控制器中,我们定义了四个路由,每个路由都对应于不同的 HTTP 方法,并且都指向同一个路径:/hello。

3.2 测试控制器和路由

有几种方法可以测试控制器和路由。你可以使用浏览器或命令行工具(如 curl),也可以使用像 Postman 这样的 API 测试工具。

这是使用 curl 测试GET /hello路由的命令:

curl http://localhost:8080/hello

如果一切正常,你应该会在命令行看到输出Hello, Spring Boot!。

要测试 POST、PUT 和 DELETE 路由,你可以使用以下的 curl 命令:

curl -X POST http://localhost:8080/hello
curl -X PUT http://localhost:8080/hello
curl -X DELETE http://localhost:8080/hello

每个命令应该会返回相应的消息,例如,POST /hello应该返回 "You posted to /hello!"。

使用 Postman 测试的过程类似,只是你需要在 Postman 的用户界面中输入 URL 和 HTTP 方法,然后点击 "Send" 按钮。你应该能在 Postman 的响应区域看到返回的消息。

4. SpringBoot 路由匹配规则

在 SpringBoot 中,路由匹配是一个非常重要的主题。理解路由如何匹配,以及哪些路由会优先于其他路由,对于创建和维护复杂的 Web 应用程序至关重要。

4.1 路由匹配规则简介

在 SpringBoot 中,路由的匹配规则主要依赖于你在@RequestMapping或其他路由相关注解(如@GetMapping, @PostMapping等)中定义的路径。路由匹配规则主要有两个方面:

  1. 路径匹配:SpringBoot 使用 Ant 风格的路径匹配,可以使用*,?和**来匹配任意多个字符,任意一个字符和任意多个目录。例如,/users/*可以匹配/users/123,但不能匹配/users/123/orders;而/users/**可以匹配任意以/users/开头的路径。

  2. 方法匹配:SpringBoot 可以根据 HTTP 请求方法来匹配不同的处理函数。例如,你可以定义一个处理 GET 请求的@GetMapping和一个处理 POST 请求的@PostMapping,它们都在相同的路径上,但是根据请求的类型调用不同的处理函数。

4.2 路由优先级

当有多个路由与同一个请求匹配时,SpringBoot 会根据以下的优先级规则来选择一个路由:

  1. 精确匹配的路由总是优先于模式匹配的路由。例如,如果你定义了/users/123和/users/*两个路由,那么对于/users/123的请求,SpringBoot 会选择精确匹配的/users/123路由。

  2. 对于模式匹配的路由,匹配的模式越少,优先级越高。例如,对于/users/*/*和/users/*两个路由,对于/users/123/orders的请求,SpringBoot 会选择/users/*路由,因为它的模式匹配更少。

  3. 如果两个路由的模式匹配数量相同,那么它们的优先级由它们的定义顺序决定,先定义的路由优先级更高。

4.3 常见问题与解决办法

在处理路由匹配时,可能会遇到一些常见的问题,例如:

  • 路径冲突:如果你定义了两个路径相同但方法不同的路由,SpringBoot 会将它们视为不同的路由。但是,如果两个路由的路径和方法都相同,那么它们就会发生冲突,SpringBoot 会抛出一个异常。解决这个问题的方法是避免定义路径和方法都相同的路由。

  • 路由模糊匹配:如果你的应用程序有许多路由,可能会出现一个路由误匹配另一个路由的情况。为了避免这种情况,你应该尽量使用精确匹配的路由,并避免使用过于复杂的模式匹配。

在编写路由时,理解和应用这些规则和解决办法可以帮助你创建更清晰,更可维护的代码。

5. 如何在 SpringBoot 控制器中接收请求参数

在 Web 开发中,控制器需要处理各种各样的 HTTP 请求,而这些请求往往包含了一些参数。接下来我们会详细讨论如何在 SpringBoot 中接收这些请求参数。

5.1 接收查询参数

查询参数是 URL 中?后面的参数,通常用于 GET 请求。在 SpringBoot 控制器中,我们可以使用@RequestParam注解来接收查询参数。例如:

@GetMapping("/users")
public String getUsers(@RequestParam(name = "name", required = false) String name) {
    // ...
}

在这个例子中,我们接收了一个名为name的查询参数。required = false表示这个参数是可选的,如果请求中没有这个参数,name的值会被设置为null。

5.2 接收表单参数

表单参数通常用于 POST 或 PUT 请求,它们在请求的 body 中。在 SpringBoot 控制器中,我们也可以使用@RequestParam注解来接收表单参数。但是,如果我们要接收的表单包含很多字段,使用@RequestParam会很麻烦。这个时候,我们可以创建一个 Java Bean 来代表这个表单,然后使用@ModelAttribute注解来接收这个表单。例如:

@PostMapping("/users")
public String createUser(@ModelAttribute UserForm form) {
    // ...
}

public static class UserForm {
    private String name;
    private String email;
    // getters and setters ...
}

5.3 接收路径参数

路径参数是 URL 中的一部分,通常用于指定资源的 ID。在 SpringBoot 控制器中,我们可以使用@PathVariable注解来接收路径参数。例如:

@GetMapping("/users/{id}")
public String getUser(@PathVariable("id") String id) {
    // ...
}

在这个例子中,我们接收了一个名为id的路径参数。这个参数的值会从 URL 中的{id}部分获取。

在处理 HTTP 请求时,理解如何接收各种类型的请求参数是非常重要的。不同的请求参数类型有不同的适用场景,选择合适的参数类型可以使你的控制器更简洁,更易于理解。

6. 数据返回

在构建 RESTful 服务时,我们通常需要将数据返回给客户端。SpringBoot 为我们提供了多种返回数据的方式。

6.1 返回 JSON 数据

在 SpringBoot 应用中,最常见的返回数据的方式就是返回 JSON 数据。你只需在你的控制器方法中返回一个对象,SpringBoot 就会自动将它转换为 JSON。例如:

@GetMapping("/users/{id}")
public User getUser(@PathVariable("id") String id) {
    User user = //...
    return user;
}

在这个例子中,我们返回了一个 User 对象。SpringBoot 会自动将它转换为 JSON。

6.2 返回视图

除了返回 JSON 数据,SpringBoot 还可以返回视图。通常在响应一个 GET 请求时返回视图,比如显示一个 HTML 页面。你可以返回一个字符串,这个字符串就是视图的名字。例如:

@GetMapping("/login")
public String login() {
    return "login";
}

在这个例子中,我们返回了 "login" 这个视图名。如果你使用了模板引擎(比如 Thymeleaf),SpringBoot 会自动渲染名为 "login" 的模板并返回给客户端。

6.3 返回文件

有时,你可能需要返回一个文件给客户端。例如,用户请求下载一个报告。在 SpringBoot 中,你可以使用ResponseEntity<Resource>来实现。例如:

@GetMapping("/report")
public ResponseEntity<Resource> downloadReport() {
    // Load file as Resource
    Resource resource = //...

    // Try to determine file's content type
    String contentType = //...

    // Fallback to the default content type if type could not be determined
    if(contentType == null) {
        contentType = "application/octet-stream";
    }

    return ResponseEntity.ok()
            .contentType(MediaType.parseMediaType(contentType))
            .body(resource);
}

在这个例子中,我们返回了一个文件。ResponseEntity<Resource>会告诉 SpringBoot 我们要返回一个文件,而contentType(MediaType.parseMediaType(contentType))会设置文件的 MIME 类型。

7. 总结

在这篇文章中,我们详细介绍了在 SpringBoot 中如何使用控制器和路由。首先,我们解释了什么是控制器,以及如何在 SpringBoot 中创建控制器。我们还讨论了 @Controller 和 @RestController 注解的差异。

然后,我们研究了路由,阐述了它的定义和作用,以及如何在 SpringBoot 中创建并定义路由。我们还讨论了一些常用的路由注解。

我们还通过一个实例演示了如何创建一个简单的控制器和路由,并进行了测试。我们详细阐述了 SpringBoot 的路由匹配规则,包括路由优先级以及常见的问题和解决方法。

在数据返回部分,我们探讨了如何在 SpringBoot 控制器中接收请求参数,包括查询参数、表单参数和路径参数,并讨论了如何返回 JSON 数据、视图和文件。

希望这篇文章能帮助你更好地理解和使用 SpringBoot 的控制器和路由。如果你有任何问题或需要进一步的解释,欢迎留言讨论。

标签: #软件开发 1171 #JAVA 991
相关文章

Spring 实现 3 种异步接口 2024-10-18 09:07

大家好,我是苏三~ 如何处理比较耗时的接口? 这题我熟,直接上异步接口,使用 Callable、WebAsyncTask 和 DeferredResult、CompletableFuture等均可实现。 但这些方法有局限性,处理结果仅返回单个值。在某些场景下,如果需要接口异步处理的同时,还持续不断地

重学SpringBoot3-集成Redis(五)之布隆过滤器 2024-10-08 11:24

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(五)之布隆过滤器 1. 什么是布隆过滤器? * 基本概念 适用场景 2. 使用 Redis 实现布隆过滤器 * 项目依赖 Redis 配置

SpringBoot整合异步任务执行 2024-10-08 11:24

同步任务: 同步任务是在单线程中按顺序执行,每次只有一个任务在执行,不会引发线程安全和数据一致性等 并发问题 同步任务需要等待任务执行完成后才能执行下一个任务,无法同时处理多个任务,响应慢,影响用 户体验 异步任务: 异步任务是在多线程中同时执行,多个任务可以并发执行,同时处理多个请求,响应快,资源

springboot kafka多数据源,通过配置动态加载发送者和消费者 2024-10-08 11:24

前言 最近做项目,需要支持kafka多数据源,实际上我们也可以通过代码固定写死多套kafka集群逻辑,但是如果需要不修改代码扩展呢,因为kafka本身不处理额外逻辑,只是起到削峰,和数据的传递,那么就需要对架构做一定的设计了。 准备test kafka本身非常容易上手,如果我们需要单元测试,引入ja

SpringBoot 集成 Redis 2024-10-08 11:24

一:SpringBoot 集成 Redis ①Redis是一个 NoSQL(not only)数据库, 常作用缓存 Cache 使用。 ②Redis是一个中间件、是一个独立的服务器;常用的数据类型: string , hash ,set ,zset , list ③通过Redis客户端可以使用多种语

SpringBoot整合QQ邮箱 2024-10-08 11:24

SpringBoot可以通过导入依赖的方式集成多种技术,这当然少不了我们常用的邮箱,现在本章演示SpringBoot整合QQ邮箱发送邮件…. 下面按步骤进行: 1.获取QQ邮箱授权码 1.1 登录QQ邮箱 1.2 开启SMTP服务 找到下图中的SMTP服务区域,如果当前账号未开启的话自己手动开启。

目录

IT 外包服务商

  • 意见投递
  • zyf6619

软件开发应用

主菜单

  • 首页
  • 软件开发
  • 计算机基础
  • Hello Halo
  • 新手必读
  • 关于本知识库
Copyright © 2024 your company All Rights Reserved. Powered by Halo.