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

news2024/11/28 0:50:47

文章目录

    • 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.coloradmin.cn/o/1631675.html

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

相关文章

物联网通信网关的主要功能体现在哪些方面?-天拓四方

在信息化、智能化的时代&#xff0c;物联网技术的广泛应用正在逐渐改变我们的生活方式。物联网通过各种传感器和设备&#xff0c;将现实世界与数字世界紧密相连&#xff0c;从而实现智能化、自动化的生活和工作方式。作为物联网生态系统中的重要组成部分&#xff0c;物联网通信…

解决Pytorch的cuDNN error: CUDNN_STATUS_NOT_INITIALIZED

目录 1. 问题报错2. 可能原因2.1 GPU内存不足2.2 缓存问题2.3 CUDA和Pytorch版本不兼容2.4 CUDA和cuDNN版本不兼容 3. 验证CUDA是否可用4. 参考 1. 问题报错 在使用GPU加速模型训练的过程中经常会遇到这样的错误&#xff1a; RuntimeError: cuDNN error: CUDNN_STATUS_NOT_IN…

8_手眼标定总结_auboi5机械臂与海康平面相机

经过不断地学习与调试&#xff0c;不断地学习网络上其他同志分享的资料&#xff0c;opencv手眼标定迎来了阶段性结束。实际测试结果在机械臂坐标系中X方向差5mm左右。 代码参考《https://blog.csdn.net/wanggao_1990/article/details/81435660》 注意事项&#xff1a; ①标定…

开源相机管理库Aravis例程学习(五)——camera-api

开源相机管理库Aravis例程学习&#xff08;五&#xff09;——camera-api 简介例程代码函数说明arv_camera_get_regionarv_camera_get_pixel_format_as_stringarv_camera_get_pixel_formatARV_PIXEL_FORMAT_BIT_PER_PIXEL 简介 本文针对官方例程中的&#xff1a;03-camera-api…

Kafka(十二)Streams

目录 Streams1 什么式是流式处理2 流式处理的相关概念2.1 拓扑2.2 时间2.2.1 输入时间2.2.2 输出时间 2.3 状态2.4 流和表2.5 时间窗口2.5.1 测试时间窗口 2.6 处理保证 3 流式处理设计模式3.1 单事件处理3.2 使用本地状态3.3 多阶段处理和重分区3.4 使用外部查找&#xff1a;流…

HTML5(1)

