【JavaWeb】SpringBootWeb案例下篇

淩亂°似流年 2024-04-26 03:09 137阅读 0赞

? 本文由 程序喵正在路上 原创,CSDN首发!
? 系列专栏:JavaWeb开发
? 首发时间:2024年3月12日
? 欢迎关注?点赞?收藏?留言?

目录

  • 新增员工
  • 文件上传
    • 简介
    • 本地存储
    • 阿里云OSS
  • 修改员工
    • 查询回显
    • 修改员工
  • 配置文件
    • 参数配置化
    • yml配置文件
    • @ConfigurationProperties

新增员工

需求

在这里插入图片描述

思路

在这里插入图片描述

实现

EmpController.java

  1. @PostMapping
  2. public Result save(@RequestBody Emp emp) {
  3. log.info("新增员工,emp: {}", emp);
  4. empService.save(emp);
  5. return Result.success();
  6. }

EmpServiceImpl.java

  1. @Override
  2. public void save(Emp emp) {
  3. emp.setCreateTime(LocalDateTime.now());
  4. emp.setUpdateTime(LocalDateTime.now());
  5. empMapper.save(emp);
  6. }

EmpMapper.java

  1. /**
  2. * 新增员工
  3. *
  4. * @param emp
  5. */
  6. @Insert("insert into emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time) " +
  7. "VALUES (#{username}, #{name}, #{gender}, #{image}, #{job}, #{entrydate}, #{deptId}, #{createTime}, #{updateTime})")
  8. void save(Emp emp);

测试

测试数据:

  1. {
  2. "image": "1.jpg",
  3. "username": "linpinzhi",
  4. "name": "林平之",
  5. "gender": 1,
  6. "job": 1,
  7. "entrydate": "2015-09-18",
  8. "deptId": 1
  9. }

在这里插入图片描述

在这里插入图片描述

文件上传

简介

  • 文件上传,是指将本地图片、视频、音频等文件上传到服务器,供其他用户浏览或下载的过程。
  • 文件上传在项目中应用非常广泛,我们发微博、发微信朋友圈都用到了文件上传功能。

前端页面三要素

在这里插入图片描述

本地存储

  • 在服务端,接收到上传上来的文件之后,将文件存储在本地服务器磁盘中。

将资料中 “文件上传” 目录下的 upload.html 复制到 resources 下的目录下:

在这里插入图片描述

接下来,我们在 controller 目录下写一个程序来接收前端页面上传的文件并将文件存储在本地:

UploadController.java

  1. import com.xixi.pojo.Result;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.springframework.web.bind.annotation.PostMapping;
  4. import org.springframework.web.bind.annotation.RestController;
  5. import org.springframework.web.multipart.MultipartFile;
  6. import java.io.File;
  7. @Slf4j
  8. @RestController
  9. public class UploadController {
  10. @PostMapping("/upload")
  11. public Result upload(String username, Integer age, MultipartFile image) throws Exception {
  12. log.info("文件上传:{}, {}, {}", username, age, image);
  13. //获取原始文件名
  14. String originalFilename = image.getOriginalFilename();
  15. //将文件存储在服务器的磁盘目录中
  16. image.transferTo(new File("D:\\images\\" + originalFilename));
  17. return Result.success();
  18. }
  19. }

然后,我们进行测试,在D盘下创建文件夹images,启动服务,在Postman中进行测试:

在这里插入图片描述

在这里插入图片描述

现在这个程序还是有bug的,当我们再上传一张同名的图片后,会发现原来的图片被覆盖了,所以下面我们要解决如何给每个文件构造一个唯一的文件名

  1. @Slf4j
  2. @RestController
  3. public class UploadController {
  4. @PostMapping("/upload")
  5. public Result upload(String username, Integer age, MultipartFile image) throws Exception {
  6. log.info("文件上传:{}, {}, {}", username, age, image);
  7. //获取原始文件名
  8. String originalFilename = image.getOriginalFilename();
  9. //构造唯一的文件名,使用uuid(通用唯一标识码)
  10. int index = originalFilename.lastIndexOf("."); //定义原始文件名中最后一个点的下标
  11. String extname = originalFilename.substring(index); //将点及其后面的内容截取出来,也就是获取到文件的后缀
  12. String newFileName = UUID.randomUUID() + extname;
  13. log.info("新的文件名:{}", newFileName);
  14. //将文件存储在服务器的磁盘目录中
  15. image.transferTo(new File("D:\\images\\" + newFileName));
  16. return Result.success();
  17. }
  18. }

