【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

相关文章

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决

Mysql如何解决死锁问题

《Mysql如何解决死锁问题》:本文主要介绍Mysql如何解决死锁问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录【一】mysql中锁分类和加锁情况【1】按锁的粒度分类全局锁表级锁行级锁【2】按锁的模式分类【二】加锁方式的影响因素【三】Mysql的死锁情况【1

SpringBoot内嵌Tomcat临时目录问题及解决

《SpringBoot内嵌Tomcat临时目录问题及解决》:本文主要介绍SpringBoot内嵌Tomcat临时目录问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录SprinjavascriptgBoot内嵌Tomcat临时目录问题1.背景2.方案3.代码中配置t

SpringBoot使用GZIP压缩反回数据问题

《SpringBoot使用GZIP压缩反回数据问题》:本文主要介绍SpringBoot使用GZIP压缩反回数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot使用GZIP压缩反回数据1、初识gzip2、gzip是什么,可以干什么?3、Spr

如何解决idea的Module:‘:app‘platform‘android-32‘not found.问题

《如何解决idea的Module:‘:app‘platform‘android-32‘notfound.问题》:本文主要介绍如何解决idea的Module:‘:app‘platform‘andr... 目录idea的Module:‘:app‘pwww.chinasem.cnlatform‘android-32

kali linux 无法登录root的问题及解决方法

《kalilinux无法登录root的问题及解决方法》:本文主要介绍kalilinux无法登录root的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录kali linux 无法登录root1、问题描述1.1、本地登录root1.2、ssh远程登录root2、

SpringBoot应用中出现的Full GC问题的场景与解决

《SpringBoot应用中出现的FullGC问题的场景与解决》这篇文章主要为大家详细介绍了SpringBoot应用中出现的FullGC问题的场景与解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录Full GC的原理与触发条件原理触发条件对Spring Boot应用的影响示例代码优化建议结论F

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

Pyserial设置缓冲区大小失败的问题解决

《Pyserial设置缓冲区大小失败的问题解决》本文主要介绍了Pyserial设置缓冲区大小失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录问题描述原因分析解决方案问题描述使用set_buffer_size()设置缓冲区大小后,buf

resultMap如何处理复杂映射问题

《resultMap如何处理复杂映射问题》:本文主要介绍resultMap如何处理复杂映射问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录resultMap复杂映射问题Ⅰ 多对一查询:学生——老师Ⅱ 一对多查询:老师——学生总结resultMap复杂映射问题