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 {
    @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系列九: 数据格式化与验证及国际化

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大模型技术工程师:抓住时代机遇,成为行业精英_

伴随AI大模型的火热&#xff0c;中国科技大厂们正在掀起一场「跑步AI化」的风暴。从顶层战略到业务线重构&#xff0c;AI无疑已成为大厂们押注未来的新故事。 大模型时代已经到来 大模型已成为全球竞争热点&#xff0c;一个大模型时代已经到来。 大模型具备三个特点&#xf…

python __call__(实例化对象的时候返回一个函数,调用这个函数的时候会执行__call__)(将类实例用作回调函数)(类装饰器)

文章目录 Python中的__call__方法深入解析__call__方法简介定义和基本用法为什么要使用__call__方法 __call__方法的高级用法在装饰器中使用__call__&#xff08;类装饰器&#xff1a;在类中保持状态或进行状态管理&#xff09;将类实例用作回调函数 结论 Python中的__call__方…

013.随机指纹chromium编译-如何通过传参来固定指纹

随机指纹chromium编译-如何通过传参来固定指纹 由于要所有的类型的指纹都实现固定&#xff0c;工作量太大&#xff0c;这里我只用plugins指纹作为示例。 一、为什么要固定指纹 目标&#xff1a;启动浏览器时&#xff0c;加上参数--fingerprints"xxxxxxx", 参数变化时…

微信小程序接入lottie动画

1、注意&#xff1a;canvas渲染出来的层级太高&#xff0c;当有弹窗的情况会暴露在弹窗外 模拟器上会有这个问题&#xff0c;线上版本不会有 2、需求 需要把lottie动画在小程序的环境下进行展示 3、什么是lottie动画 由Airbnb开发并开源。允许设计师将复杂的矢量动画导出为…

鸿蒙开发网络管理:【 @ohos.net.http (数据请求)】

数据请求 说明&#xff1a; 本模块首批接口从API version 6开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import http from ohos.net.http;完整示例 import http from ohos.net.http;// 每一个httpRequest对应一个http请求任务&…

Linux安装并配置Java

1、Linux操作系统安装Java 1.1、下载Java JDK解压包 官方提供的网址&#xff1a; 选择Linux版本 下载列表选择最后一项&#xff0c;通过解压方式安装 倒数第二项是以rpm方式进行安装&#xff0c;另一篇安装MySQL时就是用到rpm方法。 1.2、解压JDK tar -zxvf jdk-8u411-lin…

MyBatisPlus可以自动把我们的业务对应的动态代理接口注入到父类baseMapper属性中,因此我们可以省略对应的mapper动态代理接口

MyBatisPlus可以自动把我们的业务对应的动态代理接口注入到父类baseMapper属性中&#xff0c;因此我们可以省略对应的mapper动态代理接口 在service服务实现类中&#xff0c;当我们使用MyBatis框架的时候&#xff0c;那么一般会有一个类似于下面的动态地理接口的显示引入&…

复分析——第3章——亚纯函数和对数(E.M. Stein R. Shakarchi)

第3章 亚纯函数和对数 (Meromorphic Functions and the Logarithm) One knows that the differential calculus, which has contributed so much to the progress of analysis, is founded on the consideration of differential coefficients, that is derivatives of f…

MySQL数据库与基本操作(增删改查)

一、数据库的基本概念 数据库要学习的四个基本概念&#xff0c;主要是&#xff1a;数据、数据库系统、数据库、数据管理系统。数据&#xff08;Date&#xff09;是描述事物的记录&#xff0c;数据库系统&#xff08;DBS&#xff09;&#xff0c;数据库管理系统&#xff08;DBMS…

k8s学习--chart包开发(创建chart包)

文章目录 chart包应用环境一、安装helm客户端工具二、chart包目录结构三、创建不可配置的chart1.创建目录和chart.yaml2.创建deployment.yaml3.创建service.yaml4.使用chart安装应用5.查看和验证 四、创建可配置的Chart1.官方的预定义变量2.新增values.yaml文件3.配置deploy引用…

页面开发提效的神器:自动打开 IDE 并将光标定位至 DOM 的源代码位置

先看使用效果&#xff1a; 在webpack使用Code Inspector插件 使用方法 // vue.config.js const { codeInspectorPlugin } require(code-inspector-plugin); chainWebpack(config) {config.plugin(code-inspector-plugin).use(codeInspectorPlugin({bundler: webpack,hotKe…

【Altium】PCB设计中如何设置同一网络的间距规则

【更多软件使用问题请点击亿道电子官方网站】 1、文档目标&#xff1a; 对同一网络的各个元素间设置间距规则 2、应用场景&#xff1a; PCB设计规则中&#xff0c;当对网络设置间距规则时&#xff0c;默认的约束对象是不同的网络之间才生效&#xff0c;在一些特殊情况下&am…

网站的友情链接有什么作用

1.对于用户的作用 网站的友情链接能够让用户可以了解到更多的产品服务或者其他信息&#xff0c;这对于用户来说起到一个便捷服务的作用&#xff0c;如果用户不需要的话就不说了&#xff0c;但是如果用户需要到的服务&#xff0c;也就是相当于给用户提供多一个服务渠道。…

NSSCTF-Web题目9

目录 [SWPUCTF 2021 新生赛]sql 1、题目 2、知识点 3、思路 [SWPUCTF 2022 新生赛]xff 1、题目 2、知识点 3、思路 [FSCTF 2023]源码&#xff01;启动! 1、题目 2、知识点 3、思路 [SWPUCTF 2021 新生赛]sql 1、题目 2、知识点 SQL注入&#xff0c;空格、注释符等…

【AI开发】RAG基础

RAG的基本流程&#xff1a; 用一个loader把knowledge base里的知识做成一个个的document&#xff0c;然后把document切分成snippets&#xff0c;把snippets通过embedding&#xff08;比如openai的embedding模型或者huggingface的&#xff09;向量化&#xff0c;存储到vectordb…

男士内裤哪个品牌质量好?国内质量好的男士内裤推荐

男士内裤&#xff0c;作为每日贴身陪伴的必需品&#xff0c;舒适度无疑是我们的首要考量。想象一下&#xff0c;闷热不透气、夹臀卡裆、或是束缚紧勒&#xff0c;这些不舒适的感觉无疑会破坏我们一整天的美好心情。 虽然它看似只是一块简单的布料&#xff0c;但这个小伙伴却与…

随心笔记,第六更

目录 一、 三步构建 XML转成java bean 1.XML转XSD 2.XSD转JavaBean 3.jaxb 工具类 4.测试 &#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是「Leen」。刚工作几年&#xff0c;想和大家一同进步&am…

QTday2

使用手动连接&#xff0c;将登录框中的取消按钮使用第二中连接方式&#xff0c;右击转到槽&#xff0c;在该槽函数中&#xff0c;调用关闭函数 将登录按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0…

迷你手持小风扇十大名牌排名有哪些?公认迷你小风扇排行榜揭开!

随着夏季高温的来临&#xff0c;迷你小风扇成为了大家追求清凉和舒适的必备工具。其小巧便携的设计、强劲的风力和长续航时间&#xff0c;使得迷你小风扇迅速在市场上走红。然而&#xff0c;面对琳琅满目的品牌和各种型号&#xff0c;如何选择一款既高效又耐用的迷你小风扇成为…

基于VTK9.3.0+Visual Studio2017 c++实现DICOM影像MPR多平面重建+V R体绘制4个视图展示功能的实现

开源库&#xff1a;VTK9.3.0 开发工具&#xff1a;Visual Studio2017 开发语言&#xff1a;C 实现过程&#xff1a; class vtkImageInteractionCallback : public vtkCommand { public:static vtkImageInteractionCallback* New(){return new vtkImageInteractionCallback()…