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.rhkb.cn/news/318149.html

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

相关文章

基于YOLOV8+Pyqt5无人机航拍太阳能电池板检测系统

1.YOLOv8的基本原理 YOLOv8是一种前沿的目标检测技术&#xff0c;它基于先前YOLO版本在目标检测任务上的成功&#xff0c;进一步提升了性能和灵活性&#xff0c;在精度和速度方面都具有尖端性能。在之前YOLO 版本的基础上&#xff0c;YOLOv8 引入了新的功能和优化&#xff0c;…

数据结构 - C/C++

快速跳转 数组链表栈队列串树 目录 数据结构 逻辑结构 物理结构 数据结构 数据 数据不仅仅包括整型、实型等数值类型&#xff0c;还包括字符及声音、图像、视频等非数值类型。 计算机可以理解并按照指定格式处理。 结构 元素相互之间存在一种或多种特定关系的数据集合。 …

Java-异常处理-定义三角形类Triangle和异常三角形IllegalTriangleException类 (1/2)

任意一个三角形&#xff0c;其任意两边之和大于第三边。当三角形的三条边不满足前述条件时&#xff0c;就表示发生了异常&#xff0c;将这种异常情况定义为IllegalTriangleException类。 自定义异常类IllegalTriangleException&#xff1a; 当三角形的三条边不满足条件&#x…

Unreal 编辑器工具 批量重命名资源

右键 - Editor Utilities - Editor Utility Blueprint&#xff0c;基类选择 Asset Action Utility 在类默认值内&#xff0c;可以添加筛选器&#xff0c;筛选指定的类型 然后新建一个函数&#xff0c;加上4个输入&#xff1a;ReplaceFrom&#xff0c;ReplaceTo&#xff0c;Add…

PotatoPie 4.0 实验教程(32) —— FPGA实现摄像头图像浮雕效果

什么是浮雕效果&#xff1f; 浮雕效果是一种图像处理技术&#xff0c;用于将图像转换为看起来像浮雕一样的效果&#xff0c;给人一种凸起或凹陷的立体感觉&#xff0c;下面第二张图就是图像处理实现浮雕效果。 不过这个图是用Adobe公司的PS人工P图实现的&#xff0c;效果比较…

使用unreal engine5.3.2创建c++第一人称游戏

UE5系列文章目录 文章目录 UE5系列文章目录前言一、NuGet 简介二、解决方法&#xff1a; 前言 为了使用unreal engine5.3.2创建c第一人称游戏&#xff0c;今天安装了Visual Studio 2022专业版。在ue5中创建c工程&#xff0c;结果编译器报错&#xff1a; 严重性 代码 说明 项目…

酒水门店私域流量运营搭建执行规划方案

【干货资料持续更新&#xff0c;以防走丢】 酒水门店私域流量运营搭建执行规划方案 部分资料预览 资料部分是网络整理&#xff0c;仅供学习参考。 PPT可编辑&#xff08;完整资料包含以下内容&#xff09; 目录 精酿啤酒品牌私域执行运营的内容策划&#xff0c;涉及以下几个…

VULHUB复现log4j反序列化漏洞-CVE-2021-44228

本地下载vulhub复现就完了&#xff0c;环境搭建不讲&#xff0c;网上其他文章很好。 访问该环境&#xff1a; POC 构造&#xff08;任选其一&#xff09;&#xff1a; ${jndi:ldap://${sys:java.version}.xxx.dnslog.cn} ${jndi:rmi://${sys:java.version}.xxx.dnslog.cn}我是…

【跟马少平老师学AI】-【神经网络是怎么实现的】(六)过拟合问题

一句话归纳&#xff1a; 1&#xff09;过拟合问题&#xff1a; 图中的点为样本直线欠拟合曲线2过拟合 2&#xff09;迭代次数与拟合情况&#xff1a; 训练次数过多可能导致过拟合。 3&#xff09;正则化项法弱化过拟后问题&#xff1a; 加正则项&#xff0c;在最小化损失函数时…

Github 2024-05-02 Go开源项目日报 Top10

