【WEEK3】 【DAY1】数据处理及跳转之乱码问题【中文版】

2024-03-15 16:36

本文主要是介绍【WEEK3】 【DAY1】数据处理及跳转之乱码问题【中文版】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2024.3.11 Monday

接上文 【WEEK2】 【DAY5】数据处理及跳转之数据处理【中文版】

目录

  • 5.3.乱码问题
    • 5.3.1.在首页编写一个提交的表单
    • 5.3.2.后台编写对应的处理类
    • 5.3.3.修改springmvc-controller.xml
    • 5.3.4.运行
    • 5.3.5.解决乱码
      • 5.3.5.1.Servlet(无法解决)
      • 5.3.5.2.使用过滤器
        • 1. 自定义filter
        • 2. 修改web.xml(添加以下代码)
        • 3. 直接使用官方提供的过滤器
      • 5.3.5.3.乱码的总结部分

5.3.乱码问题

5.3.1.在首页编写一个提交的表单

在web->新建form.jsp在这里插入图片描述

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>FromEncodingController</title>
</head>
<body>
<%--以post方式提交--%>
<form action="/springmvc_04_controller_war_exploded/EC/t1" method="post"><input type="text" name="name"><input type="submit">
</form>
</body>
</html>

5.3.2.后台编写对应的处理类

Controller->新建EncodingController.java在这里插入图片描述

