【JavaWeb+后端常用部件】
回顾内容看:
一、获取请求参数的方法
参考:[JavaWeb]——获取请求参数的方式(全面!!!)_java 获取请求参数-CSDN博客
Json格式的Body | 加备注@RequestBody |
{id}动态路径 | 加备注@PathVariable |
id=?&name=? | 直接接收就好 |
id=?但参数名与方法参数名不一致; | 加备注@RequestParam ; 加备注@RequestParam List<Long> 名字 |
二、构造(Controller—service—mapper)
1、controller
负责请求转发,接受页面过来的参数,传给Service处理,接到返回值,再传给页面。
2、service
主要负责业务模块的应用逻辑应用设计,调用Mapper接口来查询数据库。
3、Mapper(dao)
数据库操作。
4、DTO(数据传输对象)
为了结构清晰,特意创建了用于接收前端传过来的数据的类(供controller层接収数据),后续可以在service层利用BeanUtils.copyProperties(employeeDTO, employee);,将属性拷贝给对象就好。
5、VO(封装前端显示页面的属性)
要返回给前端的数据,如果在已有的类中找不到的数据,创建VO类来封装传给前端的数据。
三、AOP:面向切面编程
简单理解:面向特定方法编程
定义了类RecordTimeApsect
@Aroud("execution(* com.itheima.service.*.*(..))")
1、步骤:
(1)导入AOP依赖
(2)编写AOP程序:针对特定的方法,根据业务需要进行编程
@component是把程序交给Spring管理
@Aspect是声明是AOP类
@Around("execution(* com.itheima.service.impl.*.*(..))"):com.itheima.service.impl包下的所有类的所有方法
2、核心概念
切入点一定是连接点,但连接点不一定是切入点
相当于连接点serviceImpl方法被包含在@Aspect切面类的@Around涉及的切入点范围内,所以在controller层调用这个service方法的时候,会调用这个service方法对应的自动生成的动态代理对象的方法,这个动态代理对象中的方法已经实现了Aspect中定义的公共方法+方法本身。
AOP的底层 ——> 动态代理技术
注意:所谓的动态代理对象其实是虚构的(没有实体),实际上就是切面类的通知方法+实际的目标方法
实际上就是,controller中调用service方法实际上去执行了切面类中的通知方法,并且把真实的service方法同时传递给了切面类的通知方法,在通知方法中可以完成原本方法的调用。
3、通知类型
注:@Around需要自己调用ProceedingJoinPoint.proceed();来执行原始方法,其他的通知不需要自己调用。
这个m的灰色线部分在上面——>前置通知,在下面——>后置通知
把切入点放到注解@pointcut里面,定义一个void方法pt(),则在以后得所有通知中,只需要@Around("pt()")
4、通知顺序
5、切入点表达式
(1)execution
execution(* com.itheima..update.*(..))
第一个*:返回值。修饰符是可以省略的,但返回值不可以省略
第一个..:任意包;
第二个..:任意方法参数
完整的:
可以+
(2)@annotation:自定义注解
步骤:
1、定义一个annotation格式的类
/*** 自定义注解,用于标识某个方法需要进行功能字段自动填充处理*/ @Target(ElementType.METHOD)//Target表示在哪里生效,ElementType.METHOD表示在方法上生效,只能加在方法上 @Retention(RetentionPolicy.RUNTIME)//Rentention表示注解什么时候生效,RUNTIME表示在运行的时候生效 public @interface AutoFill {//通过设置常量的方法在枚举类中设置// 数据库操作类型:UPDATE INSERTOperationType value(); }
2、在切面类中@Before("@annotation(annotation这个类的reference地址)")
3、在Mapper要匹配的方法加上@annotion的名字
6、连接点
@Around要用ProcedingJoinPoint
其他用JoinPoint
//获取目标对象
Object target = jointPoint.getTarget();//获取目标类
String className = jointPoint.getTarget().getClass().getName();//获取目标方法
String name = jointPoint.getSignature().getName();//获取目标方法参数Object[] args = jointPoint.getArgs();
四、文件上传
1、前端:
(1)方法method必须是post,因为图片啥的很大。
(2)enctype需要设置为multipart/form-data,否则上传的只是文件的名字。
2、本地存储
//原始文件名
String originalFileName = file.getOriginalFileName();//保存文件
file.transferTo(new File("D:/image/" + originalFileName));
但是名字可能会重复,所以要重新命名
//截取原始文件名的后缀 dfdfdf.png
String extension = originalFilename.substring(originalFilename.lastIndexOf("."));
//构造新文件名称
String objectName = UUID.randomUUID().toString() + extension;
这里面的UUID是自带的类
如果不配置,默认的上传个图片只能上传1Mb以下的。
除非,在application.yml文件中,配置文件上传大小的配置(搜multipart)
3、云存储
要注册阿里云账号啥的,参考官方SDK编写入门程序,集成使用
配置AccessKey:
看 SDK示例
根据OSS Java SDK快速入门OSS Java SDK快速入门_对象存储(OSS)-阿里云帮助中心配置
五、Redis
一个基于内存的key-value结构数据库。
1、下载
利用cmd:
启动redis:打开到redis的文件包,redis-server.exe redis.windows.conf
链接redis:redis-cli.exe
图形界面:下载就行
2、数据类型
3、常用命令
(1)字符串操作命令
(2)哈希操作命令
(3)列表操作命令
(4)集合操作命令
(5)有序集合操作指令
(6)通用操作指令
3、在Java中操作Redis
设置序列化器的目的是为了能够正常显示key的名字
字符串:
六、HttpClient(com.sky.utils.HttpClientUtil)
在Java程序中通过编码的形式发送http请求
post和get的区别是,post要额外处理要接収的JSON格式的数据,所以要httpPost.setEntity(entity)。之后就正常的发送请求httpClient.execute(httpPost)
七、微信小程序开发
个人身份注册不能开放支付权限,必须要企业啥的
微信小程序注册链接
下载开发工具
(没细看)
八、缓存菜品
通过Redis(内存操作)缓存菜品数据,减少数据库查询操作(磁盘IO操作)。
内存操作比磁盘操作性能好很多
如果同时有很多的人利用数据库查,会很累
根据分类展示菜品——>每个分类下的菜品保存一份缓存数据,即key为哪几个分类的id,value为{某个分类下的菜品们}的字符串形式。
Spring Cache
精确清理:key是某个ID
所有的都清理: allEntries
九、Spring Task
cron表达式:任务触发的时间
分为6-7个域,含义分别为:秒,分钟,小时,日,月,周,年(可选)
其中,日和周几一般只能定义一个,另一个写?,*表示每
例如,2022年10月12日上午9点整——>cron = " 0 0 9 12 10 ? 2022 "
还有别的特殊字符,可以在网站找cron的在线生成器
0 * * * * ?——>每分钟
1/5 * * * * ?——>从第1s开始,每隔5秒触发一次
十、WebSocket
浏览器和服务器双向数据传输,且只需要一次握手
十一、ECharts
基于JavaScrip,有各种的统计图
十二、Apache POI
操作Excel文件
写操作:
//创建Excel文件
XSSFWorkbook excel = new XSSFWorkbook();//创建sheet页
XSSFSheet sheet = excel.createSheet("info");//在sheet中创建行对象
XSSFRow row = sheet.createRow(0);//创建单元格并写入文件内容
row.createCell(0).setCellValue("姓名");//通过输出流将内存中的Excel文件写入到磁盘
FileOutputStream out = new FileOutputStream(new File("D:\\info.xlsx"));
excel.write(out);//关闭资源
out.close();
excel.close();
读操作:
File file = new File("D://INFO.XSLX");FileInputStream in = new FileInputStream(file);XSSFWorkbook excel = new XSSFWorkbook(in);XSSFSheet sheet = excel.getSheetAt(0);//最后的行号
sheet.getLastRowNum();//可以for循环读取每一行
XSSFRow row = sheet.getRow(i);
//读取单元格内容
String value = row.getCell(0).getStringCellValue();//关闭资源
in.close();
excel.close();
传到页面端http:
在controller层加上参数HttpServletResponse
public void export(HttpServletResponse response){reportService.exportBusinessData(response);}
在serviceImpl层中,放一个excel文件的模板,直接在里面加数据就好了
读取模板:(存放在本目录的resource下的话,就用
InputStream in = this.getClass().getClassLoader().getResourceAsStream("相对地址.xsxl"));
InputStream inputStream = this.getClass() .getClassLoader(). getResourceAsStream("template/运营数据报表模板.xlsx");//基于提供好的模板文件创建一个新的Excel表格对象 XSSFWorkbook excel = new XSSFWorkbook(inputStream);
输出到http上:ServletOutputStream out = response.getOutputStream();
excel.write(out);
//通过输出流将文件下载到客户端浏览器中ServletOutputStream out = response.getOutputStream();excel.write(out);
public void exportBusinessData(HttpServletResponse response) {LocalDate begin = LocalDate.now().minusDays(30);LocalDate end = LocalDate.now().minusDays(1);//查询概览运营数据,提供给Excel模板文件BusinessDataVO businessData = workspaceService.getBusinessData(LocalDateTime.of(begin,LocalTime.MIN), LocalDateTime.of(end, LocalTime.MAX));InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("template/运营数据报表模板.xlsx");try {//基于提供好的模板文件创建一个新的Excel表格对象XSSFWorkbook excel = new XSSFWorkbook(inputStream);//获得Excel文件中的一个Sheet页XSSFSheet sheet = excel.getSheet("Sheet1");sheet.getRow(1).getCell(1).setCellValue(begin + "至" + end);//获得第4行XSSFRow row = sheet.getRow(3);//获取单元格row.getCell(2).setCellValue(businessData.getTurnover());row.getCell(4).setCellValue(businessData.getOrderCompletionRate());row.getCell(6).setCellValue(businessData.getNewUsers());row = sheet.getRow(4);row.getCell(2).setCellValue(businessData.getValidOrderCount());row.getCell(4).setCellValue(businessData.getUnitPrice());for (int i = 0; i < 30; i++) {LocalDate date = begin.plusDays(i);//准备明细数据businessData = workspaceService.getBusinessData(LocalDateTime.of(date,LocalTime.MIN), LocalDateTime.of(date, LocalTime.MAX));row = sheet.getRow(7 + i);row.getCell(1).setCellValue(date.toString());row.getCell(2).setCellValue(businessData.getTurnover());row.getCell(3).setCellValue(businessData.getValidOrderCount());row.getCell(4).setCellValue(businessData.getOrderCompletionRate());row.getCell(5).setCellValue(businessData.getUnitPrice());row.getCell(6).setCellValue(businessData.getNewUsers());}//通过输出流将文件下载到客户端浏览器中ServletOutputStream out = response.getOutputStream();excel.write(out);//关闭资源out.flush();out.close();excel.close();}catch (IOException e){e.printStackTrace();}}
相关文章:

【JavaWeb+后端常用部件】
回顾内容看: 一、获取请求参数的方法 参考:[JavaWeb]——获取请求参数的方式(全面!!!)_java 获取请求参数-CSDN博客 Json格式的Body加备注RequestBody{id}动态路径加备注PathVariableid?&name?直接接收就好 i…...

Redis 重回开源怀抱:开源精神的回归与未来展望
在开源软件的广袤天地里,Redis 一直是备受瞩目的明星项目。近期,Redis 宣布重新回归开源,这一消息犹如一颗石子投入平静的湖面,在技术社区激起层层涟漪。今天,就让我们深入了解 Redis 这一重大转变背后的故事、意义以及…...

弹窗表单的使用,基于element-ui二次封装
el-dialog-form 介绍 基于element-ui封装的弹窗式表单组件 示例 git地址 https://gitee.com/chenfency/el-dialog-form.git 更新日志 2021-8-12 版本1.0.0 2021-8-17 优化组件,兼容element原组件所有Attributes及Events 2021-9-9 新增tip提示 安装教程 npm install …...
Unity打包安卓失败 Build failure 解决方法
【Unity】打包安卓失败 Build failure 的解决方法_com.android.build.gradle.internal.res.linkapplicat-CSDN博客 unity在打包时设置手机屏幕横屏竖屏的方法_unity打包默认横屏-CSDN博客...
Flink + Kafka 数据血缘追踪与审计机制实战
一、引言 在实时数据系统中,“我的数据从哪来?去往何处?” 是业务方最关心的问题之一。 尤其在以下场景下: 📉 金融风控:模型出现预警,需回溯数据源链路。 🧾 合规审计:监管要求提供数据全流程路径。 🛠 运维排查:Kafka Topic 数据乱序或错发后快速定位来源。 …...

实践005-Gitlab CICD全项目整合
文章目录 环境准备环境准备集成Kubernetes Gitlab CICD项目整合项目整合整合设计 后端Java项目部署后端Java项目静态检查后端Java项目镜像构建创建Java项目部署文件创建完整流水线 前端webui项目部署前端webui项目镜像构建创建webui项目部署文件创建完整流水线 构建父子类型流水…...

懒人美食帮SpringBoot订餐系统开发实现
概述 快速构建一个订餐系统,今天,我们将通过”懒人美食帮”这个基于SpringBoot的订餐系统项目,为大家详细解析从用户登录到多角色权限管理的完整实现方案。本教程特别适合想要学习企业级应用开发的初学者。 主要内容 1. 用户系统设计与实现…...
css animation 动画属性
animation // 要绑定的关键帧规则名称 animation-name: slidein;// 定义动画完成一个周期所需的时间,秒或毫秒 animation-duration: 3s;// 定义动画速度曲线 animation-timing-function: ease;// 定义动画开始前的延迟时间 animation-delay: 1s;// 定义动画播放次数…...

MySQL 从入门到精通(六):视图全面详解 —— 虚拟表的灵活运用
在数据库开发中,我们经常需要重复执行复杂的多表查询,或是需要限制用户只能访问特定数据。这时候,MySQL 的 视图(View)就能大显身手。作为一种 “虚拟表”,视图不存储实际数据,却能基于 SQL 查询…...

手机隐私数据彻底删除工具:回收或弃用手机前防数据恢复
软件介绍 有这样一款由吾爱网友chenwangjun 原创开发的数据处理软件,名为 AndroidDiskClear。它的核心功能十分强大,能够将你手机里已经删除的各类文件,像图片、普通文件、文字信息等彻底清除干净,有效杜绝数据恢复类软件的二次恢…...

数据压缩实现案例
在driver中修改代码 package com.root.mapreduce.compress; import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.…...
python实战项目69:基于Python爬虫的链家二手房数据采集方法研究
python实战项目69:链家二手房数据采集 一、项目需求1.1 房地产数据价值1.2 传统数据获取局限性1.3 技术可行性二、数据采集流程2.1 需求分析2.2 网页结构分析2.3 请求发送与反爬策略2.4 数据解析2.5 数据存储三、结论与展望四、完整代码一、项目需求 本文针对房地产数据分析需…...
xml与注解的区别
功能xml配置注解定义bean bean标签 id属性 class属性 Component Controller Service Repository ComponentScan 设置依赖注入 setter注入(set方法) 构造器注入(构造方法) Autowired Qualifier Value 配置第三方bean bean标签 静…...

FlySecAgent:——MCP全自动AI Agent的实战利器
最近,出于对人工智能在网络安全领域应用潜力的浓厚兴趣,我利用闲暇时间进行了深入研究,并成功开发了一款小型轻量化的AI Agent安全客户端FlySecAgent。 什么是 FlySecAgent? 这是一个基于大语言模型和MCP(Model-Contr…...
利用flask设计接口
Flask 接口设计详尽指南(整合知识库优化版) 目录 基础概念与安装接口设计规范核心功能实现高级特性扩展错误处理与调试部署与优化完整示例 基础概念与安装 安装 Flask pip install Flask项目结构建议 my_flask_api/ ├── app.py # 主…...

ideal创建Springboot项目(Maven,yml)
以下是使用 IntelliJ IDEA 创建基于 Maven 的 Spring Boot 项目并使用 YAML 配置文件的详细步骤: 一、创建 Spring Boot 项目 启动项目创建向导 打开 IntelliJ IDEA,点击“File”->“New”->“Project”。 在弹出的“New Project”窗口中&#…...

Pycharm(十九)深度学习
一、深度学习概述 1.1 什么是深度学习 深度学习是机器学习中的一种特殊方法,它使用称为神经网络的复杂结构,特别是“深层”的神经网络,来学习和做出预测。深度学习特别适合处理大规模和高维度的数据,如图像、声音和文本。深度学习、机器学习和人工智能之间的关系如下图所…...
XSS 攻击:深入剖析“暗藏在网页中的脚本“与防御之道
XSS (Cross-Site Scripting),即跨站脚本攻击,是 Web 安全领域中最常见也最具危害性的漏洞之一。攻击者通过巧妙的手段将恶意的 JavaScript、HTML 或其他脚本代码注入到正常的 Web 页面中。当其他用户浏览这些被注入了恶意脚本的页面时,这些脚…...

Scrapyd 详解:分布式爬虫部署与管理利器
Scrapyd 是 Scrapy 官方提供的爬虫部署与管理平台,支持分布式爬虫部署、定时任务调度、远程管理爬虫等功能。本文将深入讲解 Scrapyd 的核心功能、安装配置、爬虫部署流程、API 接口使用,以及如何结合 Scrapy-Redis 实现分布式爬虫管理。通过本文&#x…...
ai之pdf解析rapidOCR 的两种底层依赖PaddlePaddle 和ONNXRuntime
rapidocr_onnxruntime 与 rapidocr(通常指 rapidocr_paddle 或其他后端实现)的核心区别及使用推荐: 一、核心区别 特性rapidocr_onnxruntimerapidocr(以 rapidocr_paddle 为例)后端引擎基于 ONNXRuntime 推理框架&…...

驱动开发硬核特训 · 专题篇:Vivante GPU 与 DRM 图形显示体系全解析(i.MX8MP 平台实战)
视频教程请关注 B 站:“嵌入式Jerry”。 一、背景导读:GPU 与 DRM 到底谁负责“显示”? 在嵌入式 Linux 图形系统中,“画面怎么显示出来”的问题,表面看似简单,实则涉及多个内核子系统与用户态组件的协同&…...

C——猜数字游戏
前面我们已经学习了C语言常见概念,数据类型和变量以及分置于循环的内容,现在我们可以将这些内容结合起来写一个有趣的小游戏。下面正式开始我们今天的主题——猜数字游戏的实现。 猜数字游戏的要求: 1.电脑自动生成1~100的随机数。 2.玩家…...

C/C++实践(三)深入理解 C++ 三大特性之一:封装
一、封装的概念与核心思想 封装(Encencapsulation)是 C 面向对象编程(OOP)的三大核心特性之一,其本质是将数据(成员变量)和对数据的操作(成员函数)捆绑在一个逻辑单元&a…...
Filecoin存储管理:如何停止Lotus向特定存储路径写入新扇区数据
Filecoin存储管理:如何停止Lotus向特定存储路径写入新扇区数据 引言背景问题场景解决方案步骤1:修改sectorstore.json文件步骤2:重新加载存储配置步骤3:验证更改 技术原理替代方案最佳实践结论 引言 在Filecoin挖矿过程中&#x…...

1、RocketMQ 核心架构拆解
1. 为什么要使用消息队列? 消息队列(MQ)是分布式系统中不可或缺的中间件,主要解决系统间的解耦、异步和削峰填谷问题。 解耦:生产者和消费者通过消息队列通信,彼此无需直接依赖,极大提升系统灵…...

vue3 element-plus 输入框回车跳转页面问题处理
问题描述: 当页面搜索条件只有一个的情况下,输入框不管有没有值,回车后会跳转页面 解决办法,给表单添加 submit.prevent <el-form ref"ruleForm" :model"search" label-width"120px" class&qu…...
常见WEB漏洞----暴力破解
什么是暴力破解 暴力破解 (Brue Force) 是一种攻击方法 (穷举法),简称为“爆破”,黑客通过反复猜解和实验,旨在以暴力手段登入、访问目标主机获取服务,破坏系统安全,其属于 ATT&CK技术中的一种,常利用…...

快速入门深度学习系列(2)----损失函数、逻辑回归、向量化
针对深度学习入门新手目标不明确 知识体系杂乱的问题 拟开启快速入门深度学习系列文章的创作 旨在帮助大家快速的入门深度学习 写在前面: 本系列按照吴恩达系列课程顺序发布(说明一下为什么不直接看原笔记 因为内容太多 没有大量时间去阅读 所有作者需要一次梳理…...

[超详细,推荐!!!]前端性能优化策略详解
学习记录,部分内容版权归妙码学院 1.优化内容包括那些 其实前端的优化,整体粗略概括下来,白话之: 打开速度怎么变快再次打开速度怎么变快操作怎么才顺滑动画怎么保证流畅 2.性能优化 2.1首屏加载优化 在了解优化方法和策略之…...

数据提取之BeautifulSoup4快速使用
文章目录 一、前言二、概述2.1 安装2.2 初始化2.3 对象类型 三、遍历文档树3.1 子节点3.2 父节点3.3 兄弟节点3.4 前后节点3.5 节点内容3.5.1 文本内容3.5.2 属性值3.5.3 标签删除 四、搜索文档树4.1 find_all4.2 find4.3 CSS选择器4.4 更多 一、前言 官方文档:http…...