• SpringMVC 06 乱码问题解决和JSON


    6.1 乱码问题解决


    只要是 WEB 应用,就都会 出现 乱码问题。而我们 必须要解决这个问题。

    1. 写一个 form.jsp 和 一个 请求 Controller
    <%--
      Created by IntelliJ IDEA.
      User: muqua
      Date: 2022/7/21
      Time: 16:20
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Titletitle>
    head>
    <body>
    <form action="/e/t1" method="post">
        <input type="text" name="name">input>
        <input type="submit">input>
    form>
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    package top.muquanyu.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @Controller
    public class EncodingController {
        @PostMapping("/e/t1")
        public String test1(String name, Model model){
            model.addAttribute("msg",name);
            return "hello";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述
    在这里插入图片描述
    这个 乱码,其实 是 req 发送这个 参数的时候 发生的。并且 是 已经编码好这种 乱码后 发送的请求。所以 你没法 直接 在 Controller 的那个 方法里面 解决这个问题。所谓生米煮成熟饭 还怎么 解决呢。哈哈~

    所以 下面这种方式 是 失败的:

    在这里插入图片描述

    在这里插入图片描述

    1. 用原生态方法,设置一个 Filter 过滤器,让他在发送这个请求之前,经过过滤器,把所有的编码全部的 改为 utf-8 然后 再去发送这个 请求。这个时候 编码后 肯定就不是乱码了。
    package top.muquanyu.filter;
    
    import javax.servlet.*;
    import java.io.IOException;
    
    public class EncodingFilter implements Filter {
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            servletRequest.setCharacterEncoding("utf-8");
            servletResponse.setCharacterEncoding("utf-8");
            filterChain.doFilter(servletRequest,servletResponse);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
        <filter>
            <filter-name>encodingFilterfilter-name>
            <filter-class>top.muquanyu.filter.EncodingFilterfilter-class>
        filter>
        <filter-mapping>
            <filter-name>encodingFilterfilter-name>
            <url-pattern>/*url-pattern>
        filter-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    这里切记:/* 才接收 包含 .jsp 的请求,而 / 是不接收 .jsp 请求的!!

    在这里插入图片描述

    在这里插入图片描述

    1. 直接使用 SpringMVC 提供的 乱码过滤器,就完事了。
        <filter>
            <filter-name>encodingfilter-name>
            <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
            <init-param>
                <param-name>encodingparam-name>
                <param-value>utf-8param-value>
            init-param>
        filter>
    
        <filter-mapping>
            <filter-name>encodingfilter-name>
            <url-pattern>/*url-pattern>
        filter-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    1. 如果上述还是解决不了的话,那么就需要 尝试 改 tomcat 的编码 和 使用一下 别人写的 GenericEncodingFilter 过滤器了。
    • 更改 tomcat 的配置文件 conf/server.xml
    <Connector URIEncoding="utf-8" port="8080" protocol="HTTP/1.1"
              connectionTimeout="20000"
              redirectPort="8443" />
    
    • 1
    • 2
    • 3
    • 使用 GenericEncodingFilter 过滤器
    import javax.servlet.*;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletRequestWrapper;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    import java.util.Map;
    
    /**
    * 解决get和post请求 全部乱码的过滤器
    */
    public class GenericEncodingFilter implements Filter {
    
       @Override
       public void destroy() {
      }
    
       @Override
       public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
           //处理response的字符编码
           HttpServletResponse myResponse=(HttpServletResponse) response;
           myResponse.setContentType("text/html;charset=UTF-8");
    
           // 转型为与协议相关对象
           HttpServletRequest httpServletRequest = (HttpServletRequest) request;
           // 对request包装增强
           HttpServletRequest myrequest = new MyRequest(httpServletRequest);
           chain.doFilter(myrequest, response);
      }
    
       @Override
       public void init(FilterConfig filterConfig) throws ServletException {
      }
    
    }
    
    //自定义request对象,HttpServletRequest的包装类
    class MyRequest extends HttpServletRequestWrapper {
    
       private HttpServletRequest request;
       //是否编码的标记
       private boolean hasEncode;
       //定义一个可以传入HttpServletRequest对象的构造函数,以便对其进行装饰
       public MyRequest(HttpServletRequest request) {
           super(request);// super必须写
           this.request = request;
      }
    
       // 对需要增强方法 进行覆盖
       @Override
       public Map getParameterMap() {
           // 先获得请求方式
           String method = request.getMethod();
           if (method.equalsIgnoreCase("post")) {
               // post请求
               try {
                   // 处理post乱码
                   request.setCharacterEncoding("utf-8");
                   return request.getParameterMap();
              } catch (UnsupportedEncodingException e) {
                   e.printStackTrace();
              }
          } else if (method.equalsIgnoreCase("get")) {
               // get请求
               Map<String, String[]> parameterMap = request.getParameterMap();
               if (!hasEncode) { // 确保get手动编码逻辑只运行一次
                   for (String parameterName : parameterMap.keySet()) {
                       String[] values = parameterMap.get(parameterName);
                       if (values != null) {
                           for (int i = 0; i < values.length; i++) {
                               try {
                                   // 处理get乱码
                                   values[i] = new String(values[i]
                                          .getBytes("ISO-8859-1"), "utf-8");
                              } catch (UnsupportedEncodingException e) {
                                   e.printStackTrace();
                              }
                          }
                      }
                  }
                   hasEncode = true;
              }
               return parameterMap;
          }
           return super.getParameterMap();
      }
    
       //取一个值
       @Override
       public String getParameter(String name) {
           Map<String, String[]> parameterMap = getParameterMap();
           String[] values = parameterMap.get(name);
           if (values == null) {
               return null;
          }
           return values[0]; // 取回参数的第一个值
      }
    
       //取所有值
       @Override
       public String[] getParameterValues(String name) {
           Map<String, String[]> parameterMap = getParameterMap();
           String[] values = parameterMap.get(name);
           return values;
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106

    6.2 JSON是什么

    又回到我们老生常谈的问题了。JSON 是什么。

    JSON:简单来说 就是 一种 数据的 特殊交换格式。并且 它的 类型 就只是一个 字符串。其实在早期的时候,就有大把大把的人发现,数据的终点就是字符串。为什么这么说呢?因为无论你是什么数据,其实都可以用字符串表达出来。(我自己在大一那阵,开发的一个 读取 ini 文件的lib库 采用的 也是 文本格式,即 字符串 的处理,确实是 可以处理任何数据。不用考虑它到底是什么类型的。)

    • 简洁和清晰的层次结构设计,使得 JSON 成为理想的数据交换语言。它的主要 存储数据形式 是 以 键值对为主的,并且 整体 就好像 一个 js 对象一样,用 {} 花括号 包裹起来。
    • 易于 人的阅读和编写,当然 也易于程序的解析和生成。甚至还有效地提高了网络传输的效率。

    由于 JSON 的这种设计格式,非常的 符合 JavaScript 所谓的对象。所以 任何 类型 都可以 通过 JSON 来表示。或者说,JSON 完全就跟 js 的对象规范 一毛一样。

    • 数据用键值对存储,用逗号分隔彼此
    • 花括号保存对象
    • 方括号保存数组

    我们一般通过 JSON.parse(json数据) :把一个 JSON 的字符串,转换为 js 的对象。

    JSON.stringify(js对象):把一个 js 对象,转为 JSON 字符串。

    <html>
    <head>
        <title>Titletitle>
        <meta http-equiv="Content-Type" content="text/html" charset="utf-8" />
        <script type="text/javascript">
            let obj = {
                name: "mqy",
                age: 20,
                gender: "男"
            };
    
            let json = JSON.stringify(obj);
            console.log(JSON.stringify(obj));
            console.log("==================");
            console.log(JSON.parse(json));
    
        script>
    head>
    <body>
    
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    在这里插入图片描述

    在这里插入图片描述

  • 相关阅读:
    视频讲解|基于模型预测算法的含储能微网双层能量管理模型【mpc】
    Window和MacOS对于conda以及pip换源方法
    OSPF协议:优点、初始化流程和管理
    echarts柱状图上方的数值为0时设置不展示
    MyBatis基础教程
    Salesforce ServiceCloud考证学习(5)
    Leetcode 720. 词典中最长的单词(为啥感觉这道题很难?)
    2022系统分析师论文真题
    IP地址,子网掩码,默认网关,DNS讲解
    RestTemplate Message Convert 详解
  • 原文地址:https://blog.csdn.net/qq_52606908/article/details/125915402