当前位置: 首页 > article >正文

Javaweb-day11案例(文件)

新增员工

EmpController

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

EmpServiceImpl

@Override
    public void save(Emp emp) {
//        补全数据
        emp.setCreateTime(LocalDateTime.now());
        emp.setUpdateTime(LocalDateTime.now());
//        调用添加方法
        empMapper.insert(emp);
    }

 EmpMapper

@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 insert(Emp emp);

文件上传

简介

文件上传前端页面三要素

1.在form表单中,要定义一个表单项,类型为file

2.表单的提交方式必须得是POST方式

下面是讲义里面的内容补充

上传文件的原始form表单,要求表单必须具备以下三点(上传文件页面三要素):

  • 表单必须有file域,用于选择要上传的文件

    <input type="file" name="image"/>
  • 表单提交方式必须为POST

    通常上传的文件会比较大,所以需要使用 POST 提交方式

  • 表单的编码类型enctype必须要设置为:multipart/form-data

    普通默认的编码格式是不适合传输大型的二进制数据的,所以在文件上传时,表单的编码格式必须设置为multipart/form-data

普通的表单项后端怎么接收呢,直接在方法中声明形参

然后接收文件呢,springboot提供了一个api,通过api就可以接收到上传上来的文件

【MultipartFile image】 

如果参数名和方法形参名称不一致,可以通过注解@RequestParam进行参数绑定

实现真正的文件上传,需要将临时文件转存到磁盘目录中。

本地存储

需要构造唯一的文件名(不能重复)--UUID(通用唯一标识码-长度固定的字符串)

代码实现:

  1. 在服务器本地磁盘上创建images目录,用来存储上传的文件(例:E盘创建images目录)

  2. 使用MultipartFile类提供的API方法,把临时文件转存到本地磁盘目录下

MultipartFile 常见方法:

  • String getOriginalFilename(); //获取原始文件名

  • void transferTo(File dest); //将接收的文件转存到磁盘文件中

  • long getSize(); //获取文件的大小,单位:字节

  • byte[] getBytes(); //获取文件内容的字节数组

  • InputStream getInputStream(); //获取接收到的文件内容的输入流

如果直接存储在服务器的磁盘目录中,存在以下缺点:

  • 不安全:磁盘如果损坏,所有的文件就会丢失

  • 容量有限:如果存储大量的图片,磁盘空间有限(磁盘不可能无限制扩容)

  • 无法直接访问

为了解决上述问题呢,通常有两种解决方案:

  • 自己搭建存储服务器,如:fastDFS 、MinIO

  • 使用现成的云服务,如:阿里云,腾讯云,华为云  

阿里云OSS

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

云服务指的是通过互联网对外提供的各种各样的服务

阿里云oss-使用步骤

阿里云oss对象存储服务的准备工作以及入门程序没跟,后期做项目的时候再看。

没有账户没办法引用,抄一下讲义里面的

引入阿里云OSS上传文件工具类(由官方的示例代码改造而来)

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
​
import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;
​
@Component
public class AliOSSUtils {
    private String endpoint = "https://oss-cn-shanghai.aliyuncs.com";
    private String accessKeyId = "LTAI5t9MZK8iq5T2Av5GLDxX";
    private String accessKeySecret = "C0IrHzKZGKqU8S7YQcevcotD3Zd5Tc";
    private String bucketName = "web-framework01";
​
    /**
     * 实现上传图片到OSS
     */
    public String upload(MultipartFile multipartFile) throws IOException {
        // 获取上传的文件的输入流
        InputStream inputStream = multipartFile.getInputStream();
​
        // 避免文件覆盖
        String originalFilename = multipartFile.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的路径返回
    }
}

修改UploadController代码:

import com.itheima.pojo.Result;
import com.itheima.utils.AliOSSUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
​
@Slf4j
@RestController
public class UploadController {
​
    @Autowired
    private AliOSSUtils aliOSSUtils;
​
    @PostMapping("/upload")
    public Result upload(MultipartFile image) throws IOException {
        //调用阿里云OSS工具类,将上传上来的文件存入阿里云
        String url = aliOSSUtils.upload(image);
        //将图片上传完成后的url返回,用于浏览器回显展示
        return Result.success(url);
    }
    
}

修改员工

查询回显

代码实现
  • EmpMapper

@Mapper
public interface EmpMapper {
​
    //根据ID查询员工信息
    @Select("select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time " +
            "from emp " +
            "where id = #{id}")
    public Emp findById(Integer id);
​
    
    //省略...
}
  • EmpService

public interface EmpService {
​
    /**
     * 根据ID查询员工
     * @param id
     * @return
     */
    public Emp getById(Integer id);
    
    //省略...
}
  • EmpServiceImpl

@Slf4j
@Service
public class EmpServiceImpl implements EmpService {
    @Autowired
    private EmpMapper empMapper;
​
    @Override
    public Emp getById(Integer id) {
        return empMapper.findById(id);
    }
    
    //省略...
}
  • EmpController

@Slf4j
@RestController
@RequestMapping("/emps")
public class EmpController {
​
    @Autowired
    private EmpService empService;
​
    //根据id查询
    @GetMapping("/{id}")
    public Result getById(@PathVariable Integer id){
        Emp emp = empService.getById(id);
        return Result.success(emp);
    }
    
    //省略...
}

修改员工

代码实现
  • EmpMapper

@Mapper
public interface EmpMapper {
    //修改员工信息
    public void update(Emp emp);
    
    //省略...
}
  • EmpMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mapper.EmpMapper">
