SpringBoot数据处理-1
大约 7 分钟
返回图像流
返回图像流
- 在 WEB 项目运行中,除了返回 WEB 中的静态图片资源之外,也可以利用 Action 处理程序根据请求需要动态的加载指定目录中的图片或生成动态图片,为了便于图片数据的输出可以将响应数据封装在 Bufferedlmage 类的对象实例之中,而后利用 Action 类提供的业务处理方法进行图片响应

1、
package com.yootk.action;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
@RestController // 直接响应处理
@RequestMapping("/data/*")
public class ImageAction {
@GetMapping(value = "image", produces = {MediaType.IMAGE_JPEG_VALUE, MediaType.IMAGE_GIF_VALUE, MediaType.IMAGE_PNG_VALUE})
public BufferedImage createImageData() throws Exception { // 进行图像创建
Resource imageResource = new ClassPathResource("/images/muyan_yootk_share.png"); // 资源加载
return ImageIO.read(imageResource.getInputStream()); // 实现了文件加载
}
}
2、
package com.yootk.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.BufferedImageHttpMessageConverter;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.List;
@Configuration
public class WebConfig implements WebMvcConfigurer { // 配置类
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(new BufferedImageHttpMessageConverter()); // 图像转换
}
}
3、
http://localhost:8080/data/image
返回视频流
视频流
- 在 HTML5 后为方便的实现视频控制功能提供有“<\video>”标签,只要开发者设置正确的视频源链接即可实现视频的播放控制,而对于播放的视频可能是静态的视频,也有可能是经过程序处理之后的动态视频,在 SpringBoot 框架中提供了方便的视频资源请求处理机制,开发者只需要继承“ResourceHttpRequestHandler”父类,随后根据请求设置正确的资源路径即可方便将服务器端的视频资源以二进制数据流的形式发送给客户端浏览器。

1、
package com.yootk.config.handler;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.resource.ResourceHttpRequestHandler;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
@Component
public class VideoResourceHttpRequestHandler extends ResourceHttpRequestHandler { // 请求处理器
@Override
protected Resource getResource(HttpServletRequest request) throws IOException {
return new ClassPathResource("/videos/muyan.mp4");
}
}
2、
package com.yootk.action;
import com.yootk.config.handler.VideoResourceHttpRequestHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@RestController // 直接响应
@RequestMapping("/data/*")
public class VideoAction {
@Autowired
private VideoResourceHttpRequestHandler videoResourceHttpRequestHandler;
@GetMapping("video")
public void createVideoData(HttpServletRequest request, HttpServletResponse response) throws Exception {
this.videoResourceHttpRequestHandler.handleRequest(request, response);
}
}
http://localhost:8080/data/video
文件下载
二进制文件下载
- 每一个项目都可能会根据不同的业务需要保存有大量的程序文件,这些文件不仅仅局限于图片与视频,还有可能是任意的二进制文件,这就需要根据用户的需求获取相应的资源并进行强制性的下载处理

1、
package com.yootk.action;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
@RestController
@RequestMapping("/data/*")
public class DownloadAction { // 文件下载
@GetMapping("download")
public void fileDownload(HttpServletResponse response) throws Exception {
response.setContentType("application/force-download"); // 强制性下载
response.setHeader("Content-Disposition", "attachement;filename=muyan.rar");
Resource fileResource = new ClassPathResource("/files/yootk.com.rar"); // 要下载的文件
// 要通过IO流读取文件内容,随后一点点进行文件下载操作
InputStream input = fileResource.getInputStream(); // 获取资源输入流
byte data[] = new byte[1024]; // 每次读取1024字节
int len = 0; // 每次读取的个数
while ((len = input.read(data)) != -1) {
response.getOutputStream().write(data, 0, len);
}
}
}
http://localhost:8080/data/download
属性定义与注入
资源配置与注入
- 在项目开发中为了程序配置的方便,往往会通过资源文件的方式定义所需的程序属性内容,而在 SpringBoot 中开发者可以在“src/main/resources”目录中定义默认的资源文件“application.yml”,并在里面编写相应的配置属性,随后就可以在程序中进行资源注入处理