在这里插入图片描述

当我们上传了一张超过1M的图片时,会出现以下情形:

在这里插入图片描述

意思就是文件太大了,服务器接收不了

在SpringBoot中,文件上传,默认单个文件允许最大大小为 1M。如果需要上传大文件,可以进行如下配置:

  1. #配置单个文件最大上传大小
  2. spring.servlet.multipart.max-file-size=10MB
  3. #配置单个请求最大上传大小(因为一次请求可以上传多个文件)
  4. spring.servlet.multipart.max-request-size=100MB

重启服务,再测试,就可以了:

在这里插入图片描述

本地存储的缺点:

在这里插入图片描述

阿里云OSS

阿里云

  • 阿里云是阿里巴巴集团旗下全球领先的云计算公司,也是国内最大的云服务提供商

    在这里插入图片描述

阿里云OSS

  • 阿里云对象存储OSS(Object Storage Service),是一款海量、安全、低成本、高可靠的云存储服务。使用OSS,您可以通过网络随时存储和调用包括文本、图片、音频和视频等在内的各种文件。

    在这里插入图片描述

第三方服务-通用思路

在这里插入图片描述

SDK:Software Development Kit 的缩写,软件开发工具包,包括辅助软件开发的依赖(jar包)、代码示例等,都可以叫做SDK。

阿里云OSS-使用步骤

在这里插入图片描述
Bucket:存储空间是用户用于存储对象(Object,就是文件)的容器,所有的对象都必须隶属于某个存储空间。

具体步骤:

点击访问阿里云官网 https://www.aliyun.com/ ,登录并认证后按照下列步骤操作

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

开通后:

在这里插入图片描述

创建Bucket:

在这里插入图片描述

获取秘钥:

在这里插入图片描述

在这里插入图片描述

记得保存秘钥,后面无法再查看创建的秘钥:

在这里插入图片描述

参照官方SDK,编写入门程序:

返回 OSS 界面:

在这里插入图片描述

找到Java,按照教程操作即可:

在这里插入图片描述

引入依赖:

在这里插入图片描述

接下来找到官方文档中关于Java如何上传文件的教程,我们来入门OSS:

在这里插入图片描述

复制全部代码,粘贴到测试目录下:

在这里插入图片描述

将内容改成自己的:

在这里插入图片描述

注意:配置完环境变量后,记得重启一下IDEA

右键运行,然后到Bucket查看,可以看到图片已经上传成功:

在这里插入图片描述

阿里云OSS-集成:

  • 引入阿里云OSS上传文件工具类(由官方的示例代码改造而来)
  • 开发上传图片接口

创建包 utils 用来存放工具类,将资料中的工具类 AliOSSUtils 粘贴到包下,并将信息修改为自己的:

在这里插入图片描述

开发文件上传接口:

  1. @Slf4j
  2. @RestController
  3. public class UploadController {
  4. @Autowired
  5. private AliOSSUtils aliOSSUtils;
  6. @PostMapping("/upload")
  7. public Result upload(MultipartFile image) throws Exception {
  8. log.info("文件上传,文件名:{}", image.getOriginalFilename());
  9. //调用阿里云OSS工具类进行文件上传
  10. String url = aliOSSUtils.upload(image);
  11. log.info("文件上传完成,文件访问的url:{}", url);
  12. return Result.success(url);
  13. }
  14. }

测试:

在这里插入图片描述

在这里插入图片描述

我们再来到前端页面,添加一个员工:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

修改员工

查询回显