根据Github Trendings的统计,今日(2024-05-02统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10PureBasic项目1Kubernetes: 容器化应用程序管理系统 创建周期:3618 天开发语言:Go协议类型:Apache License 2.0Star数量:106913 个…

Ubuntu安装Neo4j

Ubuntu&#xff08;在线版&#xff09; 更新软件源 sudo apt-get update 添加Neo4j官方存储库 wget -O - https://debian.neo4j.com/neotechnology.gpg.key | sudo apt-key add - 将地址添加到系统的软件包源列表中 echo deb https://debian.neo4j.com stable latest | su…

stm32单片机开发三、DMA

DMA其实就是一种将ADC的数据寄存器、串口的数据寄存器等等一些数据放到sram中特定位置&#xff0c;方便CPU去读取 比如ADC转换&#xff0c;DMA直接转换的ADC的值放在内存中的特定位置&#xff0c;CPU可以直接去读取 uint16_t AD_Value[4]; //定义用于存放AD转换结果的全局…

C语言/数据结构——每日一题(反转链表)

一.前言 大家好&#xff01;今天又是每日一题环节。今天我为大家分享了一道单链表题——反转链表。 废话不多说&#xff0c;让我们直接进入正题吧。 二.正文 1.1题目信息 这是一道leetCode上面的一道题&#xff1a;https://leetcode.cn/problems/reverse-linked-list 1.2解…

ios CI/CD 持续集成 组件化专题五-(自动发布私有库-组件化搭建)

一&#xff1a;手动发布私有库总结 手动发布pod私有库&#xff0c;需要进行如下几步操作&#xff1a; 1、修改完代码之后&#xff0c;需要提交代码push到git仓库。 2、给代码打tag。 3、修改podspec文件的version值&#xff0c;使其和设置的tag一直。 4、命令行执行pod repo…

用js代码实现贪吃蛇小游戏

js已经学了大部分了&#xff0c;现在就利用我所学的js知识试试做贪吃蛇小游戏吧 以下部分相关图片以及思路笔记均出自渡一陈老师的视频 首先制作简单的静态页面&#xff0c;添加贪吃蛇移动的背景和相关图片&#xff0c;比如开始游戏等等 将各个功能均封装在函数中&#xff0…

毫米波雷达多人呼吸心跳检测MATLAB仿真

本文基于TI的IWR1642毫米波雷达 2T4R MIMO阵列&#xff0c;通过实际采集数据算法仿真&#xff0c;实现多人呼吸心跳检测。 文章末尾给出了本文的仿真代码。 主要内容包含&#xff1a; &#xff08;1&#xff09;雷达参数设定 &#xff08;2&#xff09;ADC数据导入 &#xff08…

rocketmq dashboard控制台中topic状态无法展示

现象 在使用rocketmq控制台查看topic状态和订阅状态时&#xff0c;出现错误和没有信息的情况。 原因 rocketmq控制台版本问题&#xff0c;最新版本为1.0.1&#xff0c;支持rocketmq5版本&#xff0c;如果使用rocketmq4版本的服务无法兼容对应的数据。同理1.0.0版本也无法兼容ro…

AI图书推荐:用ChatGPT快速创建在线课程

您是否是您领域的专家&#xff0c;拥有丰富的知识和技能可以分享&#xff1f;您是否曾想过创建一个在线课程&#xff0c;但被这个过程吓倒了&#xff1f;那么&#xff0c;是时候把这些担忧放在一边&#xff0c;迈出这一步了&#xff01;有了这本指南和ChatGPT的帮助&#xff0c…

【前端】-【防止接口重复请求】

文章目录 需求实现方案方案一方案二方案三 需求 对整个的项目都做一下接口防止重复请求的处理 实现方案 方案一 思路&#xff1a;通过使用axios拦截器&#xff0c;在请求拦截器中开启全屏Loading&#xff0c;然后在响应拦截器中将Loading关闭。 代码&#xff1a; 问题&…

Scala应用 —— JDBC的创建

文章目录 Scala应用 —— JDBC的创建前言一、JDBC的创建过程1.初始化连接1.1 配置驱动1.2 创建连接对象 2. 初始化执行器2.1 创建执行器对象2.2 初始化执行器参数 3. 执行操作并返回结果 二、Scala JDBC的基本设计思路1. 操作步骤设计2. 解决结果差异化3.实现jdbc方法并输出结果…