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

news2024/12/25 10:31:39

文章目录

  • 中文乱码处理
    • 自定义中文乱码过滤器
    • 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 {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //这里加入对编码的处理
        servletRequest.setCharacterEncoding("utf-8");
        //放行请求, 这个规则和前面见过的java web过滤器一样
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public 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")
    @ResponseBody
    public 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")
    @ResponseBody
    public 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.先获取到下载文件的inputStream
    InputStream 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.创建返回的HttpStatus
    HttpStatus status = HttpStatus.OK;

    //5.创建 headers
    HttpHeaders 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.coloradmin.cn/o/1857893.html

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

相关文章

区块链学习03-空投篇

Hybrid 是与 以太坊 兼容的第 2 层区块链&#xff0c;集成了混合专家 (MoE) 框架&#xff0c;支持以即插即用的方式轻松创建和货币化 AI 代理。该平台旨在提高区块链应用程序中数据的完整性和可用性&#xff0c;支持跨各个行业开发和部署 AI 驱动的解决方案。 Hybrid 正在为其…

JINGWHALE WH 迭代思维法:科学优化问题解析、任务策略规划与高效工作汇报的赋能艺术

JINGWHALE 对此论文相关未知以及已知概念、定理、公式、图片等内容的感悟、分析、创新、创造等拥有作品著作权。未经 JINGWHALE 授权&#xff0c;禁止转载与商业使用。

【网络安全的神秘世界】搭建dvwa靶场

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 下载DVWA https://github.com/digininja/DVWA/blob/master/README.zh.md 安装DVWA 安装phpstudy https://editor.csdn.net…

黄仁勋口中“生物工程化”的美好愿景,正在被这家公司努力变成现实

6月20日&#xff0c;一家为人类细胞编码新疗法的公司&#xff0c;也是合成生物学领域的先驱英国合成生物公司bit.bio宣布推出ioAstrocytes&#xff0c;这是一种功能性人类iPSC&#xff08;诱导多能干细胞&#xff09;衍生的星形胶质细胞&#xff0c;科学家表示该产品为中枢神经…

深入理解Qt属性系统[Q_PROPERTY]

Qt 属性系统是 Qt 框架中一个非常核心和强大的部分&#xff0c;它提供了一种标准化的方法来访问对象的属性。这一系统不仅使得开发者能够以一致的方式处理各种数据类型&#xff0c;还为动态属性的管理提供了支持&#xff0c;并与 Qt 的元对象系统紧密集成。在这篇文章中&#x…

每日AI资讯-20240622

1. 可灵AI全新功能上线&#xff01; 可灵AI全新功能上线&#xff01;图生视频和视频续写来啦&#xff01; 图生视频&#xff1a;上传任意图片&#xff0c;生成5秒精彩视频。支持添加提示词控制图像运动视频续写&#xff1a;对生成视频一键续写4&#xff5e;5秒&#xff0c;支持…

App推广新突破!Xinstall无注册码方案,一键解决您的获客难题

在互联网的浪潮中&#xff0c;App推广与运营面临着前所未有的挑战。随着流量红利的衰退&#xff0c;如何高效、精准地触达用户&#xff0c;提升用户留存和转化率&#xff0c;成为每个企业都必须面对的问题。在这个关键时刻&#xff0c;Xinstall以其无注册码的解决方案&#xff…

深入测评:ONLYOFFICE 8.1 桌面编辑器究竟有多强大?

ONLYOFFICE 8.1桌面编辑器 文章目录 ONLYOFFICE 8.1桌面编辑器一、ONLYOFFICE的简介二、ONLYOFFICE 8.1新功能和改进2.1 轻松编辑器 PDF 文件2.2 用幻灯片版式快速修改幻灯片2.3 无缝切换文档编辑、审阅和查看模式2.4 改进从右至左语言的支持 & 新的本地化选项2.5 隐藏“连…

《精通嵌入式Linux编程》——解锁嵌入式Linux开发的无限可能

文章目录 &#x1f4d1;前言一、书籍概览与作者风采二、内容详解与特色亮点2.1 嵌入式Linux基础与入门2.2 系统编程与内核探索2.3 驱动开发与实战演练2.4 内存管理与性能优化2.5 系统调试与性能提升2.6 综合项目实践与案例分析 三、书籍价值与应用展望 &#x1f4d1;前言 在当今…

软件测试计划审核表、试运行审核、试运行申请表、开工申请表

1、系统测试计划审核表 2、系统试运行审核表 3、系统试运行申请表 4、开工申请表 5、开工令 6、项目经理授权书 软件全套资料获取&#xff1a;本文末个人名片直接获取或者进主页。 系统测试计划审核表 系统试运行审核表 系统试运行申请表 开工申请表 开工令 项目经理授权书

nginx实现反向代理出现502的解决方法

目录 1. 出现原因 1.1. 防火墙拦截了端口 1.1.1. 使用 iptables 1.1.2. 使用 firewall-cmd&#xff08;适用于 CentOS/RHEL 7&#xff09; 1.2. docker容器中的ip和宿主机ip不一致 1. 出现原因 这里我是用的docker容器来进行nginx的启动的&#xff0c;在我们用nginx的配置…

使用vant4+vue3制作电商购物网站

一、前言 1.本项目基于vant4vue3构建&#xff0c;默认友友们已具备相关知识&#xff0c;如不具备&#xff0c;请友友们先去了解相关该概念 2.项目数据来源于开源框架 新峰商城 在此指出 3.此项目目的在于帮助友友们了解基本的用法&#xff0c;没有涉及太多的逻辑操作。 二、…

医院信息管理系统的设计与实现

你好&#xff0c;我是信息技术领域的研究者。如果你对医院信息管理有兴趣&#xff0c;欢迎交流。 开发语言&#xff1a; Java 数据库&#xff1a; MySQL 技术&#xff1a; Java技术&#xff0c;SpringBoot框架&#xff0c;B/S模式 工具&#xff1a; MyEclipse&#xff0c;M…

测试卡无法仪表注册问题分析

1、问题描述 00101测试卡无法注册LTE网络&#xff0c;modemlog中发现终端未发起Attach请求&#xff0c;对比正常注册非正常注册的版本&#xff0c;发现正常的多出了ims apn。可以通过ATCGDCONT?来查询modem APN参数。 2、问题分析 目前Modem是一套&#xff0c;没有相关修改。因…

主食冻干喂猫是真对猫好吗?这些选购指南学会了是真不踩雷!

随着科学养猫知识的普及&#xff0c;主食冻干喂养越来越受到养猫人的青睐。主食冻干不仅符合猫咪的饮食天性&#xff0c;还能提供均衡的营养&#xff0c;有助于维护猫咪的口腔和消化系统健康。虽然许多猫主人看到了主食冻干喂养的诸多好处&#xff0c;但在选择适合的主食冻干产…

6.19长难句打卡

The Flatiron School, where people pay to learn programming, started as one of the many coding bootcamps that’s become popular for adults looking for a career change. 人们在Flatiron学校里花钱学习编程&#xff0c;且Flatiron学校也成为在寻求职业变化的成年人之中…

一文读懂交换机MAC地址表:五大关键点,图解21步

HCIA 新班开课了华为HCIA课程介绍苏州面授班 | 全国直播班循环开班&#xff0c;免费重学前言 什么是MAC地址表?MAC地址表有什么作用&#xff1f;MAC地址表里面包含了哪些要素&#xff1f;今天带你好好唠唠。 我们以一个案例为例&#xff1a; 如上图&#xff1a;PC1和PC2通…

vscode linux项目插件global扩展安装

vscode经常用来编辑linux系统下的项目&#xff1b;但是经常出现一些小问题&#xff1b;例如代码导航&#xff1a; 有时想要跳转到函数定义时会提示&#xff1a;未找到xxx的任何定义&#xff1b;更奇怪的是有的函数可以跳转有的函数不能跳转&#xff1b;理论上来说C/C插件已经具…

脑洞大开!用大模型开卡车,还融了2亿美元

物理生成式AI驾驶平台Waabi在官网宣布获得2亿美元&#xff0c;本次由英伟达&#xff08;NVIDIA&#xff09;、沃尔沃、保时捷、Uber、Khosla等全球知名企业投资。 Waabi仅成立3年便获得4级自主驾驶权限&#xff0c;主要是借助了ChatGPT等生成式AI风口&#xff0c;将其融合在自…

AI风险管理新利器:SAIF CHECK利用Meta Llama 3保障合规与安全

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…