当我们点击编辑时,页面会将该员工的信息展示出来供我们修改,这个功能称为查询回显
在这里插入图片描述

需求

在这里插入图片描述

思路
在这里插入图片描述

实现

EmpController.java

  1. @GetMapping("/{id}")
  2. public Result getById(@PathVariable Integer id) {
  3. log.info("根据ID查询员工信息,id:{}", id);
  4. Emp emp = empService.getById(id);
  5. return Result.success(emp);
  6. }

EmpMapper.java

  1. /**
  2. * 根据ID查询员工
  3. * @param id
  4. * @return
  5. */
  6. @Select("select * from emp where id = #{id}")
  7. Emp getById(Integer id);

测试

在这里插入图片描述

修改员工

需求

在这里插入图片描述

思路

在这里插入图片描述

实现

EmpController.java

  1. @PutMapping
  2. public Result update(@RequestBody Emp emp) {
  3. log.info("更新员工信息:{}", emp);
  4. empService.update(emp);
  5. return Result.success();
  6. }

EmpServiceImpl.java

  1. @Override
  2. public void update(Emp emp) {
  3. emp.setUpdateTime(LocalDateTime.now());
  4. empMapper.update(emp);
  5. }

EmpMapper.xml

  1. <!-- 更新员工信息-->
  2. <update id="update">
  3. update emp
  4. <set>
  5. <if test="username != null and username != ''">
  6. username = #{username},
  7. </if>
  8. <if test="name != null and name != ''">
  9. name = #{name},
  10. </if>
  11. <if test="gender != null">
  12. gender = #{gender},
  13. </if>
  14. <if test="entrydate != null">
  15. entrydate = #{entrydate},
  16. </if>
  17. <if test="image != null and image != ''">
  18. image = #{image},
  19. </if>
  20. <if test="job != null">
  21. job = #{job},
  22. </if>
  23. <if test="updateTime != null">
  24. update_time = #{updateTime},
  25. </if>
  26. <if test="deptId != null">
  27. dept_id = #{deptId}
  28. </if>
  29. </set>
  30. where id = #{id}
  31. </update>

测试

修改前:

在这里插入图片描述

修改后:

在这里插入图片描述

在这里插入图片描述

配置文件

参数配置化

问题分析

在前面导入的工具类中,我们硬性地将OSS的各种参数设置在类中:

在这里插入图片描述

当我们使用的技术或服务多了之后,每个技术都有其参数,我们想要修改参数的时候,是挺麻烦的

问题解决

  1. 将参数配置在工程的配置文件中

    在这里插入图片描述

  2. 需要使用的时候,通过 @Value 注解引入

    @Value 注解通常用于外部配置的属性注入,具体用法为: @Value("${配置文件中的key}")

    在这里插入图片描述
    在这里插入图片描述

在之后,我们遇到类似的问题,都可以采用这种方法来解决

yml配置文件

配置格式

SpringBoot提供了多种属性配置方式

  • application.properties

    1. server.port=8080
    2. server.address=127.0.0.1
  • application.yml

    1. server:
    2. port: 8080
    3. address: 127.0.0.1
  • application.yaml

    1. server:
    2. port: 8080
    3. address: 127.0.0.1

常见配置文件格式对比

  • XML(臃肿)

    1. <server>
    2. <port>8080</port>
    3. <address>127.0.0.1</address>
    4. </server>
  • properties(层级结构不清晰)

    1. server.port=8080
    2. server.address=127.0.0.1
  • yml / yaml(简洁,数据为中心,推荐)

    1. server:
    2. port: 8080
    3. address: 127.0.0.1

yml

基本语法

  • 大小写敏感
  • 数值前边必须有空格,作为分隔符
  • 使用缩进表示层级关系,缩进时,不允许使用Tab键,只能用空格(idea中会自动将Tab转换为空格)
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
  • # 表示注释,从这个字符一直到行尾,都会被解析器忽略

yml数据格式

  • 对象/Map集合:

    1. user:
    2. name: zhangsan
    3. age: 18
    4. password: 123456
  • 数组/List/Set集合:

    1. hobby:
    2. - java
    3. - game
    4. - sport

