SpringBoot控制层接收参数处理、Logback日志入门和使用 - 实践

news/2025/9/21 20:02:19/文章来源:https://www.cnblogs.com/wzzkaifa/p/19104046

SpringBoot控制层接收参数处理、Logback日志入门和使用

    • 一、Controller层接收url参数的几种方式
      • 1.1 使用HttpServletRequest
      • 1.2 使用@RequestParam,设置required = false的作用
      • 1.3 可以省略@RequestParam的情况
    • 二、Controller接收json参数:@RequestBody
      • 场景示例:添加新用户(类似注册新账号)
    • 三、Controller接收路径参数:@PathVariable
      • 基础用法:
      • 路径参数与形参名称一致时可简写:
      • 多个路径参数:
    • 四、日志技术介绍(log4j、logback和slf4j的关系)
    • 4.1 logback快速入门
      • 依赖引入
      • 添加logback.xml配置文件
      • 声明日志记录对象
        • 方式一:手动声明Logger对象
        • 方式二:使用lombok的@Slf4j注解
      • 调用方法记录日志
    • 4.2 logback.xml配置文件详解
      • 完整配置示例:
      • 配置项说明:
      • 开关控制:
    • 4.3 logback日志级别
      • 各级别作用及使用场景:
      • 使用原则:
      • 日志级别过滤规则:
      • 代码示例:

一、Controller层接收url参数的几种方式

在SpringBoot中,Controller层接收参数就像我们接收不同方式寄来的快递,每种方式都有其适用场景。

1.1 使用HttpServletRequest

这就像去邮局取包裹,需要主动报上姓名和手机号才能拿到自己的快递。

@GetMapping("/user")
public String getUser(HttpServletRequest request) {
// 获取请求参数,相当于报上快递信息
String id = request.getParameter("id");
// 取件码
String name = request.getParameter("name");
// 收件人姓名
return "用户ID: " + id + ", 姓名: " + name;
}

使用场景:需要获取多个不固定的参数时,或者需要获取请求头、Cookie等信息时使用。

1.2 使用@RequestParam,设置required = false的作用

这就像点外卖时可选的备注信息,有些是必填的(比如收货地址),有些是可选的(比如是否放门口)。

// 查询商品列表(类似电商平台搜索商品)
@GetMapping("/products")
public String getProducts(
@RequestParam("category") String category, // 商品类别(必填,如"手机")
@RequestParam(value = "page", required = false, defaultValue = "1") int page, // 页码(可选,默认第1页)
@RequestParam(value = "size", required = false) Integer size // 每页条数(可选,不填则使用系统默认)
) {
return "查询类别: " + category + ", 第" + page + "页, 每页" + (size != null ? size : 20) + "条";
}

required = false的作用:设置该参数为可选,用户可以不传这个参数,避免出现400错误(就像外卖备注可以不填)。

1.3 可以省略@RequestParam的情况

当请求参数名与方法形参名称完全一致时,可以省略@RequestParam注解,就像快递单上的姓名和你身份证上的姓名完全一致,快递员可以直接把快递给你。

// 查询订单(类似查询外卖订单)
@GetMapping("/orders")
public String getOrder(
String orderId, // 订单号(参数名与形参名一致,可省略@RequestParam)
@RequestParam String status // 订单状态(参数名与形参名一致,也可以显式添加注解)
) {
return "订单ID: " + orderId + ", 状态: " + status;
}

注意:如果参数名不一致,必须使用@RequestParam的value属性指定参数名。

二、Controller接收json参数:@RequestBody

这就像接收一个完整的包裹,里面有多个物品(参数),需要用特定的方式打开(使用@RequestBody注解)。通常用于创建新数据的场景,比如新增用户、提交表单等。

场景示例:添加新用户(类似注册新账号)

  1. 定义接收数据的实体类(就像包裹的清单):
