springmvc(5)

  • Post author:
  • Post category:其他


今晚我们来继续复习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(删除)文件上传,文件下载。



版权声明:本文为weixin_55604133原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。