SpringMVC系列十: 中文乱码处理与JSON处理

文章目录

  • 中文乱码处理
    • 自定义中文乱码过滤器
    • Spring提供的过滤器处理中文
  • 处理json和HttpMessageConverter<T>
    • 处理JSON-@ResponseBody
    • 处理JSON-@RequestBody
    • 处理JSON-注意事项和细节
    • HttpMessageConverter<T\>
    • 文件下载-ResponseEntity<T\>
    • 作业布置

上一讲, 我们学习的是 SpringMVC系列九: 数据格式化与验证及国际化

现在打开springmvc项目

在这里插入图片描述

中文乱码处理

自定义中文乱码过滤器

●说明
当表单提交数据为中文时, 会出现乱码,我们来解决一下( 提示: 想恢复name属性的绑定)
在这里插入图片描述
在这里插入图片描述

1.创建过滤器 JavaWeb过滤器
com.zzw.web.filter包下新建MyCharacterFilter

/*** @author 赵志伟* @version 1.0* 编写过滤器, 处理中文乱码*/
@SuppressWarnings({"all"})
public class MyCharacterFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {//这里加入对编码的处理servletRequest.setCharacterEncoding("utf-8");//放行请求, 这个规则和前面见过的java web过滤器一样filterChain.doFilter(servletRequest, servletResponse);}@Overridepublic void destroy() {}
}

2.在web.xml中配置.
注意: 不要乱写, 过滤器一般写在web.xml的最上面, 多个过滤器之间会形成过滤器链, 要注意顺序.

<!--配置处理中文乱码的过滤器
拦截所有请求, 处理编码.把过滤器配置到web.xml前面-->
<filter><filter-name>MyCharacterFilter</filter-name><filter-class>com.zzw.web.filter.MyCharacterFilter</filter-class>
</filter>
<filter-mapping><filter-name>MyCharacterFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>

3.完成测试.
在这里插入图片描述
在这里插入图片描述

Spring提供的过滤器处理中文

1.修改web.xml, 换成Spring提供的过滤器, 处理中文乱码.

<!--配置Spring提供的过滤器, 解决中文乱码问题-->
<filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>utf-8</param-value></init-param>
</filter>
<filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>

2.完成测试
在这里插入图片描述在这里插入图片描述

处理json和HttpMessageConverter

处理JSON-@ResponseBody

●说明
项目开发中, 我们往往需要服务器返回的数据格式是按照json来返回的, 我们看一下SpringMVC是如何处理的,

●应用案例
1.引入处理json需要的jar包, 注意spring5.x 需要使用jackson-2.9.x.jar的包springmvc处理json需要jar

2.在web路径下创建json.jsp

<head><title>json提交</title><%--引入jquery--%><%--编写jquery代码和请求--%>
</head>
<body>
<h1>请求一个json数据</h1>
<a href="?" id="getJson">点击获取json数据</a>
</body>

3.在com.zzw.web.json.entity包 下新建 Dog.java

public class Dog {private String name;private String address;//全参构造器, 无参构造器, setter,getter,toString方法
}

4.在json包 下新建JsonHandler.java

@Controller
public class JsonHandler {/*** 解读* 1.目标方法 @ResponseBody, 表示返回的数据是json格式* 2.springmvc底层根据目标方法@ResponseBody, 返回指定格式,* 3.底层原理我们在前面自定义@ResponseBody讲过, 这里原生的springmvc使用转换器* 4.HttpMessageConverter [一会我们debug]* @return*/@RequestMapping(value = "/json/dog")@ResponseBodypublic Dog getJson() {//返回对象//springmvc会根据你的设置, 转成json格式数据返回Dog dog = new Dog();dog.setName("大黄");dog.setAddress("蜡笔小新");return dog;}
}

5.回填json.jsp的action

<html>
<head><title>json提交</title><%--引入jquery--%><script type="text/javascript" src="script/jquery-3.6.0.min.js"></script><%--编写jquery代码和请求--%><script type="text/javascript">$(function () {//给id="getJson"绑定一个点击事件$("#getJson").click(function () {console.log("ok");//测试一下let url = this.href;//this是dom对象let args = {"time": new Date};//这老师要发送数据, 为了防止页面缓存$.post(url,args,function(data) {//data就是后台返回的数据, 是json格式console.log("data=", data);console.log("name=", data.name);console.log("address=", data.address);},"json")return false;//这里我们返回false, 就不使用href默认机制});})</script>
</head>
<body>
<h1>请求一个json数据</h1>
<%--处理
1.当用户点击超链接时, 我们发出一个ajax请求
2.接收到请求后, 我们查看这个数据
3.使用我们前面见过的jquery发出ajax请求的知识
--%>
<a href="<%=request.getContextPath()%>/json/dog" id="getJson">点击获取json数据</a>
</body>
</html>

6.完成测试(浏览器)
在这里插入图片描述

7.用postman完成测试
在这里插入图片描述

处理JSON-@RequestBody

●应用案例
-前面我们是通过表单, 或者 url请求携带 参数=参数值 把数据提交给目标方法
1)给大家举例客户端发送 json字符串数据
2)使用SpringMVC@RequestBody 将客户端提交的json数据, 封装成JavaBean对象
3)再把这个javabeanjson而对象形式返回
4)完成效果示意图 [空]