​
    <!--更新员工信息-->
    <update id="update">
        update emp
        <set>
            <if test="username != null and username != ''">
                username = #{username},
            </if>
            <if test="password != null and password != ''">
                password = #{password},
            </if>
            <if test="name != null and name != ''">
                name = #{name},
            </if>
            <if test="gender != null">
                gender = #{gender},
            </if>
            <if test="image != null and image != ''">
                image = #{image},
            </if>
            <if test="job != null">
                job = #{job},
            </if>
            <if test="entrydate != null">
                entrydate = #{entrydate},
            </if>
            <if test="deptId != null">
                dept_id = #{deptId},
            </if>
            <if test="updateTime != null">
                update_time = #{updateTime}
            </if>
        </set>
        where id = #{id}
    </update>
​
    <!-- 省略... -->
   
</mapper>
  • EmpService

public interface EmpService {
    /**
     * 更新员工
     * @param emp
     */
    public void update(Emp emp);
   
    //省略...
}
  • EmpServiceImpl

@Slf4j
@Service
public class EmpServiceImpl implements EmpService {
    @Autowired
    private EmpMapper empMapper;
​
    @Override
    public void update(Emp emp) {
        emp.setUpdateTime(LocalDateTime.now()); //更新修改时间为当前时间
        
        empMapper.update(emp);
    }
    
    //省略...
}
  • EmpController

@Slf4j
@RestController
@RequestMapping("/emps")
public class EmpController {
​
    @Autowired
    private EmpService empService;
​
    //修改员工
    @PutMapping
    public Result update(@RequestBody Emp emp){
        empService.update(emp);
        return Result.success();
    }
    
    //省略...
}

配置文件

参数配置化

项目当中的一些参数配置过于分散,不方便集中管理和维护的

思路是通用的,如果在项目开发当中,需要用到一些技术或者是服务,就可以将其在运行时所需要的参数直接配置在配置文件当中,交给配置文件统一的进行管理和维护

这个也没跟

yml配置文件

.yml和.yaml配置形式都是相同的,仅仅是后缀名不同而已

在springboot当中,仅支持properties和yml格式【推荐】的配置

简单的了解过springboot所支持的配置文件,以及不同类型配置文件之间的优缺点之后,接下来我们就来了解下yml配置文件的基本语法:

  • 大小写敏感

  • 数值前边必须有空格,作为分隔符

  • 使用缩进表示层级关系,缩进时,不允许使用Tab键,只能用空格(idea中会自动将Tab转换为空格)

  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

  • #表示注释,从这个字符一直到行尾,都会被解析器忽略

了解完yml格式配置文件的基本语法之后,接下来我们再来看下yml文件中常见的数据格式。在这里我们主要介绍最为常见的两类:

  1. 定义对象或Map集合

  2. 定义数组、list或set集合

优先级规则

  1. YAML 文件优先于 Properties 文件:Spring Boot会先加载 application.yml 文件,然后再加载 application.properties 文件。如果有相同的配置项,YAML 文件中的值会覆盖 Properties 文件中的值。
  2. 环境特定配置文件:如果你有环境特定的配置文件(如 application-dev.yml 和 application-dev.properties),Spring Boot也会按照同样的优先级规则加载这些文件。例如,application-dev.yml 会优先于 application-dev.properties

@ConfigurationProperties

区分一下@ConfigurationProperties注解以及我们前面所介绍的另外一个@Value注解:

相同点:都是用来注入外部配置的属性的。

不同点:

  • @Value注解只能一个一个的进行外部属性的注入。

  • @ConfigurationProperties可以批量的将外部的属性配置注入到bean对象的属性中。

如果要注入的属性非常的多,并且还想做到复用,就可以定义这么一个bean对象。通过 configuration properties 批量的将外部的属性配置直接注入到 bin 对象的属性当中。在其他的类当中,我要想获取到注入进来的属性,我直接注入 bin 对象,然后调用 get 方法,就可以获取到对应的属性值了

这part稍微有点水but后面做项目会复敲的


http://www.kler.cn/a/396476.html

相关文章:

  • 数字IC后端低功耗设计实现案例分享(3个power domain,2个voltage domain)
  • Scala的Array
  • Git如何简单使用
  • 制作图片马常用的五种方法总结
  • 《Probing the 3D Awareness of Visual Foundation Models》论文解析——多视图一致性
  • Linux服务器定时执行jar重启命令
  • 基于stm32的智能变频电冰箱系统
  • 网络安全练习之 ctfshow_web
  • 力扣 LeetCode 232. 用栈实现队列(Day5:栈与队列)
  • STM32F4 RTC实时时钟STM32 Cube实例
  • 掌握ECMAScript模块化:构建高效JavaScript应用
  • React Native 全栈开发实战班 - 状态管理入门(Context API)
  • Element plus使用menu时候如何在折叠时候隐藏掉组件自带的小箭头
  • vscode中执行git合并操作需要输入合并commit信息,打开的nano小型文本编辑器说明-
  • Queuing 表(buffer表)的优化实践 | OceanBase 性能优化实践
  • 1.两数之和-力扣(LeetCode)
  • DNS批量解析管理软件有什么用
  • Odoo :一款免费开源的日化行业ERP管理系统
  • windows下git和TortoiseGit(小乌龟)和putty安装配置对github进行操作
  • 操作系统实验:在linux下用c语言模拟进程调度算法程序
  • Vue.js组件数据共享的轻量级解决方案:Provide/Inject
  • 开源三代示波器的高速波形刷新方案开源,支持VNC远程桌面,手机,Pad,电脑均可访问(2024-11-11)
  • Java21和Java8性能优化详细对比
  • ESP-IDF运行export.sh时遇到“${ZSH_VERSION}“附近有错误
  • 从0开始学PHP面向对象内容之(常用魔术方法续二)
  • awk(常用)