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 {
    @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");
        //放行
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public 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;
    }

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

3.json.jsp发送ajax请求
<%--
  Date: 2024/2/29
  Time: 13:23
  User: 孙显圣
  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;
    }

    @Override
    public 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/29
  Time: 14:13
  User: 孙显圣
  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);
                //编写url
                var url = "/springmvc/json/user";
                //编写contentType,来告诉后端发送数据类型是json
                var 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/29
  Time: 16:59
  User: 孙显圣
  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.mfbz.cn/a/580980.html

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

相关文章

外面收费999元的虚拟小众产品,0门槛,单号100-300元

近日&#xff0c;我抽出时间参加了一些线下聚会&#xff0c;与互联网行业的朋友们进行了面对面的交流。有时候&#xff0c;独自努力不如与他人分享想法&#xff0c;因为别人的建议可能会让你豁然开朗&#xff0c;解决遇到的难题。在互联网行业中&#xff0c;交流和沟通至关重要…

【WinForm】怎样以管理员身份运行安装程序

当开发的程序需要安装时&#xff0c;有时默认安装会遇到访问被拒绝的问题。为了解决这个问题&#xff0c;需要以管理员身份运行程序。 文章目录 应用程序UAC清单管理员身份 安全调试ClickOne 应用程序 打开项目属性,找到应用程序下的清单, 设置好如下图 UAC清单 再找到项目…

python 调试 c++源码

1. gdb常用调试命令概览和说明 2. 编译c库设置Debug模式 cmake设置debug 在CMake中设置debug模式通常意味着启用调试信息和优化。以下是一个简单的CMakeLists.txt文件示例&#xff0c;展示了如何设置项目以便在Debug模式下构建&#xff1a; cmake_minimum_required(VERSION 3…

深度学习| 注意力机制

注意力机制 为什么需要注意力机制Seq2Seq问题Transfomer Attention注意力机制分类软硬注意力注意力域 为什么需要注意力机制 这个可以从NLP的Seq2Seq问题来慢慢理解。 Seq2Seq问题 Seq2Seq&#xff08;Sequence to Sequence&#xff09;&#xff1a;早期很多模型中&#xff…

Linux逻辑方式合并物理磁盘

在日常生活中&#xff0c;我们总是遇到一个文件太大&#xff0c;以至于我们的两个磁盘都装不下&#xff0c;这时我们就需要将两块物理磁盘逻辑化的连接在一起&#xff0c;把物理磁盘使用逻辑化的方法合并在一起&#xff0c;形成卷组&#xff0c;使得磁盘空间可以公用&#xff1…

Leetcode—1672. 最富有客户的资产总量【简单】

2024每日刷题&#xff08;120&#xff09; Leetcode—1672. 最富有客户的资产总量 实现代码 class Solution { public:int maximumWealth(vector<vector<int>>& accounts) {int ans 0;for(vector<vector<int>>::iterator it accounts.begin();…

西门子PLC常见疑难解答在这都能找到(含PLC无线通讯实例)

问&#xff1a;在WINCC中可以创建多少个消息类型&#xff1f; 答&#xff1a;WINCC中最多可以创建16个消息类型。 问&#xff1a;博途WINCC与经典版WINCC兼容嘛&#xff1f; 答&#xff1a;经典wincc和博图wincc Professional版本都不兼容 不能安装到一起的哦&#xff01; …

探讨mfc100u.dll丢失的解决方法,修复mfc100u.dll有效方法解析

mfc100u.dll丢失是一个比较常见的情况&#xff0c;由于你电脑的各种操作&#xff0c;是有可能引起dll文件的缺失的&#xff0c;而mfc100u.dll就是其中的一个重要的dll文件&#xff0c;它的确实严重的话是会导致程序打不开&#xff0c;系统错误的。今天我们就来给大家科普一下mf…

命令执行漏洞【2】vulhub远程命令执行漏洞复现

1.vulhub安装启动靶场环境 &#xff08;1&#xff09;s2-061开启靶场 &#xff08;2&#xff09;s2-059开启靶场 2.漏洞复现 &#xff08;1&#xff09;s2-061漏洞复现 github获取漏洞利用工具 开始利用 &#xff08;2&#xff09;s2-059漏洞复现 在linux特有临时目录/tmp下…

968.监控二叉树 树上最小支配集

