实战项目技术点(1)

1、什么是REST?

  • REST(Representational State Transfer),表述性状态转换,它是一种软件架构风格。
  • 传统URL风格如下:
    http://localhost:8080/user/getById?id=1 GET:查询id为1的用户
    http://localhost:8080/user/saveUser POST:新增用户
    http://localhost:8080/user/updateUser POST:修改用户
    http://localhost:8080/user/deleteUser?id=1 GET:删除id为1的用户

    我们看到,原始的传统URL呢,定义比较复杂,而且将资源的访问行为对外暴露出来了。

  • 基于REST风格URL如下:
    http://localhost:8080/users/1 GET:查询id为1的用户
    http://localhost:8080/users POST:新增用户
    http://localhost:8080/users PUT:修改用户
    http://localhost:8080/users/1 DELETE:删除id为1的用户

    其中总结起来,就一句话:通过URL定位要操作的资源,通过HTTP动词(请求方式)来描述具体的操作。

  • 在REST风格的URL中,通过四种请求方式,来操作数据的增删改查。
    1. GET : 查询
    2. POST :新增
    3. PUT :修改
    4. DELETE :删除
      我们看到如果是基于REST风格,定义URL,URL将会更加简洁、更加规范、更加优雅。
  • 注意事项:
    1. REST是风格,是约定方式,约定不是规定,可以打破
    2. 描述模块的功能通常使用复数,也就是加s的格式来描述,表示此类资源,而非单个资源。
      如:users、emps、books…

2、开发规范-统一响应结果

前后端工程在进行交互时,使用统一响应结果 Result。

package com.itheima.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result {
private Integer code;//响应码,1 代表成功; 0 代表失败
private String msg; //响应信息 描述字符串
private Object data; //返回的数据
//增删改 成功响应
public static Result success(){
return new Result(1,"success",null);
 }
//查询 成功响应
public static Result success(Object data){
return new Result(1,"success",data);
 }
//失败响应
public static Result error(String msg){
return new Result(0,msg,null);
 }
}

3、小tips

  • 1、如何限定请求方式是POST?
    @PostMapping
  • 2、怎么在controller中接收json格式的请求参数?
    @RequestBody //把前端传递的json数据填充到实体类中
  • 3、如果请求路径,存在一个共同点:都是以 /depts 作为开头。(重复了)
    在Spring当中为了简化请求路径的定义,可以把公共的请求路径,直接抽取到类上,在类上加一个注解
    @RequestMapping,并指定请求路径"/depts"。

    //注意事项:一个完整的请求路径,应该是类上@RequestMapping的value属性 + 方法上的
    //@RequestMapping的value属性
  • 4、怎么在controller中接收请求路径中的路径参数?
    @PathVariable
  • 5、在Mapper接口中,执行delete操作的SQL语句时,条件中的id值是不确定的是动态的,
    怎么实现呢?
    Mybatis中的动态SQL:foreach
  • 6、如果表单项的名字和方法中形参名不一致,该怎么办?
    public Result upload(String username,
    Integer age,
    MultipartFile file) //file形参名和请求参数
    名image不一致

    解决:使用@RequestParam注解进行参数绑定

    public Result upload(String username,
    Integer age,
    @RequestParam("image") MultipartFile
    file)

4、分页插件

介绍

PageHelper是Mybatis的一款功能强大、方便易用的分页插件,支持任何形式的单标、多表的
分页查询。
官网:https://pagehelper.github.io/

在执行empMapper.list()方法时,就是执行:select * from emp 语句,怎么能够
实现分页操作呢?
分页插件帮我们完成了以下操作:
1. 先获取到要执行的SQL语句:select * from emp 
2. 把SQL语句中的字段列表,变为:count(*)
3. 执行SQL语句:select count(*) from emp //获取到总记录数
4. 再对要执行的SQL语句:select * from emp 进行改造,在末尾添加 limit ? ,
?
5. 执行改造后的SQL语句:select * from emp limit ? , ?

代码实现

1、在pom.xml引入依赖

<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.2</version>
</dependency>

2、EmpMapper

@Mapper
public interface EmpMapper {
//获取当前页的结果列表
@Select("select * from emp")
public List<Emp> page(Integer start, Integer pageSize);
}