- YAML(YAML Ain'taMarkupLanguage)配置文件通常以“*,ym!”为文件后缀,但是其并不属于一种标记语言,而是一种直观的能够被电脑识别的数据序列化格式,经常应用于程序或软件配置操作,在 SpringBoot 开发中会大量的利用相关组件依赖并结合 yml 文件实现服务的整合配置。
1、
source: # 是一个自定义的KEY名称
mysql: mysql://localhost:3306/yootk # 自定义的信息(KEY = source.mysql、value = 内容)
redis: redis://localhost:6379/0 # 自定义配置信息
messages: 沐言科技:www.yootk.com,李兴华高薪就业编程训练营:edu.yootk.com
infos: "{'yootk': 'www.yootk.com', 'teacher': '李兴华'}" # Map集合
2、
package com.yootk.action;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/source/*")
public class SourceAction { // 文件下载
@Value("${source.mysql}")
private String mysql;
@Value("${source.redis}")
private String redis;
@Value("${source.messages}")
private List<String> messages;
@Value("#{${source.infos}}") // 通过SpEL表达式来进行数据的处理
private Map<String, String> infos;
@GetMapping("show")
public Object show() {
Map<String, Object> info = new HashMap<>();
info.put("mysql", this.mysql);
info.put("redis", this.redis);
info.put("messages", this.messages);
info.put("infos", this.infos);
return info;
}
}
3、localhost:8080/source/show
@ConfigurationProperties
自动注解配置
- 在 SpringBoot 开发框架中除了保留有原始的 Spring 资源注入管理之外,还针对于 yam 数据结构定义的需要扩充了新的支持,可以在一个类中利用“@ConfigurationProperties”注解实现资源名称的自动匹配以及内容注入操作

1、
muyan: # 这是一个开始的KEY标记
mysql: mysql://localhost:3306/yootk
redis: redis://localhost:6379/0
messages: # 在Spring里面List和数组是对等的关系
- 沐言科技:www.yootk.com
- 李兴华高薪就业编程训练营:edu.yootk.com
books: # Map的形式进行的配置
javaBase: 《Java面向对象就业编程实战》
javaApplication: 《Java应用技术就业编程实战》
javaWEB: 《JavaWEB就业编程实战》
springBoot: 《SpringBoot就业编程实战》
springCloud: 《SpringCloud就业编程实战》
2、
package com.yootk.vo;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
@Data
@ConfigurationProperties("muyan") // 配置了注入KEY的头部定义
@Component
public class Source {
private String mysql; // 属性名称为key名称
private String redis;
private List<String> messages;
private Map<String, String> books;
}
3、
package com.yootk.action;
import com.yootk.vo.Source;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/source/*")
public class SourceAction { // 文件下载
@Autowired
private Source source;
@GetMapping("show")
public Object show() {
return this.source;
}
}
4、localhost:8080/source/shows
注入对象数据
注入对象实例
- 使用“@ConfigurationProperties”注解进行注入时,可以方便的匹配属性名称,而后实现自动转型注入,则在项目中也可以基于同样的机制实现自定义对象的注入管理

1、
package com.yootk.vo;
import lombok.Data;
@Data
public class Company {
private Long cid;
private String cname;
}
2、
package com.yootk.vo;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
@Data
@ConfigurationProperties(prefix = "object")
@Component
public class Dept {
private Long deptno;
private String dname;
private Company company; // 关联结构
private List<Emp> emps;
}
3、
package com.yootk.vo;
import lombok.Data;
public class Emp {
private Long empno;
private String ename;
private String job;
}
4、
object: # 配置的前缀
deptno: 10
dname: 教学研发部
company: # 关联的其他类的引用
cid: 1009
cname: 沐言科技
emps:
- emp:
empno: 7369
ename: Smith
job: 办事员
- emp:
empno: 7566
ename: Allen
job: 部门经理
- emp:
empno: 7839
ename: king
job: 董事长
5、
package com.yootk.action;
import com.yootk.common.action.abs.AbstractBaseAction;
import com.yootk.vo.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController // 直接基于Rest架构进行处理,省略了@ResponseBody注解
@RequestMapping("/dept/*") // 添加父路径
public class DeptAction extends AbstractBaseAction { // 控制层的实现类
@Autowired
private Dept dept;
@RequestMapping("get") // 子路径
public Object get() { // 进行请求参数的接收以及请求内容的回应
return this.dept;
}
}
6、
localhost:8080/dept/get
7、
object: # 配置的前缀
deptno: 10
dname: 教学研发部
company: # 关联的其他类的引用
cid: 1009
cname: 沐言科技
emps[0]:
empno: 7369
ename: Smith
job: 办事员
emps[1]:
empno: 7566
ename: Allen
job: 部门经理
emps[2]:
empno: 7839
ename: king
job: 董事长
自定义注入配置文件
自定义资源文件
- 在 SpringBoot 项目开发中,,application.yml 是整个 SpringBoot 项目配置的核心文件而如果将所有的对象注入信息全部配置在此文件中,则有可能造成配置文件过长的问题在 SprinqBoot 中可以继续使用 Spring 开发框架提供的资源注入管理的操作机制,将所需要的注入属性定义在单独“*.properties”文件之中,而后只需要在类声明时使用“@PropertySource”注解引用即可

1、
object.deptno=10
object.dname=教学研发部
object.company.cid=1099
object.company.cname=沐言科技
object.emps[0].empno=7369
object.emps[0].ename=Smith
object.emps[0].job=办事员
object.emps[1].empno=7566
object.emps[1].ename=Allen
object.emps[1].job=部门经理
object.emps[2].empno=7839
object.emps[2].ename=King
object.emps[2].job=首席执行官
2、
package com.yootk.vo;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
import java.util.List;
@Data
@PropertySource(value = "classpath:muyan.properties", encoding = "UTF-8")
@ConfigurationProperties(prefix = "object")
@Component
public class Dept {
private Long deptno;
private String dname;
private Company company; // 关联结构
private List<Emp> emps;
}
3、http://localhost:8080/dept/get
demo
