今晚我们来继续复习springmvc吧
给自己鼓励吧、打打鸡血,加油一个转行的人
支持Restful 风格支持
请求地址 :
• 每个实体需要有唯一的地址URL /user/1001
• 所有的实体 /users
请求方法: GET(获取信息) POST(发送信息,新增) PUT(修改信息) DELETE(删除) PATCH TRACE
springmvc的支持
• @RestController 默认所有的方法返回json对象
• @GetMapping /@PostMapping / @PutMapping /@DeleteMapping
• @PathVariable 路径变量
• @RequestBody 请求体
同时用postman测试:
srpingmvc还支持了文件上传和文件下载
文件上传
需求:实现文件上传。
步骤1:创建upload.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>测试文件上传</title>
</head>
<body>
<form th:action="@{/upload}" method="post" enctype="multipart/form-data">
用户名:<input type="text" name="username" ><br>
密码:<input type="password" name="password" ><br>
文件上传:<input type="file" name="upload" id="upload"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
步骤2:修改springmvc.xml
<!--配置文件解析器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--使用spEL设置文件上传最大尺寸-->
<property name="maxUploadSize" value="#{1024*1024*100}"/>
</bean>
步骤3:修改TestController.java
/**
* 测试文件上传
* 文件上传后存放的位置:web服务器中,本地文件系统中,第三方文件服务器中
* web服务器:
* 需要借助于servlet-api实现,因为要获取项目在服务器中的路径,参数中需要传入HttpServletRequest
* 本地文件系统:
* 直接使用本地路径即可
* 第三方文件服务器:阿里云(要收费)、七牛云(免费10G)等
* 需要整合第三方依赖(自行查阅相关资料)
* @param upload :上传文件名称,必须与<input type="file"/>标签中的name属性值相等
* @return
*/
@RequestMapping("upload")
public String testUpload(User user,MultipartFile upload) throws IOException {
System.out.println(user);
//设置文件上传后的存放路径
//1、存放在tomcat中
// String path = request.getSession().getServletContext().getRealPath("/uploads");
//2、存放在本地文件系统中
String path="D:/uploads".replace("/",File.separator);
File file=new File(path);
if (!file.exists()) {
file.mkdirs();
}
String fileName = upload.getOriginalFilename();
//避免文件同名,使用UUID+系统时间对文件名进行处理
String uuid = UUID.randomUUID().toString().replace("-", "");
long currentTimeMillis = System.currentTimeMillis();
String uploadFileName=uuid+currentTimeMillis+fileName;
try {
//执行上传操作
upload.transferTo(new File(path,uploadFileName));
System.out.println("上传成功");
return "success";
} catch (IOException e) {
e.printStackTrace();
System.out.println("上传失败");
return "error";
}
}
文件下载
如果希望所有文件都进行下载,需要设置响应头Content-Disposition属性:
Content-Disposition=”attachment;filename=下载后生成的文件名”
pring MVC提供了ResponseEntity类,用于将响应头信息、响应状态码与响应实体封装到一起,可以使用ResponseEntity类实现对
Content-Disposition
属性的设置。
步骤1:在D:/uploads目录中创建文件
步骤2:创建download.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>测试文件下载</title>
</head>
<body>
<a th:href="@{/download/学员的自我修养/txt}">学员的自我修养</a>
</body>
</html>
步骤3:修改TestController.java
@GetMapping("download/{filename}/{filetype}")
public ResponseEntity download(@PathVariable("filename") String filename,
@PathVariable("filetype")String filetype) throws IOException {
String downloadFileName=filename+"."+filetype;
String path="D:/uploads".replace("/",File.separator);
File downloadFile=new File(path,downloadFileName);
//创建HttpHeaders对象,向响应头中添加Content-Disposition属性
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Disposition", "attchement;filename=" + URLEncoder.encode(downloadFile.getName(),"UTF-8"));//文件名编码成utf-8,否则文件名为中文时会乱码
//http请求响应状态码
HttpStatus statusCode = HttpStatus.OK;
//使用FileUtils读取文件并转换为二进制流,得到字节数组
byte[] bytes = FileUtils.readFileToByteArray(downloadFile);
//使用ResponseEntity封装响应头,响应码及字节数组
ResponseEntity<byte[]> entity = new ResponseEntity<byte[]>(bytes, headers, statusCode);
//将被ResponseEntity封装的字节数组返回给浏览器,浏览器就会使用附件的形式实现下载
return entity;
}
简单实现方式,不使用ResponseEntity,也可实现同样效果。
@RequestMapping("/download/{filename}/{filetype}")
public void download(@PathVariable("filename")String filename,
@PathVariable("filetype")String filetype,
HttpServletRequest request, HttpServletResponse response) throws IOException {
String downloadFileName = filename + "." + filetype;
String path="D:/uploads".replace("/",File.separator);
File downloadFile = new File(path, downloadFileName);
//设置响应头信息
response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode(downloadFile.getName(),"UTF-8"));
//获取字节输出流
ServletOutputStream os = response.getOutputStream();
//使用commons组件FileUtils读取下载文件获得字节数组
byte[] bytes = FileUtils.readFileToByteArray(downloadFile);
//使用输出将字节数组写到浏览器
os.write(bytes);
//清空输出流
os.flush();
//关闭输出流
os.close();
}
}
总结:复习restful风格get(查询)post(增加)put(更新)delect(删除)文件上传,文件下载。