HttpEntity<T>
HttpEntity是指请求和响应的实体类,包含了消息头和消息体,可以从该类中获取请求头请求体以及响应头响应体信息。
在AnotherController中新增一个httpEntity方法,接收一个HttpEntity类为参数
@RequestMapping("/http_entity") public String httpEntity(HttpEntity<String> str){ System.out.println(str); return "success"; } 复制代码
修改post.jspy页面中的表单的请求地址为/http_entity
<h2>使用表单发送POST请求</h2> <div> <form action="/http_entity" method="post"> <input name="username" value="stark"> <input name="password" value="123456"> <input type="submit"> </form> </div> 复制代码
重新启动该应用,浏览器打开post.jsp页面,点击发送按钮发送表单请求
控制台打印出消息体对象
@ResponseBody、ResponseEntity 与文件下载
该注解会将相应内容放在响应体中
@ResponseBody @RequestMapping("/hello") public String hello(){ return "success"; } 复制代码
访问/ha不会返回success页面,会直接返回字符串success
还可以自定义响应实体,这要求方法返回ResponseEntity
@RequestMapping("/hallo") public ResponseEntity<String> hallo(){ // 定义响应请求头 MultiValueMap<String, String> headers =new HttpHeaders(); // 定义响应体 String body = "<h2>SUCCESS</h2>"; headers.add("Set-Cookie", "username=stark"); // 返回响应实体类 return new ResponseEntity<>(body, headers, HttpStatus.OK); } 复制代码
重新启动应用,浏览器输入/hallo,页面显示了SUCCESS
自定义的cookie响应码等生效。
ResponseEntity还可以应用到文件下载中,AnotherController方法中新增方法download
@RequestMapping("/download") public ResponseEntity<byte[]> download(HttpServletRequest request) throws IOException { // 1.得到要下载的流 // 找到要下载文件的真实路径 ServletContext context = request.getServletContext(); String realPath = context.getRealPath("/js/jquery-1.9.1.min.js"); FileInputStream is = new FileInputStream(realPath); byte[] tmp = new byte[is.available()]; is.read(tmp); is.close(); // 2.将要下载的文件返回 HttpHeaders header = new HttpHeaders(); header.set("Content-Disposition","attachment;filename="+"jquery-1.9.1.min.js"); ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(tmp, header, HttpStatus.OK); return responseEntity; } 复制代码
重启tomcat,浏览器输入http://localhost:8080/download, 会自动下载指定的文件
二、文件上传
Spring MVC 为文件上传提供了直接的支持,这种支持是通过即插即用的MultipartResolver实现的,Spring是用Jakarta Commons FileUpload技术实现了一个MultipartResolver的实现类CommonsMultipartResolver
文件上传需要导入commons-fileupload和commons-io两个包,在pom文件中添加依赖
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.11.0</version> </dependency> 复制代码
将导入的包放入 lib 文件夹下
在index.jsp同级目录下新建一个upload.jsp页面,新建文件上传表单
<h2>文件上传表单</h2> <div> <form action="/upload" method="post" enctype="multipart/form-data"> 用户头像:<input type="file" name="headimg" /> 用户名:<input type="text" name="username" /> <input type="submit"> </form> </div> 复制代码
文件上传表单一定要设置enctype属性且value为multipart/form-data,将请求体中的文件分段发送到服务器端
Spring MVC文件上传需要在Spring MVC配置文件上配置上传解析器CommonsMultpartResolver,否则无法解析文件上传请求,会出现http 400的报错
<!--配置文件上传解析器--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="#{1024*1024*20}" /> <property name="defaultEncoding" value="utf-8" /> </bean> 复制代码
- defaultEncoding:必须和用户的JSP的pageEncoding属性一致,以便正确解析表单内容
- maxUploadSize:设置文件上传的大小,可以根据上传文件适当设置
新增一个UploadController,用于处理文件上传
@Controller public class UploadController { @RequestMapping("/upload") public String upload(@RequestParam(value = "username", required = false) String username, @RequestParam("headimg")MultipartFile file, Model model){ System.out.println("上传文件表单中文件属性的名称:" + file.getName()); System.out.println("上传文件请求中文件的名称:" + file.getOriginalFilename()); System.out.println("上传文件请求中username的值为:" + username); // 上传文件 try { file.transferTo(new File("/Users/jingnan/Practice/spring-mvc-ajax/" + file.getOriginalFilename())); model.addAttribute("msg", "文件上传成功"); } catch (IOException e) { model.addAttribute("msg","文件上传失败" + e.getMessage()); } return "forward:/upload.jsp"; } } 复制代码
使用Spring MVC进行上传文件非常方便,调用transferTo方法即可完成上传文件的操作
在upload.jsp文件中显示文件上传是否成功的提示
<h2>文件上传表单</h2> ${msg} <div> <!--文件上传表单保持不变--> </div> 复制代码
重新启动应用,浏览器输入http://localhost:8080/upload.jsp, 进入文件上传界面并输入文件上传的表单内容
点击提交按钮
页面显示出文件上传成功的消息提示
并且控制台打印出了文件上传表单的内容以及表单属性信息
多文件上传
修改上传文件表单
<h2>文件上传表单</h2> ${msg} <div> <form action="/uploads" method="post" enctype="multipart/form-data"> 图片:<input type="file" name="headimg" /> <br> 图片1:<input type="file" name="headimg" /> <br> 图片2:<input type="file" name="headimg" /> <br> 图片3:<input type="file" name="headimg" /> <br> 图片4:<input type="file" name="headimg" /> <br> 用户名:<input type="text" name="username" /> <input type="submit"> </form> </div> 复制代码
在UploadController中新增一个方法uploads,处理多文件上传 参数中通过Mulpart数组来接收前端的多文件
@RequestMapping("/uploads") public String uploads(@RequestParam(value = "username", required = false) String username, @RequestParam("headimg")MultipartFile[] files, Model model){ for (MultipartFile file : files) { System.out.println("上传文件表单中文件属性的名称:" + file.getName()); System.out.println("上传文件请求中文件的名称:" + file.getOriginalFilename()); // 保存文件 try { file.transferTo(new File("/Users/jingnan/Practice/spring-mvc-ajax/" + file.getOriginalFilename())); model.addAttribute("msg", "文件上传成功"); } catch (IOException e) { model.addAttribute("msg","文件上传失败" + e.getMessage()); } } System.out.println("上传文件请求中username的值为:" + username); return "forward:/upload.jsp"; } 复制代码
重新启动应用,浏览器打开upload.jsp页面
表单中输入内容,并点击提交
页面提示文件上传成功
后端控制台中也打印出了上传文件的信息