springMVC-HTTP消息转换器与文件上传、下载、异常处理

springMVC-HTTP消息转换器与文件上传、下载、异常处理 这里使用的消息转换器是StringHttpMessageConverterGetMapping(/ajax) // ResponseBody注解表示该方法的返回值直接作为字符串响应体返回而不是视图名称 ResponseBody public String ajax() { return hello ajax; }直接返回Java对象这里使用的消息转换器是MappingJackson2HttpMessageConverterGetMapping(/ajax2) // ResponseBody注解表示该方法的返回值直接作为响应体返回而不是视图名称 ResponseBody public User ajax2() { return new User(zhangsan, 20, 123456); }此时要加入jackson-databind依赖才能生效!-- 负责将Java对象转换为JSON格式或者将JSON格式的数据转换为Java对象。 它提供了丰富的功能和灵活的配置选项使得在Java应用程序中处理JSON数据变得非常方便。-- dependency groupIdcom.fasterxml.jackson.core/groupId artifactIdjackson-databind/artifactId version2.20.2/version /dependency /dependenciesRestController标注在类上等于ControllerResponseBodyRequestBody作用是直接将请求体传递给Java程序程序中可以直接使用一个String类型的变量来接收。此注解只能出现在方法的参数上。使用的消息转换器是FormHttpMessageConverterPostMapping(/ajax3) public String ajax3(RequestBody String params) { System.out.println(params); return hello ajax3; }如果前端请求体当中提交的数据是JSON格式那么RequestBody可以将提交的json格式的字符串转换成Java对象。同样需要使用jackson的依赖PostMapping(/ajax4) ResponseBody public String ajax4(RequestBody User user) { System.out.println(user); return hello ajax4; }RequestEntity类RequestEntity类的实例封装了整个请求的协议包括请求行、请求头、请求体的所有信息。出现在控制器方法的参数上PostMapping(/ajax5) ResponseBody public String ajax5(RequestEntityUser requestEntity) { // 请求方式 HttpMethod method requestEntity.getMethod(); // 请求体 User user requestEntity.getBody(); // 请求头 HttpHeaders headers requestEntity.getHeaders(); // 请求URL requestEntity.getUrl(); // 请求头中的Content-Type headers.getContentType(); return hello ajax5; }ResponseEntity类ResponseEntity类的实例可与封装响应协议包括状态行、响应头、响应体。如果你想定制属于自己的响应协议可以使用该类。注意返回值必须是ResponseEntity,泛型为什么是User。因为响应体的内容是User类型。比如GetMapping(ajax6/{id}) public ResponseEntityUser ajax6(PathVariable(id) String id) { User user userService.getUserById(id); if (user null) { return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null); }else{ return ResponseEntity.ok(user); } }文件上传与下载文件上传添加以下依赖SpringMVC6不需要添加依赖dependency groupIdcommons-fileupload/groupId artifactIdcommons-fileupload/artifactId version1.5/version /dependency文件上传必须是post请求文件上传呢的form标签中必须使用enctypemultipart/form-dataenctype是用来设置请求头的默认是application/x-www-form-urlencoded!-- 前端控制器-- servlet servlet-namespringmvc/servlet-name servlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-class init-param param-namecontextConfigLocation/param-name param-valueclasspath:springmvc.xml/param-value /init-param load-on-startup0/load-on-startup multipart-config !-- 设置单个文件的最大大小单位为字节。超过这个大小的文件将被拒绝上传。-- max-file-size102400/max-file-size !-- 设置整个表单的最大大小单位为字节。这个值包括所有文件和表单数据的总和。超过这个大小的请求将被拒绝。-- max-request-size1024000/max-request-size !-- 设置最小的文件大小单位为字节。小于这个大小的文件将被拒绝上传。-- file-size-threshold0/file-size-threshold /multipart-config /servlet重点在web.xml文件中DispatcherServlet配置时添加multipart-config配置信息。这是spring6的配置如果是以前的版本。则不是这样配置前端代码form th:action{/file-upload} methodpost enctypemultipart/form-data input typefile namefile/ button typesubmit上传/button /form后端代码PostMapping(/file-upload) public String file(RequestParam(file) MultipartFile file) throws IOException { // 获取参数名 String name file.getName(); // 获取文件大小 long size file.getSize(); // 获取文件类型 String contentType file.getContentType(); // 获取原始文件名 String originalFilename file.getOriginalFilename(); // 获取文件输入流 InputStream inputStream file.getInputStream(); // 创建一个缓冲输入流对象用于读取文件内容 BufferedInputStream bufferedInputStream new BufferedInputStream(inputStream); // 创建一个新的文件名使用当前时间戳加上原始文件的扩展名 String newName System.currentTimeMillis() originalFilename.substring(originalFilename.lastIndexOf(.)); String path D:/ newName; // 创建一个缓冲输出流对象用于将文件内容写入到指定路径 File file1 new File(path); BufferedOutputStream bufferedOutputStream new BufferedOutputStream( new FileOutputStream(file1) ); byte[] bytes new byte[1024]; int length 0; // 循环读取文件内容并将其写入到指定路径 while ((length bufferedInputStream.read(bytes)) ! -1) { bufferedOutputStream.write(bytes, 0, length); } bufferedOutputStream.flush(); // 关闭输入流和输出流 bufferedInputStream.close(); bufferedOutputStream.close(); return ok; }文件下载前端代码a th:href{/download}文件下载/a后端代码GetMapping(/download) public ResponseEntitybyte[] download() throws IOException { // 读取文件内容 File file new File(D:/xxx.jpg); // 创建一个HttpHeaders对象用于设置响应头信息 HttpHeaders headers new HttpHeaders(); // 设置响应头中的Content-Type为application/octet-stream表示下载文件的类型为二进制流 headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); // 设置响应头中的Content-Disposition为attachment表示下载文件的方式为附件并指定下载文件的名称为原始文件名 headers.setContentDispositionFormData(attachment, file.getName()); // 创建一个ResponseEntity对象包含文件内容、响应头信息和HTTP状态码并返回给客户端 ResponseEntitybyte[] builder new ResponseEntitybyte[](Files.readAllBytes(file.toPath()), headers, HttpStatus.OK); return builder; }异常处理器异常处理器的作用处理器方法执行过程中出现了异常跳转到对应的视图。在视图上展示友好信息。核心接口HandlerExceptionResolver。核心方法是resolveException最终返回的ModelAndView视图对象。会跳转到指定页面。HandlerExceptionResolver有2个常用的默认实现DefaultHandlerExceptionResolver 默认的异常处理器SimpleHandlerExceptionResolver 自定义异常处理器自定义异常处理器自定义异常处理器需要使用SimpleHandlerExceptionResolver自定义异常处理器机制的两种方式通过xml配置通过注解配置文件方式在springmvc.xml文件中添加如下配置!-- 配置自定义异常处理器-- bean classorg.springframework.web.servlet.handler.SimpleMappingExceptionResolver property nameexceptionMappings props !-- 这里可以配置很多种异常只要发生异常就会跳转到对应界面 配置异常类型和视图名称的映射关系-- prop keyjava.lang.ArithmeticExceptionerror/prop /props /property !-- 将当前发生的异常对象存储到request域中属性名为ex 可以在error.html页面中通过${ex}获取异常对象-- property nameexceptionAttribute valueex/ /bean注解方式ControllerAdvice public class ExceptionController { ExceptionHandler public String handleException(Exception e, Model model) { model.addAttribute(ex, e.getMessage()); System.out.println(发生了异常 e.getMessage()); return error; } }