HttpMessageConverter
概述
1、HttpMessageConverter,报文信息转换器,将请求报文转换为 Java 对象,或将 Java 对象转换为响应报文
2、两个注解,将请求报文转换为 Java 对象:@RequestBody,@ResponseBody
3、两个类型,将 Java 对象转换为响应报文:RequestEntity、ResponseEntity
@RequestBody
1、获取请求体,需要在控制器方法设置一个形参,使用 @RequestBody 进行标识,当前请求的请求体就会为当前注解所标识的形参赋值
2、示例
(1).html 表单
<form th:action="@{/testRequestBody}" method="post">
用户名:<input type="text" name="username"><br/>
密码:<input type="password" name="password"><br/>
<input type="submit" value="测试@RequestBody">
</form>
(2)控制器方法
@RequestMapping("/testRequestBody")
public String testRequestBody(@RequestBody String requestBody) {
System.out.println(requestBody);
return "success";
}
(3)控制台输出:username=表单输入内容&password=表单输入内容,跳转到 success.html
RequestEntity
1、封装请求报文的一种类型,需要在控制器方法的形参中,设置该类型的形参,当前请求的请求报文就会赋值给该形参
2、方法
(1)getHeaders():获取请求头信息
(2)getBody():获取请求体信息
3、示例
(1).html 表单
<form th:action="@{/testRequestEntity}" method="post">
用户名:<input type="text" name="username"><br/>
密码:<input type="password" name="password"><br/>
<input type="submit" value="测试RequestEntity">
</form>
(2)控制器方法
@RequestMapping("/testRequestEntity")
public String testRequestEntity(RequestEntity<String> requestEntity) {
System.out.println(requestEntity.getHeaders());
System.out.println(requestEntity.getBody());
return "success";
}
(3)控制台输出请求头、请求体,跳转到 success.html
@ResponseBody
1、用于标识一个控制器方法,可以将该方法的返回值,直接作为响应报文的响应体响应到浏览器
2、示例 1:响应字符串
(1).html 超链接
<a th:href="@{/testResponseBody}">通过@ResponseBody响应浏览器数据</a>
(2)控制器方法
@RequestMapping("/testResponseBody")
@ResponseBody
public String testResponseBody() {
return "success";
}
(3)跳转到 /testResponseBody,获取响应体 "success"
3、SpringMVC 处理 JSON
(1)若直接响应对象,则报错;解决:转换成 JSON 对象响应
(2)引入 jackson 依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.13.3</version>
</dependency>
(3)SpringMVC 配置文件,开启注解驱动,此时在 HandlerAdaptor 中会自动装配一个消息转换器:Mappinglackson2HttpMessageConverter,可以将响应到浏览器的 Java 对象转换为 JSON 格式的字符串
<mvc:annotation-driven/>
(4)控制器方法上使用 @ResponseBody 注解进行标识
(5)控制器方法中,将 Java 对象直接返回,会自动转换为 JSON 格式的字符串
@RestController
1、SpringMVC 提供的一个复合注解
2、标识在控制器的类上
3、等价于为类添加 @Controller,且为其中的每个方法添加 @ResponseBody
ResponseEntity
1、用于控制器方法的返回值类型,该控制器方法的返回值就是响应到浏览器的响应报文
2、下载文件(示例)
@RequestMapping("/testDownload")
public ResponseEntity<byte[]> testDownload(HttpSession session) throws IOException {
//获取ServletContext对象
ServletContext context = session.getServletContext();
//获取服务器中文件的真实路径
String realPath = context.getRealPath("/file/下载文件.jpg");
//创建输入流
InputStream is = new FileInputStream(realPath);
//创建字节数组
byte[] bytes = new byte[is.available()];
//字节数组读取流
byte[] bytes = readFile(realPath);
//创建HttpHeaders对象,设置响应头信息
MultiValueMap<String, String> headers = new HttpHeaders();
//设置下载方式、下载文件名
//Content-Disposition:当用户想把请求所得的内容存为一个文件的时候提供一个默认的文件名
//attachment:附件形式
headers.set("Content-Disposition", "attachment;filename=下载文件.jpg");
//设置响应状态码
HttpStatus status = HttpStatus.OK;
//创建ResponseEntity对象,响应实体
ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes, headers, status);
//关闭输入流
is.close();
return responseEntity;
}
3、上传文件(示例)
(1)要求 form 表单的请求方式必须为 post,并且添加属性 enctype="multipart/form-data"
<form th:action="@{/testUpload}" method="post" enctype="multipart/form-data">
文件:<input type="file" name="uploadFile"/><br/>
<input type="submit" value="上传"/>
</form>
(2)导入 commons-fileupload 依赖
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
(3)配置文件上传解析器
<!-- 添加CommonsMultipartResolver依赖注入,将上传文件自动封装为MutilpartFile对象,id固定为multipartResolver,否则无法获取 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>
(4)控制器方法
@RequestMapping("/testUpload")
//SpringMVC 将上传的文件封装到 MultipartFile 对象中,对象名必须与html表单的name值相同,通过此对象可以获取文件相关信息
public String testUpload(MultipartFile uploadFile, HttpSession session) throws IOException {
//目标文件名
String srcName = uploadFile.getOriginalFilename();
//提取后缀,即.文件类型
String suffixName = srcName.substring(srcName.lastIndexOf("."));
//采用UUID生成随机序列,避免同名文件
String prefixName = UUID.randomUUID().toString();
String destName = prefixName + suffixName;
//目标路径
ServletContext context = session.getServletContext();
String filePath = context.getRealPath("Folder");
File file = new File(filePath);
//判断目标路径是否存在
if (!file.exists()) {
//若不存在,则创建该目录
file.mkdir();
}
//上传文件到服务器,File.separator:路径分隔符
photo.transferTo(new File(photoPath + File.separator + destName));
return "success";
}
(5)处理同名文件问题
enctype
1、encode type,表示编码类型,规定在发送到服务器之前,应该如何对表单数据进行编码
2、类型 / 值
(1)application/x-www-form-urlencoded:默认值,URL 编码
(2)multipart/form-data:文件类型
(3)text/plain:纯文本格式类型
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战