SpringMVC进阶(过滤器解决中文乱码,处理json以及文件上传下载)

文章目录

    • 1.中文乱码处理
        • 1.引出问题
          • 1.恢复原来取消掉的属性绑定
          • 2.启动服务器,引出问题
        • 2.自定义中文乱码过滤器
          • 1.MyCharacterFilter.java
          • 2.web.xml配置过滤器(这个解决乱码的过滤器放到最前面)
          • 3.结果展示
        • 3.使用Spring过滤器处理(方便)
          • web.xml
    • 2.处理json和HttpMessageConverter
          • 导入jar包
        • 1.处理json—@ReponseBody
          • 1.需求分析
          • 2.具体实现
            • 1.JsonHandler.java后端接口
            • 2.Dog.java
            • 3.json.jsp发送ajax请求
            • 4.结果展示
        • 2.处理json—@ResquestBody
          • 1.需求分析
          • 2.具体实现
            • 1.User.java
            • 2.JsonHandler.java(这里故意没有使用@resquestBody注解)
            • 3.json2.jsp前端界面
            • 4.结果展示
            • 5.添加注解解决数据为空
            • 6.postman测试
        • 3.处理json注意事项和细节
          • 1.处理json对象数组
            • 1.JsonHandler.java
            • 2.postman测试
          • 2.将@ReponseBody直接放在类中,可以使所有的方法都生效
          • 3.@ReponseBody和@Controller可以合并成一个@RestController
          • 4.当使用这个@ReponseBody注解的时候会将结果转换成json字符串直接返回到发送请求的位置
        • 4.HttpMessageConverter<T>
          • 1.流程图
          • 2.底层实现
    • 3.文件下载
        • 1.需求分析
        • 2.具体实现
          • 1.后端接口
          • 2.结果展示
    • 4.文件上传
        • 1.基本介绍
        • 2.导入jar包
        • 3.具体实现
          • 1.配置文件上传解析器
          • 2.编写fileUpload.jsp
          • 3.FileUploadHandler.java
        • 4.postman测试

1.中文乱码处理

1.引出问题
1.恢复原来取消掉的属性绑定

image-20240229123707680

image-20240229123653032

2.启动服务器,引出问题

image-20240229123751063

image-20240229123805927

2.自定义中文乱码过滤器
1.MyCharacterFilter.java
package com.sun.web.filter;import javax.servlet.*;
import java.io.IOException;/*** @author 孙显圣* @version 1.0*/
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");//放行filterChain.doFilter(servletRequest, servletResponse);}@Overridepublic void destroy() {}
}
2.web.xml配置过滤器(这个解决乱码的过滤器放到最前面)
    <!--配置过滤器——放到最前面,因为这个应该是最先处理的--><filter><filter-name>MyCharacterFilter</filter-name><filter-class>com.sun.web.filter.MyCharacterFilter</filter-class></filter><!--过滤所有请求--><filter-mapping><filter-name>MyCharacterFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
3.结果展示

image-20240229125104279

image-20240229125119424

3.使用Spring过滤器处理(方便)
web.xml
    <!--配置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

导入jar包

image-20240229131153116

1.处理json—@ReponseBody
1.需求分析
  • 后端发送一个javabean对象给前端,可以使用注解自动将其转换成json字符串

image-20240229131232344

image-20240229131241134