法一: 动态规划 一个被支配的节点只会有三种状态 1.它本身有摄像头 2.他没有摄像头, 但是它的父节点有摄像头 3.他没有摄像头, 但是它的子节点有摄像头 我们 dfs(node,state) 记录在node节点时(以node为根的子树),状态为state下的所有最小摄像头 // 本身有摄像头就看左右孩子…

投影连接Samba服务

目录 0.创建【Samba服务】 1.下载・安装一个能连接【Samba服务】的播放器 2.配置语言 3.配置服务器连接 0.创建【Samba服务】 Linux&#xff08;Ubuntu&#xff09;中创建【samba】服务&#xff0c;用于和Windows系统之间共享文件_ubuntu samba-CSDN博客 1.下载・安装一…

《深入理解mybatis原理》 MyBatis的架构设计以及实例分析

《深入理解mybatis原理》 MyBatis的架构设计以及实例分析 MyBatis是目前非常流行的ORM框架&#xff0c;它的功能很强大&#xff0c;然而其实现却比较简单、优雅。本文主要讲述MyBatis的架构设计思路&#xff0c;并且讨论MyBatis的几个核心部件&#xff0c;然后结合一个select查…

Matlab进阶绘图第51期—带填充等高线的三维特征渲染散点图

带填充等高线的三维特征渲染散点图是填充等高线图与特征渲染三维散点图的组合。 其中&#xff0c;填充等高线图与特征渲染的三维散点图的颜色用于表示同一个特征。 由于填充等高线图无遮挡但不直观&#xff0c;特征渲染的三维散点图直观但有遮挡&#xff0c;而将二者组合&…

【C++杂货铺】二叉搜索树

目录 &#x1f308;前言&#x1f308; &#x1f4c1; 二叉搜索树的概念 &#x1f4c1; 二叉搜索树的操作 &#x1f4c2; 二叉搜索树的查找 &#x1f4c2; 二叉搜索树的插入 &#x1f4c2; 二叉搜书树的删除 &#x1f4c1; 二叉搜索树的应用 &#x1f4c1; 二叉搜索树的…

vue3 h5模板

vue3的h5模板 基于vue3tsvantrem的h5模板 觉得帮到你了就给个start

【win10移动热点,提示正在获取ip地址...】

检查 Wired AutoConfig/ WLAN AutoConfig 服务运行 电脑→管理→服务和应用程序→服务&#xff1a;AutoConfig 有线网络无线网卡 1.开启wifi热点&#xff0c;自动生成“本地连接*10”&#xff1b; 2.配置Wired LAN网络共享 仅无线网卡 1. 开启wifi热点&#xff0c;自动生…

自学Python爬虫js逆向(二)chrome浏览器开发者工具的使用

js逆向中很多工作需要使用浏览器中的开发者工具&#xff0c;所以这里以chrome为例&#xff0c;先把开发者工具的使用总结一下&#xff0c;后面用到的时候可以回来查询。 Google Chrome浏览器的开发者工具是前端开发者的利器&#xff0c;它不仅提供了丰富的功能用于开发、调试和…

电动公共交通车充电站设置储能电站方案

相比于传统燃油公交车&#xff0c;电动公交车以电代油&#xff0c;具有零排放、低噪音、低能耗等优势。随着电池、车载电机等相关技术的不断发展&#xff0c;电动公交车在国内乃至全世界范围内逐步推广应用。动力电池是电动公交车的重要部件之一&#xff0c;其寿命及性能影响着…

解密推理部署工程师的必备技能,面试题库分析

推理部署工程师面试题库 1. 描述一下SM的结构&#xff1f; 英伟达 GPU 架构&#xff1a;* 计算核心&#xff1a;INT32、FP32、FP64 CUDA 核心&#xff0c;Tensor 核心&#xff0c;超低延迟负载/存储。* 调度和存储器&#xff1a;Warp 调度器注册文件&#xff0c;共享存储器&am…

逻辑回归模型与GBDT+LR——特征工程模型化的开端

随着信息技术和互联网的发展&#xff0c; 我们已经步入了一个信息过载的时代&#xff0c;这个时代&#xff0c;无论是信息消费者还是信息生产者都遇到了很大的挑战&#xff1a; 信息消费者&#xff1a;如何从大量的信息中找到自己感兴趣的信息&#xff1f;信息生产者&#xff…
最新文章