SpringMVC框架学习笔记(七):处理 json 和 HttpMessageConverter 以及文件的下载和上传

处理 JSON-@ResponseBody

说明: 项目开发中,我们往往需要服务器返回的数据格式是按照 json 来返回的

 下面通过一个案例来演示SpringMVC 是如何处理的

(1) 在web/WEB-INF/lib 目录下引入处理 json 需要的 jar 包,注意 spring5.x 需要使用 jackson-2.9.x.jar 的包(所需jar包以附在文章顶部)

(2) 创建json.jsp,在前端发送一个ajax请求

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>json提交</title><!-- 引入jquery --><script type="text/javascript" src="script/jquery-3.6.0.min.js"></script><!-- 编写jquery代码和ajax请求 --><script type="text/javascript">$(function () {//给id="getJson"绑定点击事件$("#getJson").click(function () {//console.log("ok ....")var url = this.href;var args = {"time": new Date};//这是要发送数据,为了防止页面缓存$.post(url,args,function (data) {//data 就是返回的数据,是json格式=>如果是多个json数据,可以遍历console.log("dataa= ", data);console.log("dog.name=", data.name)console.log("dog.addresss=", data.address)},"json");return false;//这里我们返回false,就不使用href默认机制,即不会跳转}) })</script></head>
<body>
<h1>请求一个json数据</h1>
<%--
1.当用户点击超链接时,我们发出一个ajax请求
2. 接收到请求后,我们查看这个数据
--%>
<a href="<%=request.getContextPath()%>/json/dog" id="getJson">点击获取json数据</a></body>
</html>

 (3)创建JavaBean类 Dog.java

package com.web.json.entity;public class Dog {private String name;private String address;public Dog(String name, String address) {this.name = name;this.address = address;}public Dog() {}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}@Overridepublic String toString() {return "Dog{" +"name='" + name + '\'' +", address='" + address + '\'' +'}';}
}

(4)创建 JsonHandler.java 

package com.web.json;import com.web.json.entity.Dog;
import com.web.json.entity.User;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpSession;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;@Controller
public class JsonHandler {/*** 1. 目标方法 @ResponseBody,表示返回的数据是json格式* 2. springmvc底层根据目标方法上的注解@ResponseBody, 返回指定格式, 根据的http请求来进行处理* 3. 这里springmvc底层使用的是转换器HttpMessageConverter*/@RequestMapping(value = "/json/dog")@ResponseBodypublic Dog getJson() {//返回对象//springmvc会根据你的设置,转成json格式数据返回Dog dog = new Dog();dog.setName("大黄狗");dog.setAddress("小新的家");return dog;}
}

 (5)测试

也可以通过列表返回多个 Json 数据,在 JsonHandler.java 类中添加如下方法

//编写方法,以json格式返回多个Dog
@RequestMapping(value = "/json/dogs")
@ResponseBody
public List<Dog> getJsons() {List<Dog> dogs = new ArrayList<>();dogs.add(new Dog("大黄狗", "小新的家"));dogs.add(new Dog("大黄狗2", "小新2的家"));dogs.add(new Dog("大黄狗3", "小新3的家"));return dogs;
}

 使用postman测试:

 2 处理 JSON-@RequestBody

说明:客户端发送 json 字符串数据给后端, 这时候可以使用 SpringMVC 的 @RequestBody 将客户端提交的 json 数据,封装成 JavaBean 对象

使用案例:

(1)创建javabean类 User.java

package com.web.json.entity;public class User {private String userName;private Integer age;public User(String userName, Integer age) {this.userName = userName;this.age = age;}public User() {}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "User{" +"userName='" + userName + '\'' +", age=" + age +'}';}
}

 (2)在 JsonHandler.java 类中添加如下方法

/*** 1. @RequestBody User user 在形参指定了 @RequestBody* 2. springmvc就会将提交的json字符串数据填充给指定Javabean*/
@RequestMapping(value = "/save2")
@ResponseBody
public User save2(@RequestBody User user) {//将前台传过来的数据 以json的格式返回浏览器System.out.println("user~= " + user);return user;
}

 (3)创建jsp页面发送请求,发送json数据

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>json提交</title><!-- 引入jquery --><script type="text/javascript" src="script/jquery-3.6.0.min.js"></script><!-- 编写jquery代码和ajax请求 --><script type="text/javascript">$(function () {//绑定按钮点击事件, 提交json数据//springmvc 可以在在台将json数据转成对象$("button[name='butt1']").click(function () {//目标:将userName 和 age 封装成json字符串,发送给目标方法var url = "/springmvc/save2";var userName = $("#userName").val();var age = $("#age").val();//将json对象转成json格式字符串var args = JSON.stringify({"userName": userName, "age": age});$.ajax({url: url,data: args,type: "POST",success: function (data) {console.log("返回的data= ", data);},//下面这个contentType参数,是指定发送数据的编码和格式contentType: "application/json;charset=utf-8"})})})</script></head>
<body>
<h1>发出一个json数据</h1>
u:<input id="userName" type="text"><br/>
a:<input id="age" type="text"><br/>
<button name="butt1">添加用户</button></body>
</html>

(4)测试效果

处理 JSON-注意事项和细节

(1)@ResponseBody 可以直接写在 controller 上 即hanler类上,这样对所有方法生效 ,相当于所有方法都添加了这个注解

(2)@ResponseBody + @Controller 可以直接写成 @RestController。这里看一下@RestController注解的源码就知道了,源码如下

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {@AliasFor(annotation = Controller.class)String value() default "";
}

HttpMessageConverter<T>

基本说明:SpringMVC 处理 JSON 底层实现是依靠 HttpMessageConverter<T>来进行转换的 

工作机制简图

 

处理 JSON-底层实现(HttpMessageConverter<T>)
(1)使用 HttpMessageConverter<T> 将请求信息转化并绑定到处理方法的入参中 , 或将响应结果转为对应类型的响应信息,Spring 提供了两种途径:
  • 使用 @RequestBody / @ResponseBody 对目标方法进行标注
  • 使用 HttpEntity<T> / ResponseEntity<T> 作为目标方法的入参或返回值
(2) 当 控 制 器 处 理 方 法 使 用 到 @RequestBody/@ResponseBody 或 HttpEntity<T>/ResponseEntity<T> 时 , Spring 首先根据请求头或响应头的 Accept 属性选择

匹配 的 HttpMessageConverter, 进而根据参数类型或泛型类型的过滤得到匹配的 HttpMessageConverter, 若找不到可用的 HttpMessageConverter 将报错

文件下载-ResponseEntity<T> 

说明: SpringMVC 中,通过返回 ResponseEntity<T>的类型,可以实现文件下载的功能

应用案例: 

 (1)编写前端页面发送请求

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>json提交</title>
</head>
<body>
<h1>下载文件的测试 </h1>
<a href="<%=request.getContextPath()%>/downFile">点击下载文件</a>
</body>
</html>

 (2)把图片复制到web/img目录下

 (3)在 JsonHandler.java 类中添加如下方法

//响应用户下载文件的请求
@RequestMapping(value = "/downFile")
public ResponseEntity<byte[]> downFile(HttpSession session)throws Exception {//1. 先获取到下载文件的inputStreamInputStream resourceAsStream =session.getServletContext().getResourceAsStream("/img/2.png");//2. 开辟一个存放文件的byte数组, 这里使用byte[] 是为了可以支持二进制数据(图片,视频。)byte[] bytes = new byte[resourceAsStream.available()];//3. 将下载文件的数据,读入到byte[]resourceAsStream.read(bytes);// ResponseEntity构造器//public ResponseEntity(@Nullable T body, @Nullable MultiValueMap<String, String> headers, HttpStatus status) {}//4. 创建返回的HttpStatusHttpStatus httpStatus = HttpStatus.OK;//5. 创建 headersHttpHeaders headers = new HttpHeaders();//指定返回的数据,客户端应当以附件形式处理headers.add("Content-Disposition", "attchment;filename=2.png");//构建一个ResponseEntity 对象 1. http响应头headers 2. http响应状态 3. 下载的文件数据ResponseEntity<byte[]> responseEntity =new ResponseEntity<>(bytes, headers, httpStatus);//如果出现找不到文件,解决方法 rebuild project -> 重启tomcatreturn responseEntity;
}

文件下载响应头的设置 :

content-type 指示响应内容的格式

content-disposition 指示如何处理响应内容。

content-disposition一般有两种方式:

inline:直接在页面显示

attchment:以附件形式下载 

(4)启动服务器,测试效果如下

 

6 文件上传

6.1 基本介绍

(1)Spring MVC 为 文 件 上 传 提 供 了 直 接 的 支 持 , 这 种 支 持 是 通 过 即 插 即 用 的 MultipartResolver 实 现 的 。 Spring 用 Jakarta Commons FileUpload 技 术 实 现 了 一 个 MultipartResolver 实现类:CommonsMultipartResovler

(2)Spring MVC 上下文中默认没有装配 MultipartResovler,因此默认情况下不能处理文件的 上传工作,如果想使用 Spring 的文件上传功能,需要在上下文中配置 MultipartResolver

<!--配置文件上传需要的bean-->
<bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver"id="multipartResolver"/>

6.2 应用实例

(1)引入 springmvc 文件上传需要的 jar 包(已附在文章顶部)


 

(2)创建前端页面 fileUpload.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>文件上传</title>
</head>
<body>
<h1>文件上传的演示</h1>
<%--
1.enctype编码类型,默认是application/x-www-irlencoded 即url编码 这种编码不适用二进制文件数据的提交
一般适用于文本
2.如果要进行二进制文件的提交 enctype 要指定 multipart/form-data 表示提交的数据是由多个部分组成,
也就是可以提交二进制数据和文本数据
--%>
<form action="<%=request.getContextPath()%>/fileUpload" method="post" enctype="multipart/form-data">文件介绍:<input type="text" name="introduce"><br>选择文件:<input type="file" name="file"><br><input type="submit" value="上传文件">
</form>
</body>
</html>

 (3) 在spring配置文件xml文件中配置文件上传解析器

<!--配置文件上传需要的bean-->
<bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver"id="multipartResolver"/>

 (4)创建 FileUploadHandler.java 类

package com.web.fileupload;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;@Controller
public class FileUploadHandler {//编写方法,处理文件上传的请求@RequestMapping(value = "/fileUpload")public String fileUpload(@RequestParam(value = "file") MultipartFile file,HttpServletRequest request, String introduce) throws IOException {//接收到提交的文件名String originalFilename = file.getOriginalFilename();System.out.println("你上传的文件名= " + originalFilename);System.out.println("introduce=" + introduce);//得到要把上传文件保存到哪个路径[全路径:包括文件名]String fileFullPath =request.getServletContext().getRealPath("/img/" + originalFilename);//创建文件File saveToFile = new File(fileFullPath);//将上传的文件,转存到saveToFilefile.transferTo(saveToFile);return "success";}
}

 (5)启动服务器,测试效果

文件上传成功! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/28049.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV练习(1)签名修复

1.目的 在学校的学习过程中&#xff0c;需要递交许多材料&#xff0c;且每份材料上都需要对应负责人签名&#xff0c;有时候找别人要签名&#xff0c;然后自己粘贴的话&#xff0c;会出现签名模糊&#xff0c;背景不是纯白透明。为此以word中的“颜色校正”功能为参照&#xf…

基于iBeacon蓝牙定位技术的反向寻车系统

随着城市化进程的加速和汽车保有量的不断增加&#xff0c;大型停车场成为了人们日常生活中不可或缺的一部分。然而&#xff0c;在繁忙的停车场中快速找到自己的车辆&#xff0c;成为了许多车主的难题。为了解决这一问题&#xff0c;维小帮基于iBeacon蓝牙技术打造的反向寻车系统…

Linux 编写脚本自动清理旧的日志文件,释放磁盘空间

摘要:在我们的后端中每天会产生大量的日志,如果不定期清理会导致系统异常,本文讲解编写一个脚本根据日志文件的修改时间来清理日志,而无需理会日志的命名,从而使脚本更通用。 创建脚本文件: cd /data/shell vi clean_logs.sh此时进入到vi编辑器,在编辑器输入以下内容:…

Android开发AndroidStudio安装教程

本文图示展示AndroidStudio安装教程。 目录 一、下载安装包 二、安装 一、下载安装包 https://developer.android.google.cn/studio?hlzh-cn 二、安装 双击exe Next Next Next 默认点击Install Next 点击finish进入设置文件界面。 如果本地有设置文件&#xff0c;选择C…

推荐一款可以下载B站视频和音频的工具

cobalt是一个免费的下载网站&#xff0c;主要是用于载视频和音频。只要你把相应的网址复制下来&#xff0c;然后打开cobalt网站&#xff0c;黏贴网址&#xff0c;选择要下载的格式&#xff0c;就可以下载相应的音频或者视频了。 该网站非常简洁&#xff0c;使用也很简单。目前只…

【机器学习】Dify:AI智能体开发平台版本升级

一、引言 关于dify&#xff0c;之前力推过&#xff0c;大家可以跳转 AI智能体研发之路-工程篇&#xff08;二&#xff09;&#xff1a;Dify智能体开发平台一键部署了解&#xff0c;今天主要以dify为例&#xff0c;分享一下如何进行版本升级。 二、版本升级 2.1 原方案 #首次…

大模型与知识智能:心理疾病治疗的新希望

前言 随着社会的发展&#xff0c;心理疾病已成为一个日益突出的问题。据《柳叶刀》杂志的系统性综述显示&#xff0c;疫情之后&#xff0c;全世界抑郁症与焦虑症的患病率上升超过25%&#xff0c;其中青少年心理健康的影响最大。此外&#xff0c;2021年国内的精神障碍报告显示&…

光照药物稳定性试验箱百科

概念与作用 - 药品稳定性试验箱&#xff1a;一种精密设备&#xff0c;用于模拟药品在不同环境条件下的存储情况。 - 环境模拟&#xff1a;通过控制温度、湿度等参数&#xff0c;复制各种实际储存条件&#xff0c;以测试药品稳定性。 - 保障药品质量&#xff1a;通过试验&…

Python 3 列表

Python 3 列表 Python 3 中的列表是一种基本的数据结构,用于存储一系列有序的元素。列表是可变的,这意味着可以修改其内容。在 Python 中,列表是非常灵活和强大的,广泛用于各种编程任务。 创建列表 创建列表非常简单,只需将元素用逗号分隔,并包围在方括号 [] 内。例如…

lua中的lfs库介绍

lua中的lfs库介绍 说明常用函数解析lfs.attributeslfs.chdirlfs.currentdirlfs.dirlfs.mkdirlfs.rmdirlfs.locklfs.touchlfs.linklfs.setmodelfs.symlinkattributes 说明 lfs是lua中的一个文件系统库&#xff0c;提供了更多高级的文件和目录操作功能&#xff0c;使得lua可以更方…

如何在 Doris 中通过外表访问 OceanBase 表

在OceanBase 中建立了一张表 test.t1&#xff1a; CREATE TABLE t1 (apply_id varchar(500) DEFAULT NULL,apply_dt date DEFAULT NULL,mobile_prov_nm varchar(500) DEFAULT NULL,mobile_city_nm varchar(500) DEFAULT NULL );-- 插入 10000 行数据到 t1 表insert /*parallel…

德克萨斯大学奥斯汀分校自然语言处理硕士课程汉化版(第九周) - 可解释性

可解释性 1. NLP中的可解释性 1.1. 局部解释1.2. 文本解释1.3. 模型探测 2. 标注伪影3. 思维链 1. NLP中的可解释性 在自然语言处理领域&#xff0c;可解释性是指理解和揭示NLP模型如何做出决策的能力。一些模型本身是自然透明的&#xff0c;我们可以理解它们为何做出这样的决…

Kafka 如何保证消息顺序及其实现示例

Kafka 如何保证消息顺序及其实现示例 Kafka 保证消息顺序的机制主要依赖于分区&#xff08;Partition&#xff09;的概念。在 Kafka 中&#xff0c;消息的顺序保证是以分区为单位的。下面是 Kafka 如何保证消息顺序的详细解释&#xff1a; ⭕分区内消息顺序 顺序写入&#…

windows 共享给linux 的使用方法

windows 作为服务器&#xff0c;linux作为客户端进行文件共享&#xff0c;有3种方法&#xff1a;samba nfs&#xff08;网络硬盘&#xff09;虚拟机共享&#xff08;VirtualBox vboxsf&#xff09;。 Samba 共享&#xff1a; 打开【控制面板】-->【启动或关闭windows功能】…

Apache Tomcat介绍

目录 前言 一、Apache Tomcat的历史 二、核心特性与组件 三、Tomcat-基本使用 总结 前言 在Java Web开发领域&#xff0c;Apache Tomcat是一个不可或缺的核心组件。作为一个轻量级的开源Web应用服务器&#xff0c;Tomcat提供了一种简单而高效的方式来部署和管理Java Servle…

C语言:头歌利用指针找最大值

任务描述 本关任务&#xff1a;本题要求实现一个简单函数&#xff0c;找出两个数中的最大值。 函数接口定义&#xff1a; void findmax( int *px, int *py, int *pmax ); 其中px和py是用户传入的两个整数的指针。函数findmax应找出两个指针所指向的整数中的最大值&#xff0c…

【Python入门与进阶】Python的分支结构

Python 的分支结构主要是通过 if、elif 和 else 语句来实现的。这些语句允许程序根据不同的条件执行不同的代码块。以下是一个简单的示例来展示 Python 分支结构的基本用法&#xff1a; # 示例变量 x 10# if 语句 if x > 0:print("x 是一个正数")# if-else 语句…

MySQL 使用 MyFlash 快速恢复误删除、误修改数据

一、MyFlash MyFlash 是由美团点评公司技术工程部开发并维护的一个开源工具&#xff0c;主要用于MySQL数据库的DML操作的回滚。这个工具通过解析binlog日志&#xff0c;帮助用户高效、方便地进行数据恢复。MyFlash的优势在于它提供了更多的过滤选项&#xff0c;使得回滚操作变…

鸿蒙面试题

请简述鸿蒙操作系统的特点。 跨平台能力&#xff0c;基于微内核设计&#xff0c;提供分布式能力&#xff0c;强调安全性&#xff0c;以及面向未来全场景的无缝体验。 鸿蒙操作系统的微内核架构有哪些优势&#xff1f; 微内核架构的优势包括更高的安全性&#xff0c;因为服务…

论文阅读笔记:Towards Higher Ranks via Adversarial Weight Pruning

论文阅读笔记&#xff1a;Towards Higher Ranks via Adversarial Weight Pruning 1 背景2 创新点3 方法4 模块4.1 问题表述4.2 分析高稀疏度下的权重剪枝4.3 通过SVD进行低秩逼近4.4 保持秩的对抗优化4.5 渐进式剪枝框架 5 效果5.1 和SOTA方法对比5.2 消融实验5.3 开销分析 6 结…