package com.kuang.controller;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PostMapping;@Controller
public class EncodingController {@PostMapping("/EC/t1")public String test1(String name, Model model){System.out.println(name);model.addAttribute("msg",name);//这里name千万不能用双引号,否则页面传入的字符永远是name而非用户输入的内容return "test";}
}

5.3.3.修改springmvc-controller.xml

取消注释
在这里插入图片描述

5.3.4.运行

http://localhost:8080/springmvc_04_controller_war_exploded/form.jsp
在这里插入图片描述
点击提交后产生乱码
http://localhost:8080/springmvc_04_controller_war_exploded/EC/t1
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.3.5.解决乱码

5.3.5.1.Servlet(无法解决)

package com.kuang.controller;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PostMapping;import javax.servlet.http.HttpServletRequest;
import java.io.UnsupportedEncodingException;@Controller
public class EncodingController {@PostMapping("/EC/t1")public String test1(String name, Model model, HttpServletRequest request)throws UnsupportedEncodingException {request.setCharacterEncoding("utf-8");  //此方法无用->用过滤器解决乱码System.out.println(name);model.addAttribute("msg",name);//这里name千万不能用双引号,否则页面传入的字符永远是name而非用户输入的内容return "test";}
}

5.3.5.2.使用过滤器

1. 自定义filter
  • 新建EncodingFilter.java
    在这里插入图片描述
    选择javax.servlet类型的Filter导入
package com.kuang.filter;import javax.servlet.*;
import java.io.IOException;public class EncodingFilter 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");servletResponse.setCharacterEncoding("utf-8");filterChain.doFilter(servletRequest,servletResponse);//写完过滤器去配置文件web.xml注册}@Overridepublic void destroy() {}
}
2. 修改web.xml(添加以下代码)
    <!--  filter  --><filter><filter-name>encoding</filter-name><filter-class>com.kuang.filter.EncodingFilter</filter-class></filter><filter-mapping><filter-name>encoding</filter-name><url-pattern>/*</url-pattern></filter-mapping>
  • 或直接使用已有的非官方过滤器(效果最强)
package com.kuang.filter;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 {@Overridepublic void destroy() {}@Overridepublic 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);}@Overridepublic 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;}// 对需要增强方法 进行覆盖@Overridepublic 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();}//取一个值@Overridepublic String getParameter(String name) {Map<String, String[]> parameterMap = getParameterMap();String[] values = parameterMap.get(name);if (values == null) {return null;}return values[0]; // 取回参数的第一个值}//取所有值@Overridepublic String[] getParameterValues(String name) {Map<String, String[]> parameterMap = getParameterMap();String[] values = parameterMap.get(name);return values;}
}
3. 直接使用官方提供的过滤器
  • 仅修改web.xml即可,无需新建filter相关文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><!--1.配置DispatcherServlet--><servlet><servlet-name>SpringMVC</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!--通过初始化参数指定SpringMVC配置文件的位置,进行关联--><init-param><param-name>contextConfigLocation</param-name><!-- 配置文件的位置,是在resource文件夹下的文件名 --><param-value>classpath:springmvc-controller.xml</param-value><!--     这里仍然需要配置springmvc-controller.xml文件       --></init-param><!-- 启动顺序,数字越小,启动越早 --><load-on-startup>1</load-on-startup></servlet><!--所有请求都会被springmvc拦截 --><servlet-mapping><servlet-name>SpringMVC</servlet-name><url-pattern>/</url-pattern></servlet-mapping><!--  filter  --><filter><filter-name>encoding</filter-name>
<!--        <filter-class>com.kuang.filter.EncodingFilter</filter-class>    &lt;!&ndash;一般情况下不使用自己书写的过滤器(本行)&ndash;&gt;--><!--使用官方的即可(把自定义的第32行改成如下34~38行)--><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>encoding</filter-name><url-pattern>/*</url-pattern></filter-mapping>
</web-app>
  1. 运行
    http://localhost:8080/springmvc_04_controller_war_exploded/form.jsp
    在这里插入图片描述
    点击提交后会产生乱码的问题被解决:
    http://localhost:8080/springmvc_04_controller_war_exploded/EC/t1
    在这里插入图片描述

5.3.5.3.乱码的总结部分

  • 一般情况下,SpringMVC默认的乱码处理就已经能够很好的解决了
  • 然后在web.xml中配置这个过滤器即可(无论是自定义的还是官方的都需要配置)
  • 乱码问题,需要平时多注意,在尽可能能设置编码的地方,都设置为统一编码 UTF-8

这篇关于【WEEK3】 【DAY1】数据处理及跳转之乱码问题【中文版】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/812584

相关文章

关于@MapperScan和@ComponentScan的使用问题

《关于@MapperScan和@ComponentScan的使用问题》文章介绍了在使用`@MapperScan`和`@ComponentScan`时可能会遇到的包扫描冲突问题,并提供了解决方法,同时,... 目录@MapperScan和@ComponentScan的使用问题报错如下原因解决办法课外拓展总结@

MybatisGenerator文件生成不出对应文件的问题

《MybatisGenerator文件生成不出对应文件的问题》本文介绍了使用MybatisGenerator生成文件时遇到的问题及解决方法,主要步骤包括检查目标表是否存在、是否能连接到数据库、配置生成... 目录MyBATisGenerator 文件生成不出对应文件先在项目结构里引入“targetProje

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

Python xmltodict实现简化XML数据处理

《Pythonxmltodict实现简化XML数据处理》Python社区为提供了xmltodict库,它专为简化XML与Python数据结构的转换而设计,本文主要来为大家介绍一下如何使用xmltod... 目录一、引言二、XMLtodict介绍设计理念适用场景三、功能参数与属性1、parse函数2、unpa

numpy求解线性代数相关问题

《numpy求解线性代数相关问题》本文主要介绍了numpy求解线性代数相关问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 在numpy中有numpy.array类型和numpy.mat类型,前者是数组类型,后者是矩阵类型。数组

解决systemctl reload nginx重启Nginx服务报错:Job for nginx.service invalid问题

《解决systemctlreloadnginx重启Nginx服务报错:Jobfornginx.serviceinvalid问题》文章描述了通过`systemctlstatusnginx.se... 目录systemctl reload nginx重启Nginx服务报错:Job for nginx.javas

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1

Python数据处理之导入导出Excel数据方式

《Python数据处理之导入导出Excel数据方式》Python是Excel数据处理的绝佳工具,通过Pandas和Openpyxl等库可以实现数据的导入、导出和自动化处理,从基础的数据读取和清洗到复杂... 目录python导入导出Excel数据开启数据之旅:为什么Python是Excel数据处理的最佳拍档

vue解决子组件样式覆盖问题scoped deep

《vue解决子组件样式覆盖问题scopeddeep》文章主要介绍了在Vue项目中处理全局样式和局部样式的方法,包括使用scoped属性和深度选择器(/deep/)来覆盖子组件的样式,作者建议所有组件... 目录前言scoped分析deep分析使用总结所有组件必须加scoped父组件覆盖子组件使用deep前言