yml配置

创建配置文件 application.yml,在 application.yml 中的配置案例相关的配置项

在这里插入图片描述

配置完成后,就可以将 application.properties 删掉了

@ConfigurationProperties

问题分析

在这里插入图片描述

@ConfigurationProperties

在这里插入图片描述

我们定义一个类 AliOSSProperties,在其中定义OSS的各个参数,这个类可以复用:

  1. import lombok.Data;
  2. import org.springframework.boot.context.properties.ConfigurationProperties;
  3. import org.springframework.stereotype.Component;
  4. @Data
  5. @Component
  6. @ConfigurationProperties(prefix = "aliyun.oss")
  7. public class AliOSSProperties {
  8. private String endpoint;
  9. private String accessKeyId;
  10. private String accessKeySecret;
  11. private String bucketName;
  12. }

再修改一下 AliOSSUtils 类,注入 AliOSSProperties 对象并获取其参数:

  1. import com.aliyun.oss.OSS;
  2. import com.aliyun.oss.OSSClientBuilder;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.beans.factory.annotation.Value;
  5. import org.springframework.stereotype.Component;
  6. import org.springframework.web.multipart.MultipartFile;
  7. import java.io.*;
  8. import java.util.UUID;
  9. /**
  10. * 阿里云 OSS 工具类
  11. */
  12. @Component
  13. public class AliOSSUtils {
  14. @Autowired
  15. private AliOSSProperties aliOSSProperties;
  16. /**
  17. * 实现上传图片到OSS
  18. */
  19. public String upload(MultipartFile file) throws IOException {
  20. //获取阿里云OSS参数
  21. String endpoint = aliOSSProperties.getEndpoint();
  22. String accessKeyId = aliOSSProperties.getAccessKeyId();
  23. String accessKeySecret = aliOSSProperties.getAccessKeySecret();
  24. String bucketName = aliOSSProperties.getBucketName();
  25. // 获取上传的文件的输入流
  26. InputStream inputStream = file.getInputStream();
  27. // 避免文件覆盖
  28. String originalFilename = file.getOriginalFilename();
  29. String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));
  30. //上传文件到 OSS
  31. OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
  32. ossClient.putObject(bucketName, fileName, inputStream);
  33. //文件访问路径
  34. String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;
  35. // 关闭ossClient
  36. ossClient.shutdown();
  37. return url;// 把上传到oss的路径返回
  38. }
  39. }

发现有报红,只要添加下面这个依赖即可:
在这里插入图片描述

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-configuration-processor</artifactId>
  4. </dependency>

@ConfigurationProperties 与 @Value 对比

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,137人围观)

还没有评论,来说两句吧...

相关阅读

    相关 【JavaWeb】SpringBootWeb案例下篇

    文件上传,是指将本地图片、视频、音频等文件上传到服务器,供其他用户浏览或下载的过程。文件上传在项目中应用非常广泛,我们发微博、发微信朋友圈都用到了文件上传功能。前端页面三要素。

    相关 【JavaWeb】MySQL下篇

    多表查询: 指从多张表中查询数据分类连接查询内连接:相当于查询A、B交集部分数据外连接左外连接:查询左表所有数据(包括两张表交集部分数据)右外连接:查询右表所有数据(包括...

    相关 类型转换(下篇

    1. `-、、/、%`这四种都会把符号两边转成数字来进行运算 2. `+`由于不仅是数字运算符,还是字符串的连接符,所以分为两种情况: 两端都是数字则进行数字计算

    相关 分布式部署(下篇

    前言 代理服务和用户服务搭建完毕后,我们继续搭建剩下的服务:笔记服务和日志服务。 笔记服务 Note 笔记服务负责与笔记本相关的所有业务逻辑处理,也就是本项目中的

    相关 go test 下篇

    前言 go test [上篇][Link 1] 给大家介绍了golang自带的测试框架,包括单元测试和性能测试。但是在实际生产中测试经常会遇到一些网络或者依赖的第三方系统