zoukankan      html  css  js  c++  java
  • Debug

    问题描述

    UTF-8 和 GBK 就像魔咒一样长久地困扰着程序设计人员!

    今天在 jsp 页面使用 get 和 post 向 action 提交数据时中文发生乱码

    通过在服务器和页面设置编码方式都没用

    PSOST

    post 好解决,正常来说加一句 request.setCharacterEncoding("utf-8"); 就行了

    设置完还是没用,最后发现是我自己的疏忽,form 表单的一个属性忘写了

    这是我的表单

    <form action="${pageContext.request.contextPath}/from.action">
        用户名:<input type="text" placeholder="请输入用户名..." name="username"><br/>
        昵称:<input type="text" placeholder="请输入用户名..." name="nick"><br/>
        爱  好: <input type="checkbox" value="足球" name="hobby">足球
        <input type="checkbox" value="篮球" name="hobby">篮球
        <input type="checkbox" value="乒乓" name="hobby">乒乓球<br/>
        <input type="submit" value="提交">
      </form>
    

    在 form 标签里面没有指定 method 属性,所以当前是以默认方法 Get 提交,而页面上所有的编码设置对于 Get 方法是彻底无效的,只要指定提交方式为 post 就行了

     method="post"
    

    GET

    那 get 就麻烦了呀,刚才说了所有的编码设置对于 Get 方法是彻底无效的,那只能通过配置方法来解决了

    将项目所涉及到的配置全部确认一遍,一个个来,全部设置成所需编码。以我当前项目(IDEA + Tomcat + Struts2)为例

    整个项目的编码

    打开 IDEA -> File -> Settings -> File Encodings 配置项目编码

    Jsp 文件头

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    

    Struts2 设置编码常量

    <constant name="struts.i18n.encoding" value="UTF-8" />
    

    Tomcat 编码

    打开 Tomcat 安装目录中 conf 文件夹下的 server.xml,添加URIEncoding="UTF-8"

    <Connector port="8080" protocol="HTTP/1.1"
      connectionTimeout="20000"
      redirectPort="8443" URIEncoding="UTF-8"/>
    

    添加一个过滤器(可选)

    前面的几项缺一不可,这项是为了保险起见,可选

    在 web.xml 中添加如下过滤器代码

    <filter>
        <filter-name>encodeFilter</filter-name>
        <filter-class>work.douzi.utils.MyEncodingIntercpter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodeFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    

    其中 MyEncodingIntercpter 类的代码如下

    package work.douzi.utils;
    
    import org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter;
    
    import javax.servlet.*;
    import java.io.IOException;
    
    public class MyEncodingIntercpter extends StrutsPrepareAndExecuteFilter
            implements Filter {
    
        private FilterConfig config = null;
        private String encoding = null;
    
        @Override
        public void init(FilterConfig config) throws ServletException {
            this.config = config;
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response,
                             FilterChain chain) throws IOException, ServletException {
            if(encoding==null){
                encoding = config.getInitParameter("encoding");
                System.out.println("encoding = "+encoding);
            }
            request.setCharacterEncoding(encoding);
            response.setCharacterEncoding(encoding);
            response.setContentType("text/html;charset=" + encoding);
            chain.doFilter(request, response);
        }
    
        @Override
        public void destroy() {
            config = null;
            encoding = null;
        }
    
    }
    

    全部确认一遍,一般就能解决了。如果还会乱码,再想想是不是漏掉了哪个配置文件


  • 相关阅读:
    [SDOI2011] 消防 (树的直径,尺取法)
    [HNOI2006]公路修建问题 (二分答案,并查集)
    P1875 佳佳的魔法药水 (最短路,DP)
    [SCOI2016] 背单词 (Trie 树,贪心)
    [USACO08DEC] 秘密消息Secret Message (Trie树)
    [HDU4745] Two Rabbits (区间DP)
    [HDU4362] Palindrome subsequence (区间DP)
    评价手心输入法
    软件工程个人作业12
    第12周进度条
  • 原文地址:https://www.cnblogs.com/mdz3201/p/12636269.html
Copyright © 2011-2022 走看看