目录 一.HTML5(超文本&#xff08;链接&#xff09;标记&#xff08;标签<>&#xff09;语言) 1.开发环境&#xff08;写代码&#xff0c;看效果&#xff09; 2.vscode 使用 3.谷歌浏览器使用 4.标签语法 5.HTML基本骨架&#xff08;网页模板&#xff09; 6.标签的…

【多维动态规划】Leetcode 64. 最小路径和【中等】

最小路径和 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 示例 1&#xff1a; 输入&#xff1a;grid [[1,3,1],[1,5,1],[4,2,1]] 输出…

Stable Diffusion 模型分享:Inkpunk Diffusion(动漫、墨水朋克)

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里&#xff0c;订阅后可阅读专栏内所有文章。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八 下载地址 模型介绍 在 Dreambooth 上训练的微调稳定扩散模型。隐约受…

现代神经网络总结(AlexNet VGG GoogleNet ResNet的区别与改进)

VGG NIN GoogleNet 1.VGG&#xff0c;NIN&#xff0c;GoogleNet的块结构图对比(注意:无AlexNet) 这些块带来的区别与细节 AlexNet未使用块,主要对各个层进行了解: 卷积:捕捉特征 relu:增强非线性 池化层:减少计算量 norm:规范数据分布 全连接层:分类VGG块的改善(对比AlexNe…

将要上市的自动驾驶新书《自动驾驶系统开发》中摘录片段

全书共分15章&#xff1a;第1章是自动驾驶系统的概述&#xff08;场景分类、开发路径和数据闭环等&#xff09;&#xff0c;第2章简介自动驾驶的基础理论&#xff0c;即计算机视觉和深度学习等&#xff0c;第3&#xff5e;4章是自动驾驶的软硬件平台分析&#xff0c;包括传感器…

使用STM32CubeMX对STM32F4的CAN1/2/3配置及接收中断开启

目录 1. CAN配置1.1引脚&#xff08;STM32F413VGT6-LQFP100&#xff09;1.2 时钟1.3 RCC配置1.4 CAN1配置1.5 CAN2配置1.6 CAN3配置1.7 输出设置 2. CAN代码2.1 CAN初始化2.2 CAN滤波器设置2.3 CAN使能2.4 激活中断2.5 CAN发送函数2.6 CAN回调函数2.7 main之后的代码 1. CAN配置…

20232831 袁思承2023-2024-2 《网络攻防实践》第8次作业

目录 20232831 袁思承2023-2024-2 《网络攻防实践》第8次作业1.实验内容2.实验过程一、动手实践任务一二、动手实践任务二&#xff1a;分析Crackme程序①crackme1.exe②crackme2.exe 三、分析实践任务一四、分析实践任务二 3.学习中遇到的问题及解决4.学习感悟、思考等参考资料…

你不需要总是在 React 中使用 useState

在我审查的一个拉取请求中&#xff0c;我注意到在许多拉取请求中看到的一种模式。React 组件具有多个 UI 状态&#xff0c;例如 loading、error 和 success。 作者使用了多个 useState 钩子来管理这些状态&#xff0c;这导致代码难以阅读且容易出错&#xff0c;例如&#xff1a…

ArcGIS Pro3.0软件破解版安装教程

软件名称&#xff1a;ArcGIS Pro 3.0 安装环境&#xff1a;Windows 软件大小&#xff1a;7.3GB 硬件要求&#xff1a;CPU2GHz&#xff0c;内存4G(或更高) 百度云下载链接 &#xff1a; https://pan.baidu.com/s/1CXy1MSwdQXdVnJoV2X422A 提 取 码 &#xff1a;r0w1 教学内…

uniapp 对接facebook第三方登录

1.登录facebook开发者中心&#xff0c;打开我的应用页面在这里插入图片描述 2.创建应用 3.选择类型 4.填写信息 5.添加登录 6.添加平台 安卓密钥生成【需要 Java 环境!!! 和 openssl库】 Google Code Archive 的 Windows 版 openssl-for-windows OpenSSL 库 将openssl下载到…

word 表格 文字 上下居中

问题 word 表格 文字 上下居中 详细问题 笔者进行word 文档编辑&#xff0c;对于表格中的文本内容&#xff0c;如何进行上下居中&#xff1f; 解决方案 步骤1、选中需要进行操作的单元格 步骤2、右键 → \rightarrow →点击表格属性 步骤3、依次点击单元格 → \rightar…

ASP.NET前后端分离,WebApi。Vue3+ElementPlus+Axios+Pinia全流程教程

文章目录 前言1、.net core 执行过程2、中间件的执行过程3、AOP切面编程 Swagger添加Swagger注释 JWT1、解析2、配置JWT 配置SqlSugar0、引入SqlSugarCore包1、编写Context类2、配置实体类3、创建Service服务类进行数据库的CRUD4、配置Controller进行路由 依赖注入与IOCIOC依赖…

将针孔模型相机 应用到3DGS

Motivation 3DGS 的 投影采用的是 CG系的投影矩阵 P P P, 默认相机的 principal point (相机光心) 位于图像的中点处。但是 实际应用的 绝大多数的 相机 并不满足这样一个设定&#xff0c; 因此我们 需要根据 f , c x , c y {f,c_x, c_y} f,cx​,cy​ 这几个参数重新构建3D …

Android权限问题

问题&#xff1a;mate60pro弹出了一个读取已安装应用列表的权限弹框&#xff0c;需确认相关场景 分析&#xff1a; 1.AndroidManifest.xml中声明了权限标签 <uses-permission android:name"android.permission.QUERY_ALL_PACKAGES" /> 它赋予应用查询设备上…

结构方程模型(SEM)时间重复测量数据分析

张老师&#xff08;研究员&#xff09;&#xff0c;长期从事R语言结构方程模型、群落生态学、保护生物学、景观生态学和生态模型方面的研究和教学工作&#xff0c;已发表了多篇论文&#xff0c;拥有丰富的科研及实践经验。 很多研究需要进行多个时间点&#xff08;如天/月/年&…