【JavaWeb】SpringBootWeb案例下篇

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

新增员工

需求

在这里插入图片描述

思路

在这里插入图片描述

实现

EmpController.java

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

EmpServiceImpl.java

@Override
public void save(Emp emp) {
    emp.setCreateTime(LocalDateTime.now());
    emp.setUpdateTime(LocalDateTime.now());
    empMapper.save(emp);
}

EmpMapper.java

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

测试

测试数据:

{
    "image": "1.jpg",
    "username": "linpinzhi",
    "name": "林平之",
    "gender": 1,
    "job": 1,
    "entrydate": "2015-09-18",
    "deptId": 1
}

在这里插入图片描述

在这里插入图片描述

文件上传

简介

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

前端页面三要素

在这里插入图片描述

本地存储

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

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

在这里插入图片描述

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

UploadController.java

import com.xixi.pojo.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;

@Slf4j
@RestController
public class UploadController {

    @PostMapping("/upload")
    public Result upload(String username, Integer age, MultipartFile image) throws Exception {
        log.info("文件上传:{}, {}, {}", username, age, image);

        //获取原始文件名
        String originalFilename = image.getOriginalFilename();

        //将文件存储在服务器的磁盘目录中
        image.transferTo(new File("D:\\images\\" + originalFilename));

        return Result.success();
    }
}

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

在这里插入图片描述

在这里插入图片描述

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

@Slf4j
@RestController
public class UploadController {

    @PostMapping("/upload")
    public Result upload(String username, Integer age, MultipartFile image) throws Exception {
        log.info("文件上传:{}, {}, {}", username, age, image);

        //获取原始文件名
        String originalFilename = image.getOriginalFilename();

        //构造唯一的文件名,使用uuid(通用唯一标识码)
        int index = originalFilename.lastIndexOf(".");  //定义原始文件名中最后一个点的下标
        String extname = originalFilename.substring(index); //将点及其后面的内容截取出来,也就是获取到文件的后缀
        String newFileName = UUID.randomUUID() + extname;
        log.info("新的文件名:{}", newFileName);

        //将文件存储在服务器的磁盘目录中
        image.transferTo(new File("D:\\images\\" + newFileName));

        return Result.success();
    }
}

在这里插入图片描述

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

在这里插入图片描述

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

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

#配置单个文件最大上传大小
spring.servlet.multipart.max-file-size=10MB

#配置单个请求最大上传大小(因为一次请求可以上传多个文件)
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 粘贴到包下,并将信息修改为自己的:

在这里插入图片描述

开发文件上传接口:

@Slf4j
@RestController
public class UploadController {

    @Autowired
    private AliOSSUtils aliOSSUtils;

    @PostMapping("/upload")
    public Result upload(MultipartFile image) throws Exception {
        log.info("文件上传,文件名:{}", image.getOriginalFilename());

        //调用阿里云OSS工具类进行文件上传
        String url = aliOSSUtils.upload(image);
        log.info("文件上传完成,文件访问的url:{}", url);

        return Result.success(url);
    }
}

测试:

在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

修改员工

查询回显

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

需求

在这里插入图片描述

思路
在这里插入图片描述

实现

EmpController.java

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

EmpMapper.java

/**
* 根据ID查询员工
* @param id
* @return
*/
@Select("select * from emp where id = #{id}")
Emp getById(Integer id);

测试

在这里插入图片描述

修改员工

需求

在这里插入图片描述

思路

在这里插入图片描述

实现

EmpController.java

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

EmpServiceImpl.java

@Override
public void update(Emp emp) {
    emp.setUpdateTime(LocalDateTime.now());
    empMapper.update(emp);
}

EmpMapper.xml

<!--    更新员工信息-->
<update id="update">
    update emp
    <set>
        <if test="username != null and username != ''">
            username = #{username},
        </if>
        <if test="name != null and name != ''">
            name = #{name},
        </if>
        <if test="gender != null">
            gender = #{gender},
        </if>
        <if test="entrydate != null">
            entrydate = #{entrydate},
        </if>
        <if test="image != null and image != ''">
            image = #{image},
        </if>
        <if test="job != null">
            job = #{job},
        </if>
        <if test="updateTime != null">
            update_time = #{updateTime},
        </if>
        <if test="deptId != null">
            dept_id = #{deptId}
        </if>
    </set>
    where id = #{id}
</update>

测试

修改前:

在这里插入图片描述

修改后:

在这里插入图片描述

在这里插入图片描述

配置文件

参数配置化

问题分析

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

在这里插入图片描述

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

问题解决

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

    在这里插入图片描述

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

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

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

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

yml配置文件

配置格式

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

  • application.properties

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

    server:
       port:  8080
       address: 127.0.0.1
    
  • application.yaml

    server:
       port:  8080
       address: 127.0.0.1
    

常见配置文件格式对比

  • XML(臃肿)

    <server>
    	<port>8080</port>
    	<address>127.0.0.1</address>
    </server>
    
  • properties(层级结构不清晰)

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

    server:
       port:  8080
       address: 127.0.0.1
    

yml

基本语法

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

yml数据格式

  • 对象/Map集合:

    user:
       name: zhangsan
       age: 18
       password: 123456
    
  • 数组/List/Set集合:

    hobby:
      - java
      - game
      - sport
    

yml配置

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

在这里插入图片描述

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

@ConfigurationProperties

问题分析

在这里插入图片描述

@ConfigurationProperties

在这里插入图片描述

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

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Data
@Component
@ConfigurationProperties(prefix = "aliyun.oss")
public class AliOSSProperties {
    private String endpoint;
    private String accessKeyId;
    private String accessKeySecret;
    private String bucketName;
}

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

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.util.UUID;

/**
 * 阿里云 OSS 工具类
 */
@Component
public class AliOSSUtils {
    
    @Autowired
    private AliOSSProperties aliOSSProperties;
    
    /**
     * 实现上传图片到OSS
     */
    public String upload(MultipartFile file) throws IOException {
        //获取阿里云OSS参数
        String endpoint = aliOSSProperties.getEndpoint();
        String accessKeyId = aliOSSProperties.getAccessKeyId();
        String accessKeySecret = aliOSSProperties.getAccessKeySecret();
        String bucketName = aliOSSProperties.getBucketName();

        // 获取上传的文件的输入流
        InputStream inputStream = file.getInputStream();

        // 避免文件覆盖
        String originalFilename = file.getOriginalFilename();
        String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));

        //上传文件到 OSS
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        ossClient.putObject(bucketName, fileName, inputStream);

        //文件访问路径
        String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;
        // 关闭ossClient
        ossClient.shutdown();
        return url;// 把上传到oss的路径返回
    }
}

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

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
</dependency>

@ConfigurationProperties 与 @Value 对比

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序喵正在路上

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值