2.具体实现
1.JsonHandler.java后端接口
package com.sun.web.json;import com.sun.web.json.entity.Dog;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;/*** @author 孙显圣* @version 1.0*/
//作为Controller注入容器
@Controller
public class JsonHandler {@RequestMapping("/json/dog")@ResponseBody //将结果转换成json类型返回public Dog getJson() {Dog dog = new Dog("小狗", "北京四合院");return dog;}
}
2.Dog.java
package com.sun.web.json.entity;/*** @author 孙显圣* @version 1.0*/
public class Dog {private String name;private String address;public Dog() {}public Dog(String name, String address) {this.name = name;this.address = address;}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 + '\'' +'}';}
}
3.json.jsp发送ajax请求
<%--Date: 2024/2/29Time: 13:23User: 孙显圣Version:1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title><script src="script/jquery-3.6.0.min.js"></script><script>$(function () {//绑定点击事件$("#getJson").click(function (){let url = this.href;let args = {"time": new Date}; //发送一个时间,防止页面缓存//发送ajax请求$.post(url,args,function (data) {console.log("dog.name=", data.name);console.log("dog.address=", data.address);},"json")//阻止超链接提交return false;})})</script>
</head>
<body>
<a href="json/dog" id="getJson">点击获取json数据</a>
</body>
</html>
4.结果展示

image-20240229140024390

2.处理json—@ResquestBody
1.需求分析
  • 前端向目标方法发送一个json字符串,后端使用注解将其自动转换为javabean对象,然后再以json字符串的形式发送回去

image-20240229140739133

2.具体实现
1.User.java
package com.sun.web.json.entity;/*** @author 孙显圣* @version 1.0*/
public class User {private String userName;private String age;public User() {}public User(String userName, String age) {this.userName = userName;this.age = age;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getAge() {return age;}public void setAge(String age) {this.age = age;}@Overridepublic String toString() {return "User{" +"userName='" + userName + '\'' +", age='" + age + '\'' +'}';}
}
2.JsonHandler.java(这里故意没有使用@resquestBody注解)
    @RequestMapping("/json/user")@ResponseBody //将结果转换成json类型返回public User getJson2(User user) {System.out.println(user);return user;}
3.json2.jsp前端界面
<%--Date: 2024/2/29Time: 14:13User: 孙显圣Version:1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title><script src="script/jquery-3.6.0.min.js"></script><script>$(function () {//绑定添加用户按钮$("button[name='butt1']").click(function () {//得到用户输入信息var userName = $("#userName").val();var age = $("#age").val();//封装成json对象var jsonObject = {"userName": userName, "age": age};//转换成json字符串var jsonString = JSON.stringify(jsonObject);//编写urlvar url = "/springmvc/json/user";//编写contentType,来告诉后端发送数据类型是jsonvar contentType = "application/json;charset=utf-8";//发送ajax请求$.ajax({url: url,data: jsonString,type: "post",success: function (data) {console.log("返回的数据是=", data);},contentType: contentType,dataType: "json"})})})</script>
</head>
<body>
u:<input type="text" id="userName"><br>
a:<input type="text" id="age"><br>
<button name="butt1">添加用户</button>
</body>
</html>
4.结果展示

数据为空

image-20240229144737390

image-20240229144854613

5.添加注解解决数据为空

image-20240229145947253

6.postman测试

image-20240229150328348

3.处理json注意事项和细节
1.处理json对象数组
1.JsonHandler.java
    //编写方法,以json格式返回多个dog@RequestMapping("/json/dogs")@ResponseBody //将结果转换成json类型返回public List<Dog> getJson3(@RequestBody List<Dog> dogs) { //接受请求的json对象数组字符串,并自动封装到dogs中for (Dog dog : dogs) {System.out.println(dog);}return dogs;}
2.postman测试

image-20240229151740727

2.将@ReponseBody直接放在类中,可以使所有的方法都生效
3.@ReponseBody和@Controller可以合并成一个@RestController
4.当使用这个@ReponseBody注解的时候会将结果转换成json字符串直接返回到发送请求的位置
4.HttpMessageConverter
1.流程图

image-20240229153352503

2.底层实现

image-20240229153505308

3.文件下载

1.需求分析

image-20240229160330675

2.具体实现
1.后端接口
    //编写方法,响应用户下载文件的需求@RequestMapping("/downFile")public ResponseEntity<byte[]> downFile(HttpSession session) throws Exception {//构建这个对象并返回//public ResponseEntity(@Nullable T body, @Nullable MultiValueMap<String, String> headers, HttpStatus status)//@Nullable T body//1.获取要下载的本地文件的流InputStream resourceAsStream = session.getServletContext().getResourceAsStream("/img/7.png");//2.创建一个byte数组来接收byte[] bytes = new byte[resourceAsStream.available()];//3.使用输入流读取信息到数组中resourceAsStream.read(bytes);//HttpStatus status//4.获取一个状态码HttpStatus ok = HttpStatus.OK;//@Nullable MultiValueMap<String, String> headers//5.构建一个响应头HttpHeaders httpHeaders = new HttpHeaders();//attachment表示以附件的形式,filename是指下载后的httpHeaders.add("Content-Disposition", "attachment;filename=2.jpg");//构建这个ResponseEntity<byte[]>ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes, httpHeaders, ok);return responseEntity;}
2.结果展示

image-20240229165107469

4.文件上传

1.基本介绍

image-20240229165327168

2.导入jar包

image-20240229165549493

3.具体实现
1.配置文件上传解析器
    <!--配置文件上传解析器,注意这里的id必须是接口首字母小写--><bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver" id="multipartResolver"></bean>
2.编写fileUpload.jsp
<%--Date: 2024/2/29Time: 16:59User: 孙显圣Version:1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<form action="upload" 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.FileUploadHandler.java
package com.sun.web.fileupload;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;/*** @author 孙显圣* @version 1.0*/
@Controller
public class FileUploadHandler {@RequestMapping("/upload")public String fileUpload(MultipartFile file, HttpServletRequest request, String introduce) throws IOException {System.out.println("文件的描述为:" + introduce);//接受要提交的文件名String originalFilename = file.getOriginalFilename();System.out.println("文件名:" + originalFilename);//找到要上传的文件路径String realPath = request.getServletContext().getRealPath("/img/");String toSavePath = realPath + originalFilename;File file1 = new File(toSavePath);//将文件转存//创建一个文件对象file.transferTo(file1);return "success";}
}
4.postman测试

image-20240229190400664

image-20240229190510781

image-20240229190519708

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

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

相关文章

创建codereview

创建codereview流程 一、开始创建二、选择分支三、添加细节 一、开始创建 点击codereivew按钮 为新的codereview选择一个工程后点击create review 二、选择分支 选择目标分支和要比对的分支&#xff0c;比如develop 三、添加细节 Add branch后&#xff0c;可以继续Edit …

基于Python的在线学习与推荐系统设计与实现(论文+源码)-kaic

题目&#xff1a;在线学习与推荐系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本在线学习与推荐系统就是在这样的大环境下诞生&#xff0…

Python项目开发实战:怎么基于Keras的深度学习来预测房价

注意:本文的下载教程,与以下文章的思路有相同点,也有不同点,最终目标只是让读者从多维度去熟练掌握本知识点。 下载教程:深度学习-基于Keras的Python项目开发实战_波士顿房价预测_编程案例实例教程.pdf 一、引言 在当今信息化社会,房价预测已成为金融、房地产及相关领域…

牛客热题:链表中环的入口结点

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;力扣刷题日记 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 文章目录 牛客热题&#xff1a;**链表中环的入口结点**题目链接…

Mac shell 环境变量配置

官网上的解释。从 macOS Catalina 开始&#xff0c;Mac 使用 zsh 作为默认登录 Shell 和交互式 Shell。你还可以在较早版本的 macOS 中将 zsh 设置为默认 Shell。 在 Mac 上将 zsh 用作默认 Shell - 官方 Apple 支持 (中国) 用命令查看 echo $SHELL 如果返回/bin/zsh 表示是…

C++中的数据结构与算法

随处可见的红黑树 一般会用到[key,value]。 例如github中这个例子&#xff0c;第一个是访问网站&#xff0c;第二个是访问次数&#xff0c;但是这个不是静态的&#xff0c;这有个动态排序&#xff0c;并且当我们需要让相应的访问次数加1的时候&#xff0c;我们用红黑树查找的时…

Flutter 弃用 WillPopScope 使用 PopScope 替代方法

Flutter 弃用 WillPopScope 使用 PopScope 替代方法 视频 https://youtu.be/u3qdqUvFWiM https://www.bilibili.com/video/BV1aJ4m1n7FZ 前言 原文 https://ducafecat.com/blog/migrating-from-willpopscope-to-popscope-in-flutter 了解如何在 Flutter 3.16 中将弃用的 Wil…

【Mac】Mac安装软件常见问题解决办法

前言 刚开始用Mac系统的小伙伴或者在更新系统版本后运行App的朋友会经常碰到弹窗提示「xxx已损坏&#xff0c;无法打开&#xff0c;您应该将它移到废纸篓」、「打不开xxx&#xff0c;因为Apple无法检查其是否包含恶意软件」、「打不开xxx&#xff0c;因为它来自身份不明的开发…

Github 2024-05-01 开源项目日报Top10

根据Github Trendings的统计,今日(2024-05-01统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目4TypeScript项目2JavaScript项目2Vue项目1非开发语言项目1Rust项目1MyShell: 即时语音克隆和开发者社区 创建周期:39 天开发语言:P…

C++每日一练——两个数组的交集

给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,2,1], nums2 [2,2] 输出&#xff1a;[2]示例 2&#xff1a; 输入&#xff1a;nums…

SCI一区 | MFO-CNN-LSTM-Mutilhead-Attention多变量时间序列预测(Matlab)

SCI一区 | MFO-CNN-LSTM-Mutilhead-Attention多变量时间序列预测&#xff08;Matlab&#xff09; 目录 SCI一区 | MFO-CNN-LSTM-Mutilhead-Attention多变量时间序列预测&#xff08;Matlab&#xff09;预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现MFO-CNN…

alsactl 保存音频配置

在root下执行 1、关闭音频通道 amixer cset numid2,ifaceMIXER,namePlayback Path OFF2、保存关闭的音频通道 alsactl store -f /var/lib/alsa/asound.state3、恢复保存关闭的音频配置 alsactl restore -f /var/lib/alsa/asound.state4、打开音频通道 amixer cset numid2,ifac…

设计模式的原则与分类

一、设计模式的原则 1、单一职责原则 一个类只需要负责一种职责即可&#xff0c;一个类发生变化的原因&#xff0c;必然是所负责的职责发生变化 2、接口隔离原则 单一职责原则是接口隔离原则的基础&#xff0c;单一职责原则注重职责的划分&#xff0c;从职责角度进行类和接口…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-6.4--汇编LED驱动程序

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

自定义SpringBoot的starter

案例需求&#xff1a;自定义redis-stater。要求当导入redis坐标时&#xff0c;SpringBoot自动创建Jedis的Bean。 实现步骤&#xff1a; 1、创建redis-spring-boot-autoconfigure模块 2、创建redis-spring-boot-starter模块&#xff0c;依赖redis-spring-boot-autoconfigure的…

4G远程温湿度传感器在农业中的应用—福建蜂窝物联网科技有限公司

解决方案 农业四情监测预警解决方案 农业四情指的是田间的虫情、作物的苗情、气候的灾情和土壤墒情。“四情”监测预警系统的组成包括管式土壤墒情监测站、虫情测报灯、气象站、农情监测摄像机&#xff0c;可实时监测基地状况,可以提高监测的效率和准确性&#xff0c;为农业生…

Linux内核--设备驱动(三)总线、设备、驱动模型的探究

目录 一、引言 二、设备驱动模型的实现 ------>2.1、platform总线 ------>2.2、驱动与设备的匹配 ------>2.3、设备的探测 ------>2.4、设备驱动模型的改善 三、设备与驱动的匹配流程 ------>3.1、各级设备的展开 ------>3.2、platform 设备 -----…

【云原生】Docker 实践(一):在 Docker 中部署第一个应用

Docker 实践&#xff08;一&#xff09;&#xff1a;在 Docker 中部署第一个应用 1.使用 YUM 方式安装 Docker2.验证 Docker 环境3.在 Docker 中部署第一个应用3.1 小插曲&#xff1a;docker pull 报 missing signature key 错误3.2 重新安装 Nginx 1.使用 YUM 方式安装 Docker…

2024年教你怎么将学浪视频保存到本地

你是否曾为无法将学浪视频保存到本地而烦恼&#xff1f;现在&#xff0c;我们将在2024年教给你如何解决这个问题&#xff01;只需简单几步操作&#xff0c;即可轻松将学浪视频保存到您的本地设备&#xff0c;随时随地想看就看&#xff01; 我已经将下载学浪的工具打包好了&…

Vue+Element UI el-progress进度条内显示自定义数字及文字

需求 进度条内展示 具体的数字值&#xff0c;进度条外展示 百分比数值 数据 data() {return {reNum: 3214,rePer:40,warmPer: 40,warmNum:2132,}}因为样式要求&#xff0c;显示的百分数也是自己写的哈 &#xff0c;没有用进度条自带的 代码 <div class"pick"&g…