【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

相关文章

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作

如何解决mysql出现Incorrect string value for column ‘表项‘ at row 1错误问题

《如何解决mysql出现Incorrectstringvalueforcolumn‘表项‘atrow1错误问题》:本文主要介绍如何解决mysql出现Incorrectstringv... 目录mysql出现Incorrect string value for column ‘表项‘ at row 1错误报错

如何解决Spring MVC中响应乱码问题

《如何解决SpringMVC中响应乱码问题》:本文主要介绍如何解决SpringMVC中响应乱码问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC最新响应中乱码解决方式以前的解决办法这是比较通用的一种方法总结Spring MVC最新响应中乱码解

pip无法安装osgeo失败的问题解决

《pip无法安装osgeo失败的问题解决》本文主要介绍了pip无法安装osgeo失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 进入官方提供的扩展包下载网站寻找版本适配的whl文件注意:要选择cp(python版本)和你py

解决Java中基于GeoTools的Shapefile读取乱码的问题

《解决Java中基于GeoTools的Shapefile读取乱码的问题》本文主要讨论了在使用Java编程语言进行地理信息数据解析时遇到的Shapefile属性信息乱码问题,以及根据不同的编码设置进行属... 目录前言1、Shapefile属性字段编码的情况:一、Shp文件常见的字符集编码1、System编码

Spring MVC使用视图解析的问题解读

《SpringMVC使用视图解析的问题解读》:本文主要介绍SpringMVC使用视图解析的问题解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC使用视图解析1. 会使用视图解析的情况2. 不会使用视图解析的情况总结Spring MVC使用视图

Redis解决缓存击穿问题的两种方法

《Redis解决缓存击穿问题的两种方法》缓存击穿问题也叫热点Key问题,就是⼀个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击,本文给大家介绍了Re... 目录引言解决办法互斥锁(强一致,性能差)逻辑过期(高可用,性能优)设计逻辑过期时间引言缓存击穿:给

Java程序运行时出现乱码问题的排查与解决方法

《Java程序运行时出现乱码问题的排查与解决方法》本文主要介绍了Java程序运行时出现乱码问题的排查与解决方法,包括检查Java源文件编码、检查编译时的编码设置、检查运行时的编码设置、检查命令提示符的... 目录一、检查 Java 源文件编码二、检查编译时的编码设置三、检查运行时的编码设置四、检查命令提示符