3、EmpServiceImpl

@Override
public PageBean page(Integer page, Integer pageSize) {
// 设置分页参数
PageHelper.startPage(page, pageSize);
// 执行分页查询
List<Emp> empList = empMapper.list(name,gender,begin,end);
// 获取分页结果
Page<Emp> p = (Page<Emp>) empList; 
//封装PageBean
PageBean pageBean = new PageBean(p.getTotal(), p.getResult());
return pageBean;
}

5、文件上传

简介

  • 文件上传,是指将本地图片、视频、音频等文件上传到服务器,供其他用户浏览或下载的过程。
  • 文件上传在项目中应用非常广泛,我们经常发微博、发微信朋友圈都用到了文件上传功能。
  • 上传文件的原始form表单,要求表单必须具备以下三点(上传文件页面三要素):
    1. 表单必须有file域,用于选择要上传的文件
      <input type="file" name="image"/>
    2. 表单提交方式必须为POST
      通常上传的文件会比较大,所以需要使用 POST 提交方式
    3. 表单的编码类型enctype必须要设置为:multipart/form-data
      普通默认的编码格式是不适合传输大型的二进制数据的,所以在文件上传时,表单的编码格 式必须设置为multipart/form-data

本地存储

代码实现

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

@Slf4j
@RestController
public class UploadController {
@PostMapping("/upload")
public Result upload(String username, Integer age, MultipartFile
image) throws IOException {
log.info("文件上传:{},{},{}",username,age,image);
//获取原始文件名
String originalFilename = image.getOriginalFilename();
//将文件存储在服务器的磁盘目录
image.transferTo(new File("E:/images/"+originalFilename));
return Result.success();
 }
}

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

MultipartFile 常见方法:
String getOriginalFilename(); //获取原始文件名
String getName(); //获取表单文件名
void transferTo(File dest); //将接收的文件转存到磁盘文件中
long getSize(); //获取文件的大小,单位:字节
byte[] getBytes(); //获取文件内容的字节数组
InputStream getInputStream(); //获取接收到的文件内容的输入流

重名问题如何解决的方案:保证每次上传文件时文件名都唯一的(使用UUID获取随机文件名

@Slf4j
@RestController
public class UploadController {
@PostMapping("/upload")
public Result upload(String username, Integer age, MultipartFile
image) throws IOException {
log.info("文件上传:{},{},{}",username,age,image);
//获取原始文件名
String originalFilename = image.getOriginalFilename();
//构建新的文件名
String extname =
originalFilename.substring(originalFilename.lastIndexOf("."));//文件
扩展名
String newFileName = UUID.randomUUID().toString()+extname;//
随机名+文件扩展名
//将文件存储在服务器的磁盘目录
image.transferTo(new File("E:/images/"+newFileName));
return Result.success();
 }
}

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

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

6、阿里云OSS

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

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

  • Bucket:存储空间是用户用于存储对象(Object,就是文件)的容器,所有的对象都必须隶属于某个存储空间。
    在Maven项目中加入依赖项(推荐方式):

    //阿里云OSS依赖,导入pom.xml中
    <dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.15.1</version>
    </dependency>

    如果使用的是Java 9及以上的版本,则需要添加JAXB相关依赖。添加JAXB相关依赖示例代码如下:

    <dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
    </dependency>
    <dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1.1</version>
    </dependency>
    <!-- no more than 2.3.3-->
    <dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.3</version>
    </dependency>
  • 引入阿里云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-cnshanghai.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);
    }
    }

7、配置文件

常见配置文件格式对比:

  • 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:
    # key:value
    name: zhangsan
    age: 18
    password: 123456
  • 数组/List/Set集合:
    hobby:
    - java
    - game
    - sport

yml配置

在application.properties中的配置案例相关的配置项

#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url
spring.datasource.url=jdbc:mysql://localhost:3306/tlias
#连接数据库的用户名
spring.datasource.username=root
#连接数据库的密码
spring.datasource.password=1234

#配置mybatis的日志, 指定输出到控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
#开启mybatis的驼峰命名自动映射开关 a_column ------> aCloumn
mybatis.configuration.map-underscore-to-camel-case=true