public class User
{
private String username;
// 用户名
private String email;
// 邮箱
private int age;
// 年龄
// 必须有getter和setter方法(用于Spring自动赋值)
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
  1. Controller方法接收JSON参数
@PostMapping("/users")
public String addUser(@RequestBody User user) {
// @RequestBody相当于"包裹拆包器"
return "新增用户成功: " + user.getUsername() + ", 邮箱: " + user.getEmail() + ", 年龄: " + user.getAge();
}
  1. 前端发送JSON数据示例(就像寄出的包裹内容):
{
"username": "张三",
"email": "zhangsan@example.com",
"age": 25
}

使用场景:提交多个相关联的参数时,如创建订单、注册用户等需要传递复杂数据的场景。

三、Controller接收路径参数:@PathVariable

这就像快递柜的格子编号,每个格子对应一个唯一的物品。路径参数是URL的一部分,用于标识唯一资源。

基础用法:

// 查询商品详情(类似电商平台查看商品详情页)
@GetMapping("/products/{productId}") // {productId}是路径参数占位符
public String getProductDetail(@PathVariable String productId) {
// @PathVariable获取路径参数
return "商品ID: " + productId + "的详情信息";
}

访问URL:/products/12345,则productId的值为"12345"。

路径参数与形参名称一致时可简写:

当路径参数名与方法形参名一致时,可以省略@PathVariable的value属性,直接写@PathVariable。

// 删除订单(类似取消外卖订单)
@DeleteMapping("/orders/{orderId}") // 路径参数名是orderId
public String deleteOrder(@PathVariable String orderId) {
// 形参名也是orderId,可简写
return "订单" + orderId + "已成功取消";
}

多个路径参数:

// 查询用户的某个订单(类似查看"张三"的"12345"号订单)
@GetMapping("/users/{username}/orders/{orderId}")
public String getUserOrder(
@PathVariable String username, // 用户名
@PathVariable String orderId // 订单ID
) {
return username + "的订单" + orderId + "信息";
}

访问URL:/users/张三/orders/12345,将返回"张三的订单12345信息"。

使用场景:RESTful风格的API中,用于标识唯一资源,如查询、删除单个资源。

四、日志技术介绍(log4j、logback和slf4j的关系)

想象日志系统是一个"记事本":