1.修改json.jsp, 增加发送json数据代码

<html>
<head><title>json提交</title><%--引入jquery--%><script type="text/javascript" src="script/jquery-3.6.0.min.js"></script><%--编写jquery代码和请求--%><script type="text/javascript">$(function () {//....//绑定按钮点击事件, 提交json数据//springmvc 可以在后台将json转成对象$("button[name='butt1']").click(function () {//todo 具体的业务代码以后再写})})</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>

2.在com.zzw.web.json.entity包 下新建 User.java

public class User {private String userName;private Integer age;//全参构造器, 无参构造器, setter,getter,toString方法
}

3.修改JsonHandler.java, 增加处理json代码. 注意: 老韩用的是 @PostMapping, 等价: @RequestMapping(method = RequestMethod.POST)

@Controller
public class JsonHandler {//...@RequestMapping(value = "/save2")@ResponseBodypublic User save2(User user) {//将前台传过来的数据, 以json的格式返回给浏览器System.out.println("user=" + user);return user;}
}

4.回填json.jsp

//绑定按钮点击事件, 提交json数据
//springmvc 可以在后台将json转成对象
$("button[name='butt1']").click(function () {//目标:将userName 和 age 封装成json字符串let url = "/springmvc/save2";let userName = $("#userName").val();let age = $("#age").val();//将json对象转成json字符串let args = JSON.stringify({"userName": userName, "age": age});$.ajax({url: url,type: "POST",data: args,success(data) {console.log("返回的data=", data);},//下面这个contentType参数, 是指定发送数据时的编码和格式//只有$.ajax才有, $.post没有contentType: "application/json;charset=utf-8"})
})

5.测试. 数据为空
在这里插入图片描述
后台. 数据为空

在这里插入图片描述

6.加上 @RequestBody注解

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

7.测试
在这里插入图片描述
后台

在这里插入图片描述

8.postman测试

postman提交json格式的数据

在这里插入图片描述
在这里插入图片描述

处理JSON-注意事项和细节

1.目标方法正常返回JSON需要的数据, 可以是一个对象, 也可以是一个集合

2.前面我们讲的是返回一个Dog对象->转成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测试
在这里插入图片描述
在这里插入图片描述返回结果
在这里插入图片描述

3.@ResponseBody 可以直接写在controller上, 这样对所有方法都生效
●应用实例
在这里插入图片描述

完成测试
在这里插入图片描述后台数据
在这里插入图片描述

postman测试
在这里插入图片描述


4.@ResponseBody + @Controller 可以直接写成 @RestController, 我们看一下源码

在这里插入图片描述

测试
在这里插入图片描述
在这里插入图片描述

HttpMessageConverter<T>

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

●工作机制简图
在这里插入图片描述


●处理JSON-底层实现(HttpMessageConverter<T>)
1.使用 HttpMessageConverter<T> 将请求信息转化并绑定到处理方法的入参中, 或将响应结果转为对应类型的相应信息, Spring 提供了两种途径:
√ 使用 @RequestBody / @ResponseBody 对目标方法进行标注
√ 使用 @HttpEntity<T> / ResponseEntity<T> 作为目标方法的入参或返回值

2.当控制器处理方法使用到 @RequestBody / @ResponseBodyHttpEntity<T> / ResponseEntity<T> 时, Spring 首先根据请求头或响应头的 Accept 属性选择匹配的 HttpMessageConverter, 进而根据参数类型或泛型类型的过滤得到匹配的 HttpMessageConverter, 若找不到可用的 HttpMessageConverter 将报错

Debug 源码-梳理一下
在这里插入图片描述

在这里插入图片描述

一. 将请求信息转化并绑定到处理方法的入参中

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二. 将响应结果转为对应类型的相应信息

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

文件下载-ResponseEntity<T>

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

●案例演示
准备工作: 在web路径/img下准备一个要下载的文件, 比如图片: 1.jpg
在这里插入图片描述

1.修改json.jsp

<h1>下载文件的测试</h1>
<a href="?">点击下载文件</a>

2.修改JsonHandler.java, 增加方法

//响应银狐下载文件的请求
@RequestMapping(value = "/downFile")
public ResponseEntity<byte[]>  downFile(HttpSession session) throws Exception {//1.先获取到下载文件的inputStreamInputStream inputStream = session.getServletContext().getResourceAsStream("/img/1.jpg");//2.开辟一个存放文件的字节数组, 这里我们使用byte[] 是可以支持二进制数据(图片, 视频, 音频, doc文档)byte[] bytes = new byte[inputStream.available()];//3.将下载文件的数据, 读入到byte[]inputStream.read(bytes);/*public ResponseEntity(@Nullable T body, @Nullable MultiValueMap<String, String> headers, HttpStatus status) {this(body, headers, (Object) status);}*///4.创建返回的HttpStatusHttpStatus status = HttpStatus.OK;//5.创建 headersHttpHeaders headers = new HttpHeaders();//指定返回的数据, 客户端应当以附件形式处理headers.add("Content-Disposition", "attachment;filename=1.jpg");//构建一个ResponseEntity 对象ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes, headers, status);//如果出现找不到文件, 解决方法 rebuild project return responseEntity;
}

文件下载响应头的设置
content-type 指示响应内容的格式
content-disposition 指示如何处理响应内容

一般有两种方式:
inline: 直接在页面显示
attchment: 以附件形式下载

3.回填json.jsp

<a href="<%=request.getContextPath()%>/downFile">点击下载文件</a>

4.完成测试
页面方式
在这里插入图片描述

postman测试, 返回二进制数据, 因为postman没有对数据进行解析
在这里插入图片描述

作业布置

1.把我们前面学过的数据格式化, 验证以及国际化, Json处理, 文件下载, 相关代码和案例, 自己写一遍. 一定要写一遍, 否则没有印象, 理解不会渗入

2.把Debug过的HttpMessageConverter源码, 自己再走一下, 加深理解(不用每条语句, 都debug, 找流程…)

3.DataBinder工作机制-将示意图画出

4,Debug一下validate得到验证errors信息, 加深理解(不用每一条语句都debug, 找流程)


在这里插入图片描述

下一讲, 我们学习 SpringMVC系列九: 数据格式化与验证及国际化

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

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

相关文章

python判断语句

目录 布尔类型和比较运算符if语句的基本格式if else 语句if elif else 语句判断语句的嵌套 布尔类型和比较运算符 1、布尔类型 bool布尔类型只有两个结果&#xff1a;真或假 布尔类型的字面量&#xff1a; True 表示真&#xff08;是、肯定&#xff09; False 表示假&#x…

【论文精读】ViM: Out-Of-Distribution with Virtual-logit Matching 使用虚拟分对数匹配的分布外检测

文章目录 一、文章概览&#xff08;一&#xff09;问题来源&#xff08;二&#xff09;文章的主要工作&#xff08;三&#xff09;相关研究 二、动机&#xff1a;Logits 中缺失的信息&#xff08;一&#xff09;logits&#xff08;三&#xff09;基于零空间的 OOD 评分&#xf…

[leetcode]add-strings 字符串相加

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:string addStrings(string num1, string num2) {int i num1.length() - 1, j num2.length() - 1, add 0;string ans "";while (i > 0 || j > 0 || add ! 0) {int x i > 0 ? num1[i…

msvcp120.dll丢失怎么办,找不到msvcp120.dll的多种解决方法

最近&#xff0c;我在运行一个程序时遇到了一个错误&#xff0c;系统提示找不到msvcp120.dll文件&#xff0c;无法继续执行代码。这让我感到非常困扰&#xff0c;因为这个问题导致我无法正常运行这个程序。经过一番搜索和尝试&#xff0c;我找到了几种修复这个问题的方法&#…

pdf转图片转换器,pdf转图片的工具

在日常的工作和学习中&#xff0c;我们经常会遇到需要将PDF文件转换为图片格式的情况。那么&#xff0c;如何才能将PDF格式转换为图片格式呢&#xff1f;今天&#xff0c;我将为大家介绍几种简单易用的方法&#xff0c;帮助大家轻松实现PDF转图片。 打开“轻云pdf处理官网网站”…

WEB界面上使用ChatGPT

&#xff08;作者&#xff1a;陈玓玏&#xff09; 开源项目&#xff0c;欢迎star哦&#xff0c;https://github.com/tencentmusic/cube-studio 随着大模型不断发展&#xff0c;现在无论写代码&#xff0c;做设计&#xff0c;甚至老师备课、评卷都可以通过AI大模型来实现了&…

后端实现预览pdf,mp4,图片

PDF预览 /*** pdf预览* param response*/RequestMapping(value "/preview")public void showPdf(HttpServletResponse response) {try {//String filePath this.getClass().getClassLoader().getResource("../../static/pdf/readme.pdf").getPath();Stri…

线程池概念、线程池的不同创建方式、线程池的拒绝策略

文章目录 &#x1f490;线程池概念以及什么是工厂模式&#x1f490;标准库中的线程池&#x1f490;什么是工厂模式&#xff1f;&#x1f490;ThreadPoolExecutor&#x1f490;模拟实现线程池 &#x1f490;线程池概念以及什么是工厂模式 线程的诞生是因为&#xff0c;频繁的创…

【Godot4自学手册】第四十二节实现拖拽进行物品交换和数量叠加

这一节我们主要学习背包系统中的物品拖拽后&#xff0c;物品放到新的位置&#xff0c;或交换物品位置&#xff0c;如果两个物品属于同一物品则数量相加。具体效果如下&#xff1a; 一、修改item.tscn场景 给item.tscn场景的根节点Item添加Label子节点&#xff0c;命名为Numv…

[RPI4] 树莓派4b安装istoreos及使用 -- 1. 系统安装

最近在研究家庭智能化的一些东西,其中包括网络,智能家居等一系列内容,然后看过的资料有的想再回来看的时候就找不到了,然后就想着开这么一个系列,做一些记录,先从智能家居开始吧。 1 安装istoreos系统 iStoreOS 目标是提供一个人人会用的路由兼轻 NAS 系统,不管是作为路…

Java包介绍

今天看jdk文档&#xff0c;顺便写一下java几个包的作用。 java.applet 主要用于创建java applet小应用程序&#xff0c;可以嵌入到网页中能够呈现出特殊的效果&#xff0c;现在基本已经被废弃&#xff0c;很少使用。 java.awt AWT 是Abstract Window ToolKit (抽象窗口工具包…

我原以为政务类网站不追求漂亮,打脸啦,漂亮得颠覆你认知。

我原本以为政务类网站一定时沉稳、工整、信息量大的&#xff0c;这些和漂流都关联不上&#xff0c;直到最近看了一些网站&#xff0c;发现我的认识狭隘了。 政务类网站的设计风格通常需要注重以下几个方面&#xff1a; 稳重和专业感&#xff1a; 政务类网站需要给人以稳重、正…

perfect-scrollbar缩小浏览器窗口滚动条无线滚动的bug

https://github.com/mdbootstrap/perfect-scrollbar/issues/153

项目实践---Windows11中安装Zookeeper/Hadoop/Hive的部分问题解决

一.Hadoop与Hive兼容版本选择 正常来说&#xff0c;Hadoop与Hive版本不兼容会出现很多问题导致hive安装失败&#xff0c;可以先确定HIve的版本&#xff0c;比如&#xff1a;要用Hive3.1.2版本&#xff0c;该如何确定使用Hadoop的版本呢&#xff0c;需要我们在hive源码中找到对…

Python 类对象

Python 类对象 经典迭代器 可迭代对象的定义&#xff1a; 使用内置的iter可以获取迭代器的对象。如果对象实现了能返回迭代器的__iter__方法&#xff0c;那么对象就是可迭代的。序列都可以迭代。实现了__getitem__方法&#xff0c;而且接受从0开始的索引&#xff0c;这种对象也…

大型语言模型(LLM)和多模态大型语言模型(MLLM)的越狱攻击

随着大型语言模型&#xff08;LLMs&#xff09;的快速发展&#xff0c;它们在各种任务上表现出了卓越的性能&#xff0c;有效地遵循指令以满足多样化的用户需求。然而&#xff0c;随着这些模型遵循指令的能力不断提升&#xff0c;它们也越来越成为对抗性攻击的目标&#xff0c;…

vscode用vue框架1写一个登陆页面

目录 一、创建登录页面 二、构建好登陆页面的路由 三、编写登录页代码 1.添加基础结构 2.给登录页添加背景 3.解决填充不满问题 4.我们把背景的红颜色替换成背景图&#xff1a; 5.在页面中央添加一个卡片来显示登录页面 6.设置中间卡片页面的左侧 7.设置右侧的样式及…

记录react实现选择框一二级联动出现的问题

需求&#xff1a;用户在选择第一个选择框的选项后&#xff0c;第二个选择框的选项会根据第一个选择框的选择动态更新。如图所示 出现的问题 一级分类选择之后二级分类没有数据&#xff0c;第二次重新选择一级分类的时候&#xff0c;二级分类就会有值。 第一次点击截图&#x…

纯css星空动画

让大家实现一个这样的星空动画效果,大家会怎么做? js,不! 其实使用css就能写 我也不藏着掖着,源码直接放下面了 <script setup></script><template><div class"box"><div v-for"i in 5" :key"i" :class"layer…

文件上传漏洞-上篇

一、概述 文件上传漏洞可以说是日常渗透测试中用得最多的一个漏洞&#xff0c;用它获得服务器权限最快最直接。在web程序中&#xff0c;经常需要用到文件上传的功能。如用户或者管理员上传图片&#xff0c;或者其它文件。如果没有限制上传类型或者限制不严格被绕过&#xff0c…