#配置单个文件上传大小限制
spring.servlet.multipart.max-file-size=10MB
#配置单个请求最大大小的限制 (一次请求中是可以上传多个文件)
spring.servlet.multipart.max-request-size=100MB

#阿里云OSS配置
aliyun.oss.endpoint=https://oss-cn-hangzhou.aliyuncs.com
aliyun.oss.accessKeyId=LTAI4GCH1vX6DKqJWxd6nEuW
aliyun.oss.accessKeySecret=yBshYweHOpqDuhCArrVHwIiBKpyqSL
aliyun.oss.bucketName=web-tlias

在application.yml中的配置案例相关的配置项

spring:
  #数据库连接信息
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/tlias
    username: root
    password: 1234
  #文件上传的配置
  servlet:
    multipart:
      max-file-size: 10MB
      max-request-size: 100MB
#Mybatis配置
mybatis:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: true

#阿里云OSS
aliyun:
  oss:
    endpoint: https://oss-cn-hangzhou.aliyuncs.com
    accessKeyId: LTAI4GCH1vX6DKqJWxd6nEuW
    accessKeySecret: yBshYweHOpqDuhCArrVHwIiBKpyqSL
    bucketName: web-tlias

@ConfigurationProperties

  • Spring提供的简化方式套路:

    1. 需要创建一个实现类,且实体类中的属性名和配置文件当中key的名字必须要一致
      比如:配置文件当中叫endpoints,实体类当中的属性也得叫endpoints,另外实体类当
      中的属性还需要提供 getter / setter方法
    2. 需要将实体类交给Spring的IOC容器管理,成为IOC容器当中的bean对象
      @Component
    3. 在实体类上添加 @ConfigurationProperties 注解,并通过perfect属性来指定配置参数项的前缀
      @ConfigurationProperties可以批量的将外部的属性配置注入到bean对象的属性中。
  • 实体类:AliOSSProperties

import lombok.Data;
import
org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/*阿里云OSS相关配置*/
@Data
@Component
@ConfigurationProperties(prefix = "aliyun.oss")
public class AliOSSProperties {
//区域
private String endpoint;
//身份ID
private String accessKeyId ;
//身份密钥
private String accessKeySecret ;
//存储空间
private String bucketName;
}
  • AliOSSUtils工具类:
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;
@Component //当前类对象由Spring创建和管理
public class AliOSSUtils {
//注入配置参数实体类对象
@Autowired
private AliOSSProperties aliOSSProperties;
/**
* 实现上传图片到OSS
*/
public String upload(MultipartFile multipartFile) throws
IOException {
//获取阿里云OSS参数
String endpoint = aliOSSProperties.getEndpoint();
String accessKeyId = aliOSSProperties.getAccessKeyId();
String accessKeySecret = aliOSSProperties.getAccessKeySecret();
String bucketName = aliOSSProperties.getBucketName();
// 获取上传的文件的输入流
InputStream inputStream = multipartFile.getInputStream();
// 避免文件覆盖
String originalFilename =
multipartFile.getOriginalFilename();
String fileName = UUID.randomUUID().toString() +
originalFilename.substring(originalFilename.lastIndexOf("."));
//上传文件到 OSS
OSS ossClient = new
OSSClientBuilder().build(aliOSSProperties.getEndpoint(),
aliOSSProperties.getAccessKeyId(),
aliOSSProperties.getAccessKeySecret());
ossClient.putObject(aliOSSProperties.getBucketName(),
fileName, inputStream);
//文件访问路径
String url =aliOSSProperties.getEndpoint().split("//")[0] +
"//" + aliOSSProperties.getBucketName() + "." +
aliOSSProperties.getEndpoint().split("//")[1] + "/" + fileName;
// 关闭ossClient
ossClient.shutdown();
return url;// 把上传到oss的路径返回
 }

pom.xml 引入依赖:提示阿里云 OSS 相关的配置项


org.springframework.boot
spring-boot-configuration-processor
来自上海
博客文章均为Ferryman.原创,转载请注明文章地址及作者
如有需要,可通过RSS订阅文章
有任何问题,可以在评论区留言哦~
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