  • slf4j:相当于记事本的封面,定义了怎么写字(日志接口规范),但本身不提供具体的写字功能。
  • log4j/logback:相当于不同品牌的记事本内页,实现了slf4j定义的接口,提供了具体的日志记录功能(logback是log4j的升级版,性能更好)。

关系:slf4j是日志门面(接口),log4j和logback是日志实现(具体工具)。SpringBoot默认使用slf4j+logback的组合。

4.1 logback快速入门

依赖引入

SpringBoot的spring-boot-starter-web依赖会自动包含logback和slf4j,无需额外引入,就像买电脑时已经预装了操作系统。

<!-- SpringBoot web依赖,已包含logback --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>

添加logback.xml配置文件

src/main/resources目录下创建logback.xml文件,相当于给记事本设置格式(字体大小、颜色、每页行数等)。

基础配置示例

<?xml version="1.0" encoding="UTF-8"?><configuration><!-- 控制台输出 --><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><encoder><!-- 日志输出格式:时间 [线程名] 日志级别 类名 - 日志内容 --><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><!-- 全局日志级别 --><root level="INFO"><appender-ref ref="CONSOLE" /> <!-- 引用控制台输出appender --></root></configuration>

声明日志记录对象

有两种方式可以获取日志对象,就像选择用钢笔还是圆珠笔写字。

方式一:手动声明Logger对象
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@RestController
public class UserController
{
// 声明日志对象,参数是当前类的class
private static final Logger log = LoggerFactory.getLogger(UserController.class)
;
@GetMapping("/testLog")
public String testLog() {
log.info("这是一条信息日志");
// 调用info方法记录日志
return "日志测试成功";
}
}
方式二:使用lombok的@Slf4j注解

添加Lombok依赖(如果没有的话):

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>

在类上添加@Slf4j注解,Lombok会自动生成log对象:

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@Slf4j // Lombok自动生成log对象
public class OrderController
{
@GetMapping("/testSlf4j")
public String testSlf4j() {
log.info("使用Lombok的@Slf4j记录日志");
// 直接使用log对象
return "Slf4j测试成功";
}
}

调用方法记录日志

日志对象提供了多个方法,对应不同级别的日志:

@Slf4j
@RestController
public class LogDemoController
{
@GetMapping("/logLevels")
public String logLevels() {
String username = "张三";
int age = 25;
// 不同级别日志的使用
log.trace("这是TRACE级别的日志,详细跟踪信息,比如变量值:username={}, age={}", username, age);
log.debug("这是DEBUG级别的日志,调试信息,比如方法开始执行");
log.info("这是INFO级别的日志,普通信息,比如用户操作:{}登录成功", username);
log.warn("这是WARN级别的日志,警告信息,比如参数不合法");
log.error("这是ERROR级别的日志,错误信息,比如数据库连接失败");
return "不同级别日志已输出,请查看控制台";
}
}

4.2 logback.xml配置文件详解

logback.xml就像日志的"控制面板",可以配置日志的输出格式、位置、开关等。

完整配置示例:

<?xml version="1.0" encoding="UTF-8"?><configuration><!-- 1. 定义变量:可以复用的配置 --><property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n" /><property name="LOG_FILE_PATH" value="logs/springboot-log" /> <!-- 日志文件路径 --><!-- 2. 控制台输出配置 --><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>${LOG_PATTERN}</pattern> <!-- 使用上面定义的日志格式变量 --><charset>UTF-8</charset> <!-- 字符集 --></encoder><!-- 过滤器:只输出INFO级别及以上的日志到控制台 --><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>INFO</level></filter></appender><!-- 3. 文件输出配置(滚动日志,防止单个文件过大) --><appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 日志文件路径和文件名 --><file>${LOG_FILE_PATH}.log</file><!-- 滚动策略:按时间滚动 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 归档文件名称格式,每天一个日志文件 --><fileNamePattern>${LOG_FILE_PATH}-%d{yyyy-MM-dd}.log</fileNamePattern><!-- 日志文件保留天数 --><maxHistory>30</maxHistory></rollingPolicy><encoder><pattern>${LOG_PATTERN}</pattern><charset>UTF-8</charset></encoder></appender><!-- 4. 日志级别配置 --><!-- root是全局日志级别,appender-ref指定使用哪些appender --><root level="INFO"><appender-ref ref="CONSOLE" /> <!-- 输出到控制台 --><appender-ref ref="FILE" /> <!-- 输出到文件 --></root><!-- 5. 特定包的日志级别(优先级高于root) --><!-- 比如设置com.example.demo包下的日志级别为DEBUG --><logger name="com.example.demo" level="DEBUG" additivity="false"><appender-ref ref="CONSOLE" /><appender-ref ref="FILE" /></logger></configuration>

配置项说明:

配置项作用
<property>定义变量,方便复用,如日志格式、文件路径
<appender>输出目的地配置,如控制台(CONSOLE)、文件(FILE)
<encoder>日志编码器,设置输出格式和字符集
<rollingPolicy>滚动策略,用于文件输出,防止单个文件过大
<root>全局日志级别,所有未单独配置的类都使用此级别
<logger>特定包或类的日志级别,优先级高于root

开关控制:

通过修改<root><logger>level属性,可以控制日志的开关。例如:

4.3 logback日志级别

Logback定义了5种日志级别,从低到高依次为:TRACE < DEBUG < INFO < WARN < ERROR,级别越高,输出的日志越少。

各级别作用及使用场景:

级别作用使用场景示例
TRACE最详细的日志,一般用于追踪程序执行流程记录方法参数、返回值,循环中的变量值
DEBUG调试日志,用于开发阶段排查问题方法开始/结束执行,关键变量值
INFO普通信息日志,记录程序运行状态用户登录/退出,系统启动完成,重要操作成功
WARN警告日志,表示可能存在问题但不影响程序运行参数不合法, deprecated方法使用,资源不足
ERROR错误日志,表示程序出错数据库连接失败,空指针异常,IO异常

使用原则:

