【JavaWeb+后端常用部件】

news2025/5/12 21:58:03

回顾内容看:

一、获取请求参数的方法

参考:[JavaWeb]——获取请求参数的方式(全面!!!)_java 获取请求参数-CSDN博客

Json格式的Body加备注@RequestBody
{id}动态路径加备注@PathVariable
id=?&name=?直接接收就好

id=?但参数名与方法参数名不一致;
id=1,2,3,4?这种多参数的

加备注@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 INSERT
    OperationType 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();
        }
    }

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

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

相关文章

Redis 重回开源怀抱:开源精神的回归与未来展望

在开源软件的广袤天地里&#xff0c;Redis 一直是备受瞩目的明星项目。近期&#xff0c;Redis 宣布重新回归开源&#xff0c;这一消息犹如一颗石子投入平静的湖面&#xff0c;在技术社区激起层层涟漪。今天&#xff0c;就让我们深入了解 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 优化组件&#xff0c;兼容element原组件所有Attributes及Events 2021-9-9 新增tip提示 安装教程 npm install …

实践005-Gitlab CICD全项目整合

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

懒人美食帮SpringBoot订餐系统开发实现

概述 快速构建一个订餐系统&#xff0c;今天&#xff0c;我们将通过”懒人美食帮”这个基于SpringBoot的订餐系统项目&#xff0c;为大家详细解析从用户登录到多角色权限管理的完整实现方案。本教程特别适合想要学习企业级应用开发的初学者。 主要内容 1. 用户系统设计与实现…

MySQL 从入门到精通(六):视图全面详解 —— 虚拟表的灵活运用

在数据库开发中&#xff0c;我们经常需要重复执行复杂的多表查询&#xff0c;或是需要限制用户只能访问特定数据。这时候&#xff0c;MySQL 的 视图&#xff08;View&#xff09;就能大显身手。作为一种 “虚拟表”&#xff0c;视图不存储实际数据&#xff0c;却能基于 SQL 查询…

手机隐私数据彻底删除工具:回收或弃用手机前防数据恢复

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

数据压缩实现案例

在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.…

FlySecAgent:——MCP全自动AI Agent的实战利器

最近&#xff0c;出于对人工智能在网络安全领域应用潜力的浓厚兴趣&#xff0c;我利用闲暇时间进行了深入研究&#xff0c;并成功开发了一款小型轻量化的AI Agent安全客户端FlySecAgent。 什么是 FlySecAgent&#xff1f; 这是一个基于大语言模型和MCP&#xff08;Model-Contr…

ideal创建Springboot项目(Maven,yml)

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

Pycharm(十九)深度学习

一、深度学习概述 1.1 什么是深度学习 深度学习是机器学习中的一种特殊方法,它使用称为神经网络的复杂结构,特别是“深层”的神经网络,来学习和做出预测。深度学习特别适合处理大规模和高维度的数据,如图像、声音和文本。深度学习、机器学习和人工智能之间的关系如下图所…

Scrapyd 详解:分布式爬虫部署与管理利器

Scrapyd 是 Scrapy 官方提供的爬虫部署与管理平台&#xff0c;支持分布式爬虫部署、定时任务调度、远程管理爬虫等功能。本文将深入讲解 Scrapyd 的核心功能、安装配置、爬虫部署流程、API 接口使用&#xff0c;以及如何结合 Scrapy-Redis 实现分布式爬虫管理。通过本文&#x…

驱动开发硬核特训 · 专题篇:Vivante GPU 与 DRM 图形显示体系全解析(i.MX8MP 平台实战)

视频教程请关注 B 站&#xff1a;“嵌入式Jerry”。 一、背景导读&#xff1a;GPU 与 DRM 到底谁负责“显示”&#xff1f; 在嵌入式 Linux 图形系统中&#xff0c;“画面怎么显示出来”的问题&#xff0c;表面看似简单&#xff0c;实则涉及多个内核子系统与用户态组件的协同&…

C——猜数字游戏

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

C/C++实践(三)深入理解 C++ 三大特性之一:封装

一、封装的概念与核心思想 封装&#xff08;Encencapsulation&#xff09;是 C 面向对象编程&#xff08;OOP&#xff09;的三大核心特性之一&#xff0c;其本质是将数据&#xff08;成员变量&#xff09;和对数据的操作&#xff08;成员函数&#xff09;捆绑在一个逻辑单元&a…

1、RocketMQ 核心架构拆解

1. 为什么要使用消息队列&#xff1f; 消息队列&#xff08;MQ&#xff09;是分布式系统中不可或缺的中间件&#xff0c;主要解决系统间的解耦、异步和削峰填谷问题。 解耦&#xff1a;生产者和消费者通过消息队列通信&#xff0c;彼此无需直接依赖&#xff0c;极大提升系统灵…

vue3 element-plus 输入框回车跳转页面问题处理

问题描述&#xff1a; 当页面搜索条件只有一个的情况下&#xff0c;输入框不管有没有值&#xff0c;回车后会跳转页面 解决办法&#xff0c;给表单添加 submit.prevent <el-form ref"ruleForm" :model"search" label-width"120px" class&qu…

快速入门深度学习系列(2)----损失函数、逻辑回归、向量化

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

[超详细,推荐!!!]前端性能优化策略详解

学习记录&#xff0c;部分内容版权归妙码学院 1.优化内容包括那些 其实前端的优化&#xff0c;整体粗略概括下来&#xff0c;白话之&#xff1a; 打开速度怎么变快再次打开速度怎么变快操作怎么才顺滑动画怎么保证流畅 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 更多 一、前言 官方文档&#xff1a;http…

list类的详细讲解

【本节目标】 1. list的介绍及使用 2. list的深度剖析及模拟实现 3. list与vector的对比 1. list的介绍及使用 1.1 list的介绍 1. list 是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2. list 的底层是双向链表结构&a…