苍穹外卖Day03——解决总结3中存在的问题

解决Day03中存在的问题

  • 1. @ ResponseBody 与 @RequestBody
  • 2. @RequestParam 与 @PathVariable
  • 3. 字段填充技术(注解、AOP、反射)
    • 3.1. AOP
    • 3.2. 注解
    • 3.3. 反射
    • 3.5 字段填充在项目应用
  • 4. 阿里云云存储OOS

1. @ ResponseBody 与 @RequestBody

@ResponseBody,用于将后端的JAVABEAN对象对象转化为JSON格式的数据返回给前端。

  1. 标注在控制器的方法上,用于将方法的返回值以JSON/XML的格式返回给客户端。
  2. 如果没有该注解,将返回一个ModelAndView给客户端,即返回视图。
  3. Spring中的新增注解:@RestController,@RestController = @Controller + @ResponseBody,如果一个Controller类添加了@RestController注解,那么该Controller类中的所有方法都相当于添加了@ResponseBody 注解。
  4. 当控制器使用@RestController标注时,控制器中的所有方法无需再添加@ResponseBody 注解;当控制器使用@Controller标注时,控制器中的所有方法则需要添加@ResponseBody注解。

@RequestBody,用于将前端发送来的JSON/XML格式的数据转化为JAVABEAN对象;

作用:

  1. 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上;

  2. 再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。

使用时机

  1. GET、POST方式提时, 根据request header Content-Type的值来判断:
  • application/x-www-form-urlencoded, 可选(即非必须,因为这种情况的数据@RequestParam, @ModelAttribute也可以处理,当然@RequestBody也能处理);
  • multipart/form-data, 不能处理(即使用@RequestBody不能处理这种格式的数据);
  • 其他格式, 必须(其他格式包括application/json, application/xml等。这些格式的数据,必须使用@RequestBody来处理);
  1. PUT方式提交时, 根据request header Content-Type的值来判断:
  • application/x-www-form-urlencoded, 必须;
  • multipart/form-data, 不能处理;
  • 其他格式, 必须;

2. @RequestParam 与 @PathVariable

@RequestParam@PathVariable 注解是用于从request中接收请求的,两个都可以接收参数,关键点不同的是@RequestParam 是从request里面拿取值,@PathVariable 是从一个url模板里面来填充。

@RequestParam

// 请求方式1:http://127.0.0.1:8080/getUserId2?id=1  // id为1@PostMapping("getUserId2")
@ApiOperation(value = "获取Id2", notes = "通过用户ID获取")
public String findById2(@ApiParam(value = "用户ID", required = true) @RequestParam("id") Long id) {return "id为===》" + id;
}// 请求方式2:http://localhost:8080/springmvc/hello/101?param1=10&param2=20public String getDetails(@RequestParam(value="param1", required=true) String param1,@RequestParam(value="param2", required=false) String param2){
...
}

@RequestParam 支持下面四种参数:

  1. defaultValue 如果本次请求没有携带这个参数,或者参数为空,那么就会启用默认值

  2. name 绑定本次参数的名称,要跟URL上面的一样

  3. required 这个参数是不是必须的

  4. value 跟name一样的作用,是name属性的一个别名

@PathVariable

// 请求方式1:http:// 127.0.0.1:8080/getUserId/1  // id为1@PostMapping("getUserId/{id}")
@ApiOperation(value = "获取Id", notes = "通过用户ID获取")
public String findById(@ApiParam(value = "用户ID", required = true) @PathVariable("id") Long id) {return "id为===》" + id;
}// http://localhost:8080/springmvc/hello/101?param1=10&param2=20@RequestMapping("/hello/{id}")
public String getDetails(@PathVariable(value="id") String id, @RequestParam(value="param1", required=true) String param1,@RequestParam(value="param2", required=false) String param2){
.......
}

3. 字段填充技术(注解、AOP、反射)

3.1. AOP

查看个人博客详细介绍:

文章名称笔记链接简介
Spring:AOP的核心概念(1)https://lushimeng.blog.csdn.net/article/details/127962788主要讲解AOP的一些概念,主要内容包括:AOP简介、AOP入门案例以及AOP工作的流程
Spring:AOP切入点表达式(2)https://lushimeng.blog.csdn.net/article/details/127962794主要描述切入点表达式、语法格式、通配符和书写技巧
Spring:AOP的五种通知类型(3)https://lushimeng.blog.csdn.net/article/details/127962807主要介绍AOP的五中通知类型:前置通知@Before、后置通知@After、环绕通知@Around、返回后通知@AfterReturning和异常后通知@AfterThrowing。主要掌握前后置和环绕通知类型
Spring:AOP通知获取数据(4)https://lushimeng.blog.csdn.net/article/details/127962821主要介绍AOP通知获取数据,主要分为两大块:AOP通知获取参数(非环绕获取和环绕获取) 和 AOP通知获取返回值(环绕通知获取和返回后通知获取)
Spring:AOP事务管理(5)https://lushimeng.blog.csdn.net/article/details/127962845主要讲的是Spring事务管理,主要包括Spring事务简介、Spring事务以及Spring事务属性

3.2. 注解

查看个人博客详细介绍:Java单元测试、反射、注解、动态代理

3.3. 反射

查看个人博客详细介绍:Java单元测试、反射、注解、动态代理

3.5 字段填充在项目应用

在这里插入图片描述

存在问题:代码冗余、不便于后期维护

解决思路:字段填充技术。对于插入数据和更新数据分别加上不同的注解帮助自动填充字段信息。

  • 自定义注解AutoFill,用于标识需要进行公共字段自动填充的方法
  • 自定义切面类AutoFillAspect, 统一拦截加入了AutoFill注解的方法,通过反射为公共字段赋值
  • 在Mapper的方法上加上AutoFillzhu注解

步骤一:自定义注解AutoFill

/*** 自定义注解,用于标识某个方法需要进行功能字段自动填充处理*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoFill {// 数据库操作类型:insert, updateOperationType value();
}/*** 数据库操作类型*/
public enum OperationType {/*** 更新操作*/UPDATE,/*** 插入操作*/INSERT}

步骤二:自定义切面AutoFillAspect

/*** 自定义切面,实现公共字段自动填充处理逻辑*/
@Aspect
@Component
@Slf4j
public class AutoFillAspect {/*** 切入点*/@Pointcut("execution(* com.sky.mapper.*.*(..)) && @annotation(com.sky.annotation.AutoFill)")public void autoFillPointCut(){}/*** 前置通知,在通知总进行公共字段的赋值* @param joinPoint*/@Before("autoFillPointCut()")public void autoFill(JoinPoint joinPoint){log.info("开始进行公共字段自动填充....");}
}

完善autoFill方法

package com.sky.aspect;import com.sky.annotation.AutoFill;
import com.sky.constant.AutoFillConstant;
import com.sky.context.BaseContext;
import com.sky.enumeration.OperationType;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.time.LocalDateTime;/*** 自定义切面,实现公共字段自动填充处理逻辑*/
@Aspect
@Component
@Slf4j
public class AutoFillAspect {/*** 切入点*/@Pointcut("execution(* com.sky.mapper.*.*(..)) && @annotation(com.sky.annotation.AutoFill)")public void autoFillPointCut(){}/*** 前置通知,在通知总进行公共字段的赋值* @param joinPoint*/@Before("autoFillPointCut()")public void autoFill(JoinPoint joinPoint){log.info("开始进行公共字段自动填充....");// 获取到当前被拦截的方法上的数据库操作类型MethodSignature signature = (MethodSignature) joinPoint.getSignature(); // 方法签名对象AutoFill autoFill = signature.getMethod().getAnnotation(AutoFill.class); // 获取方法上的注解OperationType operationType = autoFill.value(); // 获取数据库操作类型// 获取当前被拦截方法的参数--实体对象Object[] args = joinPoint.getArgs();if(args == null || args.length == 0){return;}Object entity = args[0];  // 获取参数实体对象,然后通过反射设置参数// 准备赋值数据LocalDateTime now = LocalDateTime.now();Long currentId = BaseContext.getCurrentId();// 根据当前不同的操作类型,为对应的属性通过反射来赋值if(operationType == OperationType.INSERT){try {Method setCreateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_TIME, LocalDateTime.class);Method setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);Method setCreateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_USER, Long.class);Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);// 通过反射为对象属性赋值setCreateTime.invoke(entity, now);setUpdateTime.invoke(entity, now);setCreateUser.invoke(entity, currentId);setUpdateUser.invoke(entity, currentId);} catch (Exception e) {e.printStackTrace();}} else {try {Method setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);// 通过反射为对象属性赋值setUpdateTime.invoke(entity, now);setUpdateUser.invoke(entity, currentId);} catch (Exception e) {e.printStackTrace();}}}}

步骤三:在Mapper接口的方法上加入AutoFill注解并把业务层为公共字段赋值的代码注释掉

在这里插入图片描述

在这里插入图片描述

4. 阿里云云存储OOS

参考黑马2023年JavaWeb教程:黑马程序员JavaWeb开发教程 p148 文件上传-阿里云OOS

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

varFormatter 数据格式化库 以性能优先的 快速的 内存对象格式转换

varFormatter 数据格式化 技术 开源技术栏 对象/变量格式化工具库,其支持将一个对象进行按照 JSON XML HTML 等格式进行转换,并获取到结果字符串! 目录 文章目录 varFormatter 数据格式化 技术目录介绍获取方式 使用实例格式化组件的基本使…

WIN10 无密码自动登录

1、家里重装了一下WIN10系统,第一次登陆居然用了微软网站账号,结果密码忘记了,后面只能用PIN码登陆系统。 2、需要登录微软的网站修改密码: Microsoft account | Sign In or Create Your Account Today – Microsoft 3、在运行…

【C语言】动态内存管理常用函数

前言 我们在之前学习的数组开辟的空间是固定不变的,有时候我们需要的空间⼤⼩在程序运⾏的时候才能知道~ c语言中的动态内存开辟,让程序员⾃⼰可以根据实际需求申请和释放相应空间,这使得空间的开辟变得灵活了许多。 欢迎关注个人主页&#x…

数据库原理及应用 第三章:关系数据模型

文章目录 三、关系数据模型3.1.1关系模型概述3.1.2候选键和外键3.2关系模型的完整性 三、关系数据模型 3.1.1关系模型概述 3.1.2候选键和外键 3.2关系模型的完整性

写作软件,批量写作文章的软件

在信息爆炸的时代,写作软件成为许多人提高效率、优化内容的利器。本文将介绍6款不同的写作软件,以及知名的147GPT生成工具和文心一言AI生成软件,它们不仅可以帮助用户快速生成原创文章,还支持全自动SEO优化,提升文章在…

wy的leetcode刷题记录_Day79

wy的leetcode刷题记录_Day79 声明 本文章的所有题目信息都来源于leetcode 如有侵权请联系我删掉! 时间:2024-3-1 前言 目录 wy的leetcode刷题记录_Day79声明前言2369. 检查数组是否存在有效划分题目介绍思路代码收获 61. 旋转链表题目介绍思路代码收获 82. 删除排…

【Vue】npm run build 打包报错:请在[.env.local]中填入key后方可使用...

报错如下 根目录添加 .env.local 文件 .env.local :本地运行下的配置文件 配置:VUE_GITHUB_USER_NAME 及 VUE_APP_SECRET_KEY 原因

【研发日记】Matlab/Simulink技能解锁(二)——在Function编辑窗口Debug

目录 前言 行断点 条件断点 前言 见《【研发日记】Matlab/Simulink技能解锁(一)——在Simulink编辑窗口Debug》 行断点 当Matlab Function出现异常时,如果能确定大致的代码段,就可以在相应的行上设置一个断点(Breakpoint)&…

Oracle 11g升级19c 后部分查询功能很慢

*Oracle 11g升级19c 后部分查询功能很慢 今天生产突然有个查询非常慢,日志显示执行了50秒左右,但是从日志中拿出SQL在PLSQL执行,发现用时不到1秒,查看SQL,怀疑是下面几种原因导致 1、使用函数不当 UNIT.UNIT_CODE LIKE CONCAT(‘…

b站小土堆pytorch学习记录——P7-P8 Tensorboard的使用

文章目录 一、前置知识1.Tensorboard是什么2.SummaryWriter3.add_scalar()4.add_image() 二、代码1.一次函数2.蚂蚁和蜜蜂图片 一、前置知识 1.Tensorboard是什么 TensorBoard 是 TensorFlow 的可视化工具,它允许开发者可视化模型的图(graph&#xff0…

栈(顺序栈)实现Language C

###王道考研的学习领悟,个人喜好讲解清晰 何为栈? 定义:栈(stack)是只允许在一端进行插入或删除的线性表。 其重要术语:栈顶,栈底,空栈。 我们只需要把这个图看明白了,理解起来就…

electron+vue3全家桶+vite项目搭建【28】封装窗口工具类【2】窗口组,维护窗口关系

文章目录 引入实现效果思路主进程模块渲染进程模块测试效果 引入 demo项目地址 窗口工具类系列文章: 封装窗口工具类【1】雏形 我们思考一下窗口间的关系,窗口创建和销毁的一些动作,例如父子窗口,窗口组合等等,还有…

Prometheus(二):NodeExporter和Grafana的安装和使用

目录 1 Node Exporter安装1.1 简介1.2 安装1.3 Prometheus收集node_exporter数据 2 安装Grafana2.1 安装2.2 使用1、创建数据源2、选择模板3、模板导入 2.3 grafana创建用户1、创建用户2、验证 总结 1 Node Exporter安装 1.1 简介 node exporter是Prometheus的收集数据的组件…

GCN 翻译 - 1

ABSTRACT 我们提出了一种可扩展的在以图结构为基础的数据上的半监督学习,这种方法直接作用在图数据上,可以看做是卷积神经网络的变种。我们选择了图谱理论里面的一阶近似作为我们的卷积结构。我们的模型能够随着图的规模线性伸缩,并且隐藏层…

【计算机网络】五种IO模型与IO多路转接之select

文章目录 一、五种IO模型二、非阻塞IO1.fcntl2.实现函数SetNoBlock3.轮询方式读取标准输入 三、I/O多路转接之select1.初识select2.select函数原型3.socket就绪条件4.select的特点5.select缺点6.select使用案例--只读取数据的server服务器1.err.hpp2.log.hpp3.sock.hpp4.select…

面试题JS篇

目录 Js 基本数据类型有哪些Ajax 如何使用如何判断一个数据是 NaN?Js 中 null 与 undefined 区别闭包是什么?有什么特性?对页面会有什么影响JS中模块化的方法Js 中常见的内存泄漏什么是事件冒泡?如何阻止事件冒泡?事件…

windows server mysql 数据库停止 备份 恢复全流程操作方法

一,mysql备份 mysql最好是原工程文件备份.不需要sql查询的方式备份.安全高效. 比如,安装php与mysql组合后,我的mysql文件保存在: D:\phpstudy_pro\Extensions\MySQL5.7.26\data\dux 我只需要复制一份,保存起来就行. 二,mysql恢复 怎么恢复呢.我们一般是只恢复其中一个表,则找…

初学者如何使用QT新建一个包含UI界面的C++项目

文章目录 一、下载并安装QT51、下载安装包2、注册/登录账号3、安装qt6 二、新建QT Widget项目1、新建项目并且运行2、易错点:可能运行成功得到UI界面但是会报错(原因是使用了中文路径) 一、下载并安装QT5 1、下载安装包 进入下载网址 Windo…

MES系统在离散制造企业中的功能解析

随着信息技术的快速发展和制造业的转型升级,MES在离散制造企业中的作用日益凸显。MES系统不仅提高了生产效率和产品质量,还优化了资源配置,增强了企业的市场竞争力。 一、生产管理功能 MES系统能够实时监控生产现场的各种数据,包…

java小记(2)

IS-A:类的父子继承关系。 default:关键字,与Java中的public,private等关键字一样,都属于修饰符关键字,可以用来修饰属性、方法以及类,但是default一般用来修饰接口中的方法。 接口与抽象类的区…