  • 开发环境:可以使用DEBUG级别,输出详细日志方便调试
  • 生产环境:建议使用INFO或WARN级别,减少日志量,提高性能
  • 根据包配置:对核心业务包使用INFO级别,对第三方库使用WARN级别,减少冗余日志

日志级别过滤规则:

当设置日志级别为X时,会输出级别>=X的所有日志。例如:

代码示例:

// 模拟用户注册流程中的日志使用
public void register(User user) {
log.trace("开始注册用户,参数:{}", user);
// TRACE:记录详细参数
if (user.getAge() <
18) {
log.warn("用户年龄小于18岁:{}", user.getUsername());
// WARN:警告信息
}
try {
userDao.save(user);
// 保存用户
log.info("用户注册成功:{}", user.getUsername());
// INFO:正常操作结果
} catch (Exception e) {
log.error("用户注册失败:{}", user.getUsername(), e);
// ERROR:异常信息,需传入异常对象
}
log.debug("注册方法执行结束");
// DEBUG:方法执行状态
}

注意:输出ERROR级别日志时,建议将异常对象作为最后一个参数传入,这样日志会包含异常堆栈信息,方便排查问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/908991.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025-09-21 网站前几分钟还运行的好好地,几分钟后查看居然显示文件无法加载,访问首页提示无法访问此网站??!==ssl证书过期+域名解析失效

原来是用https访问的,ssl证书过期后就无法使用https访问了,文件所在的业务场景有可能需压强制使用https来访问,把ssl证书续上就行了, 还有就是查看你的服务器控制台,看看域名解析是否正常,我查看了一下,我去!域…

20231321王曦轶《密码系统设计》第二周

第一周预习报告 学习内容HeadFirstC嗨翻C语言第8章 《Windows C/C++加密解密实战》第 3,5 章第三章重点3.4,3.5,特别3.4.4 第五章重点5.3.7AI 对学习内容的总结(1分) 要求让AI(kimi,元宝等)阅读学习内容并进行总…

爱锋拍照工具 - 隐私政策

隐私政策概述 本隐私政策说明了拍照工具应用(以下简称"我们"或"应用")如何收集、使用、存储和保护您的个人信息。 🔍 信息收集 相机和媒体访问 相机权限: 用于扫描二维码和拍摄照片/视频 照片…

周计划+总结

这是第一期的周计划+总结(被我爸催的。。。。。后面一周一更 周一到周四我爸出差,周五有课,所以只有在下午能有时间做信息学,周一,周二,周五,每天做题,从题目池里面抽,周三周四用于补题和总结,并找相关的题目…

C#通讯之网络通讯 TCP UDP - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

[POI 2004] MOS

一道很有意思的贪心题,似乎noi导刊上有?记不太清了,反正是做出来了。 题意 有一个桥,一个火把,一堆人。 这对人要过桥,过桥有一些条件。需要过桥的人有火把不可同时过两个以上每次过桥的花费时间是两人中花费最高…

第03周 面向对象入门2与类的识别

什么样的方法应该用static修饰? static修饰的方法属于类本身,而不是类的实例。通常适用于以下几种情况: 比如Java中的Math类,用于创建对象的静态方法。 不用static修饰的方法往往具有什么特? 非static修饰的方法,…

完整教程:启用GPU对模型进行推理,安装cuda toolkit cuDNN 9

完整教程:启用GPU对模型进行推理,安装cuda toolkit &cuDNN 9pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "…

25秋周总结3

总结 这周的考试我还是挺稳的,并没有挂分,除了周一本来有 300pts 但是没有调出来比较可惜,其他场都已经打到上限了。所以现在我需要突破,如何做出更多的题?首先我要找出我不擅长的题,我发现最主要的就是一些需要…

R ggplot2学习Nature子刊一张图,换数据即可用! - 指南

R ggplot2学习Nature子刊一张图,换数据即可用! - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&…

AI 在教育领域的落地困境:个性化教学与资料隐私的平衡之道

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025-06-10.购买联想thinkpad 16p

2025-06-10.购买联想thinkpad 16p 创建时间:2025-06-10 18:03 星期二 你的每一份记录都是美好的回忆,加油! 日记信息 地点:南京 心情:好 事件:购买联想笔记本电脑今日小记 事件1:2025-06-10.淘宝购买联想thinkp…

浏览器兼容性问题全解:CSS 前缀、Grid/Flex 布局兼容专业的方案与跨浏览器调试技巧

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

深入解析:大数据领域数据产品的深度学习应用

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

MySQL的Schema是什么? - 公众号

本文已收录在Github,关注我,紧跟本系列专栏文章,咱们下篇再续!🚀 魔都架构师 | 全网30W技术追随者 🔧 大厂分布式系统/数据中台实战专家 🏆 主导交易系统百万级流量调优 & 车联网平台架构 🧠 AIGC应用…

用户态与内核态的深度解析:安全、效率与优化之道 - 教程

用户态与内核态的深度解析:安全、效率与优化之道 - 教程2025-09-21 19:12 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important;…

推动安全研究多元化的10万美元捐赠计划

Trail of Bits宣布通过SummerCon会议捐赠10万美元支持年轻安全研究者,特别关注女性和少数群体。该计划包含资金资助、导师指导及会议演讲机会,并推动安全会议演讲者构成的多元化改革。Trail of Bits捐赠10万美元通过…

20250919

20250919T1 蒜头看演出 异或哈希即可。代码 #include <iostream> #include <string.h> #include <random> #include <set> #include <map> using namespace std; random_device rd; mt…

完整教程:AI+虚拟仿真开启材料工程专业学习与实践新篇章

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …