找回密码
 立即注册
首页 业界区 业界 springMVC-HTTP消息转换器与文件上传、下载、异常处理 ...

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

髭赌 5 小时前
HttpMessageConverter(HTTP消息转换器)

HTTP消息转换器主要是将请求的表单数据封装成对象,controller中的方法直接用对象接收数据。
1.png

HttpMessageConverter接口可以将请求协议转换为Java对象,也可以把Java对象转换为响应协议。
对于程序员来说,springmvc已经帮我们写好了,我们只需要在不同的业务场景下,选择合适的HTTP消息转换器即可。
我们可以使用不同的注解来启用不同的消息转换器。
@ResponseBody

这里使用的消息转换器是:StringHttpMessageConverter
  1. @GetMapping("/ajax")
  2. // @ResponseBody注解表示该方法的返回值直接作为字符串响应体返回,而不是视图名称
  3. @ResponseBody
  4. public String ajax() {
  5.     return "hello ajax";
  6. }
复制代码
直接返回Java对象,(这里使用的消息转换器是MappingJackson2HttpMessageConverter):
  1. @GetMapping("/ajax2")
  2. // @ResponseBody注解表示该方法的返回值直接作为响应体返回,而不是视图名称
  3. @ResponseBody
  4. public User ajax2() {
  5.     return new User("zhangsan", 20, "123456");
  6. }
复制代码
此时要加入jackson-databind依赖才能生效
  1.     <dependency>
  2.         <groupId>com.fasterxml.jackson.core</groupId>
  3.         jackson-databind</artifactId>
  4.         <version>2.20.2</version>
  5.     </dependency>
  6. </dependencies>
复制代码
@RestController

标注在类上,等于@Controller+@ResponseBody
@RequestBody

作用是直接将请求体传递给Java程序,程序中可以直接使用一个String类型的变量来接收。
此注解只能出现在方法的参数上。
使用的消息转换器是FormHttpMessageConverter
  1. @PostMapping("/ajax3")
  2. public String ajax3(@RequestBody String params) {
  3.     System.out.println(params);
  4.     return "hello ajax3";
  5. }
复制代码
如果前端请求体当中提交的数据是JSON格式,那么@RequestBody可以将提交的json格式的字符串转换成Java对象。同样需要使用jackson的依赖
  1. @PostMapping("/ajax4")
  2. @ResponseBody
  3. public String ajax4(@RequestBody User user) {
  4.     System.out.println(user);
  5.     return "hello ajax4";
  6. }
复制代码
RequestEntity类

RequestEntity类的实例封装了整个请求的协议:包括请求行、请求头、请求体的所有信息。
出现在控制器方法的参数上:
  1. @PostMapping("/ajax5")
  2. @ResponseBody
  3. public String ajax5(RequestEntity<User> requestEntity) {
  4.     // 请求方式
  5.     HttpMethod method = requestEntity.getMethod();
  6.     // 请求体
  7.     User user = requestEntity.getBody();
  8.     // 请求头
  9.     HttpHeaders headers = requestEntity.getHeaders();
  10.     // 请求URL
  11.     requestEntity.getUrl();
  12.     // 请求头中的Content-Type
  13.     headers.getContentType();
  14.     return "hello ajax5";
  15. }
复制代码
ResponseEntity类

ResponseEntity类的实例可与封装响应协议,包括状态行、响应头、响应体。如果你想定制属于自己的响应协议,可以使用该类。注意:返回值必须是ResponseEntity,泛型为什么是User。因为响应体的内容是User类型。
比如:
  1. @GetMapping("ajax6/{id}")
  2. public ResponseEntity<User> ajax6(@PathVariable("id") String id) {
  3.     User user =userService.getUserById(id);
  4.     if (user == null) {
  5.         return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null);
  6.     }else{
  7.         return ResponseEntity.ok(user);
  8.     }
  9. }
复制代码
文件上传与下载

文件上传

添加以下依赖(SpringMVC6不需要添加依赖):
  1. <dependency>
  2.     <groupId>commons-fileupload</groupId>
  3.     commons-fileupload</artifactId>
  4.     <version>1.5</version>
  5. </dependency>
复制代码
文件上传必须是post请求
文件上传呢的form标签中必须使用enctype="multipart/form-data"
enctype是用来设置请求头的,默认是application/x-www-form-urlencoded
  1.     <servlet>
  2.         <servlet-name>springmvc</servlet-name>
  3.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  4.         <init-param>
  5.             <param-name>contextConfigLocation</param-name>
  6.             <param-value>classpath:springmvc.xml</param-value>
  7.         </init-param>
  8.         <load-on-startup>0</load-on-startup>
  9.         <multipart-config>
  10.             <max-file-size>102400</max-file-size>
  11.             <max-request-size>1024000</max-request-size>
  12.             <file-size-threshold>0</file-size-threshold>
  13.         </multipart-config>
  14.     </servlet>
复制代码
重点:在web.xml文件中DispatcherServlet配置时,添加multipart-config配置信息。(这是spring6的配置,如果是以前的版本。则不是这样配置)
前端代码:
  1. <form th:action="@{/file-upload}" method="post" enctype="multipart/form-data">
  2.     <input type="file" name="file"/>
  3.     <button type="submit">上传</button>
  4. </form>
复制代码
后端代码:
  1. @PostMapping("/file-upload")
  2. public String file(@RequestParam("file") MultipartFile file) throws IOException {
  3.     // 获取参数名
  4.     String name = file.getName();
  5.     // 获取文件大小
  6.     long size = file.getSize();
  7.     // 获取文件类型
  8.     String contentType = file.getContentType();
  9.     // 获取原始文件名
  10.     String originalFilename = file.getOriginalFilename();
  11.     // 获取文件输入流
  12.     InputStream inputStream = file.getInputStream();
  13.     // 创建一个缓冲输入流对象,用于读取文件内容
  14.     BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
  15.     // 创建一个新的文件名,使用当前时间戳加上原始文件的扩展名
  16.     String newName = System.currentTimeMillis() + originalFilename.substring(originalFilename.lastIndexOf("."));
  17.     String path = "D:/" + newName;
  18.     // 创建一个缓冲输出流对象,用于将文件内容写入到指定路径
  19.     File file1 = new File(path);
  20.     BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(
  21.             new FileOutputStream(file1)
  22.     );
  23.     byte[] bytes = new byte[1024];
  24.     int length = 0;
  25.     // 循环读取文件内容,并将其写入到指定路径
  26.     while ((length = bufferedInputStream.read(bytes)) != -1) {
  27.         bufferedOutputStream.write(bytes, 0, length);
  28.     }
  29.     bufferedOutputStream.flush();
  30.     // 关闭输入流和输出流
  31.     bufferedInputStream.close();
  32.     bufferedOutputStream.close();
  33.     return "ok";
  34. }
复制代码
文件下载

前端代码:
  1. 文件下载
复制代码
后端代码:
  1. @GetMapping("/download")
  2. public ResponseEntity<byte[]> download() throws IOException {
  3.     // 读取文件内容
  4.     File file = new File("D:/xxx.jpg");
  5.     // 创建一个HttpHeaders对象,用于设置响应头信息
  6.     HttpHeaders headers = new HttpHeaders();
  7.     // 设置响应头中的Content-Type为application/octet-stream,表示下载文件的类型为二进制流
  8.     headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
  9.     // 设置响应头中的Content-Disposition为attachment,表示下载文件的方式为附件,并指定下载文件的名称为原始文件名
  10.     headers.setContentDispositionFormData("attachment", file.getName());
  11.     // 创建一个ResponseEntity对象,包含文件内容、响应头信息和HTTP状态码,并返回给客户端
  12.     ResponseEntity<byte[]> builder = new ResponseEntity<byte[]>(Files.readAllBytes(file.toPath()), headers, HttpStatus.OK);
  13.     return builder;
  14. }
复制代码
异常处理器

异常处理器的作用:处理器方法执行过程中出现了异常,跳转到对应的视图。在视图上展示友好信息。
核心接口:HandlerExceptionResolver。核心方法是resolveException,最终返回的ModelAndView视图对象。会跳转到指定页面。
HandlerExceptionResolver有2个常用的默认实现:
DefaultHandlerExceptionResolver 默认的异常处理器
SimpleHandlerExceptionResolver 自定义异常处理器
自定义异常处理器

自定义异常处理器需要使用:SimpleHandlerExceptionResolver
自定义异常处理器机制的两种方式:

  • 通过xml配置
  • 通过注解
配置文件方式

在springmvc.xml文件中添加如下配置
  1.     <bean >
  2.         <property name="exceptionMappings">
  3.             <props>
  4.                
  5.                 <prop key="java.lang.ArithmeticException">error</prop>
  6.             </props>
  7.         </property>
  8.          
  9.         <property name="exceptionAttribute" value="ex"/>
  10.     </bean>
复制代码
注解方式
  1. @ControllerAdvice
  2. public class ExceptionController {
  3.     @ExceptionHandler
  4.     public String handleException(Exception e, Model model) {
  5.         model.addAttribute("ex", e.getMessage());
  6.         System.out.println("发生了异常:" + e.getMessage());
  7.         return "error";
  8.     }
  9. }
复制代码
控制器类使用@ControllerAdvice标注
具体的方法使用@ExceptionHandler标注

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册