`

jsp乱码解决

    博客分类:
  • JSP
阅读更多
一、编写说明
最近一个星期在开发一个小型购物商城网站(源自课程设计),从项目规模大小、时间效率、个人基础以及学习成本等综合考虑采用jsp+servlet+mybatis+mysql架构方式。开发的第三天遇到了jsp乱码问题,这个问题纠结了半天多,过程中积累了不少经验。
二、下载链接
1、mysql下载地址:http://dev.mysql.com/downloads/
2、tomcat下载地址:http://tomcat.apache.org/download-60.cgi
3、mybatis(java版本)下载地址:http://www.mybatis.org/java.html
4、mysql访问软件navicat lite下载:http://www.onlinedown.net/softdown/87700_2.htm
三、简单描述
  jsp页面、mysql数据库、IE浏览器、tomcat容器以及mybatis映射文件等的编码方式都设置为UTF-8形式了。从jsp的form表单提交中文字段保存到数据库后出现了乱码问题。产生疑惑为:统一了编码方式为什么还会出现乱码问题呢。
四、相关内容如下
备注说明:// 注释是为了整理问题写上去的,实际代码不同。
Java代码  收藏代码

    1、jsp页面test.jsp 
     
    // jsp保存格式吗,设置为utf-8格式 
    <%@ page language="java" pageEncoding="utf-8"%> 
     
    // jsp解码格式,设置为utf-8,不设置也没问题吗 
    // 百度网上资料说,如果不设置此处,页面的中文显示有问题,试了把好像并没问题呢。何解,待研究。 
    <%@ page contentType="text/html;charset=utf-8"%> 
     
    <% 
    String path = request.getContextPath(); 
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 
    %> 
     
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
    <html> 
      <head> 
        <base href="<%=basePath%>"> 
        <title>jsp乱码问题</title> 
         
        // 提示浏览器采用utf-8编码格式处理 
        <meta http-equiv="content-type" content="text/html; charset=utf-8">  
      </head> 
        <body> 
        //提交到TestServlet.java类处理表单 
        <form action="testServlet" method="post"> 
         <table> 
           <tr> 
             <td> 
             用户昵称* 
             </td> 
             <td> 
             <input type="text" name="username" /> 
             </td> 
           </tr> 
     
           <tr> 
             <td> 
               
             </td> 
             <td> 
             <input type="submit" value="提交测试"/> 
             </td> 
           </tr> 
         </table> 
        </form> 
        </body> 
    </html> 


Java代码  收藏代码

    2、tomcat下web.xml配置如下 
      <?xml version="1.0" encoding="UTF-8"?> 
      <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee  
        http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 
     
        <servlet> 
            <servlet-name>testServlet</servlet-name> 
            <servlet-class>com.test.TestServlet</servlet-class> 
        </servlet> 
     
        <servlet-mapping> 
            <servlet-name>testServlet</servlet-name> 
            <url-pattern>/testServlet</url-pattern> 
        </servlet-mapping> 
     
      </web-app> 

  3、TestServlet.java如下
  // 在servlet层出现了乱码问题
Java代码  收藏代码

    package com.test; 
     
    import java.io.IOException; 
     
    import javax.servlet.ServletException; 
     
    import javax.servlet.http.HttpServlet; 
    import javax.servlet.http.HttpServletRequest; 
    import javax.servlet.http.HttpServletResponse; 
     
    public class TestServlet extends HttpServlet { 
     
        public void doGet(HttpServletRequest request, HttpServletResponse response) 
                throws IOException, ServletException { 
            // 处理get提交方式 
            this.doPost(request, response); 
        } 
     
        public void doPost(HttpServletRequest request, HttpServletResponse response) 
                throws IOException, ServletException { 
            // 处理post提交方式 
            String username = request.getParameter("username"); 
            // servlet层测试乱码 
            System.out.println("servlet = "+username); // 显示成了乱码 
        } 
    } 


4、初步判定
    通过的servlet-web层打印出字符串就显示成了乱码格式、那么再通过dao层插入到数据库后肯定是乱码的,问题定位在jsp页面到servlet代码之间,就要考虑jsp、IE、tomcat容器的编码方式了。前面已经说明了,全部设置成了utf-8格式了,所以进一步查看了网上许多解决方案,解决方案比较多比较乱,针对我遇到的问题,我从中提取和学习了下面的一些知识内容。

5、提取内容
    一、表单post方式提交——中文字段出现乱码,也就是上面例子描述的问题了。
       1、原因为tomcat的内部编码格式为ISO-8859-1,在没有设置提交的编码格式时会以ISO-8859-1的方式提交,而此时jsp编码格式为utf-8
          所以导致了乱码产生。解决办法如下三种,怀着好奇心都尝试了一把。
       2、方法:接收参数时进行转码、在请求页面开始处设置编码格式、过滤器处理。
       3、具体实现代码如下所示:     
Java代码  收藏代码

    (1)转码方式 
            String username = request.getParameter("username"); 
        // 进行转码操作处理 
        username = new String(username.getBytes("iso-8859-1"),"utf-8"); 
             
        // servlet层测试乱码 
        System.out.println("servlet = "+username); 

     
Java代码  收藏代码

    (2)设置编码格式 
            // 在请求的开始设置为utf-8格式 
            request.setCharacterEncoding("utf-8"); 

     
Java代码  收藏代码

    (3)过滤器方式 
        web.xml配置文件中添加上filter配置 
        <filter> 
            <filter-name>JspEncodingFilter</filter-name> 
            <filter-class>com.test.JspEncodingFilter</filter-class> 
            <init-param> 
                <param-name>jspEncoding</param-name> 
                <param-value>utf-8</param-value> 
            </init-param> 
        </filter> 
        <filter-mapping> 
            <filter-name>JspEncodingFilter</filter-name> 
            <url-pattern>/*</url-pattern> 
        </filter-mapping> 
        对应的类如下: 
        package com.test; 
     
        import java.io.IOException; 
     
        import javax.servlet.Filter; 
        import javax.servlet.FilterChain; 
        import javax.servlet.FilterConfig; 
     
        import javax.servlet.ServletException; 
        import javax.servlet.ServletRequest; 
        import javax.servlet.ServletResponse; 
     
        public class JspEncodingFilter implements Filter { 
     
            private String jspEncoding = null; 
             
            public void destroy() { 
            } 
     
            public void doFilter(ServletRequest arg0, ServletResponse arg1, 
                    FilterChain arg2) throws IOException, ServletException { 
                arg0.setCharacterEncoding(jspEncoding); // 设置编码格式 
                arg1.setContentType("text/html;charset="+jspEncoding); 
                arg2.doFilter(arg0, arg1); 
            } 
     
            public void init(FilterConfig arg0) throws ServletException { 
                this.jspEncoding = arg0.getInitParameter("jspEncoding"); 
            } 
        } 
        // 其他乱码问题待以后遇到再研究学习。 
        // tomcat下get方式提交解决方案等等。 


五、后续问题
  认识到上面这些知识后,局部解决了乱码问题。在servlet层打印出参数值没有乱码问题,通过navicat lite连接上mysql数据库发现为乱码问题。从servlet-web层到自定义的biz业务层再到mybatis的dao层,通过单元测试junit跟踪发现没有出现问题。最后将问题定位在mysql层面,我通过mysql管理工具navicat lite对原来的数据库、表、字段都设置了编码格式。

  1、数据库属性中将Character set选择为utf--UTF-8 Unicode,将Collation选择为utf8_general_ci
  2、对应的表、字段都选择到了utf-8设置。
  重新进行插入操作,发现到了数据库还是乱码问题,接下来尝试避开navicat lite设置下mysql。

  1、C:\Program Files\MySQL\MySQL Server 5.5 目录下找到了my配置文件,将latin1换成了default-character-set=utf8,character-set-server=utf8
  2、启动mysql.exe进入后通过set names utf8;关闭后重启启动tomcat、mysql,从jsp页面提交一个表单,发现mysql数据库还是乱码显示
  3、通过navicat lite查看的却是正常中文编码。到了这一步我费解了。
六、想法总结
  通过第五步的操作,我开始有点不淡定了,mysql怎么这样呢。于是好奇地将set names gbk,发现显示没有问题。为什么utf-8出了问题呢。于是我重新卸载了mysql5.1版本、从官网下载了一个mysql5.5。安装完毕发现原始数据还在,这个又是为什么呢,我用360强力删除的。
  总结1、解决问题的思路有待提高。
  总结2、遇到问题要冷静、淡定,多学会总结。
  备注:一不小心写成了意识流、技术文档总结能力有待提高。
分享到:
评论

相关推荐

    Termux (Android 5.0+).apk.cab

    Termux (Android 5.0+).apk.cab

    基于go、vue开发的堡垒机系统(运维安全审计系统)全部资料+详细文档.zip

    【资源说明】 基于go、vue开发的堡垒机系统(运维安全审计系统)全部资料+详细文档.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    葡萄城手册,快速上手,灵活报表

    制作报表

    基于C++与Qt的金山培训大作业源码汇总

    本项目为金山培训大作业源码汇总,采用C++与Qt技术构建,包含401个文件,涵盖106个C++源文件、72个头文件、41个PNG图片、27个项目文件以及HTML、JavaScript、CSS等多种文件类型。项目包含四个主要模块:KVector向量库、命令行会议系统、KSvg绘图板和KHttp音乐播放器。尽管最终未能入选,但展现了作者在C++编程和Qt框架应用方面的扎实功底和努力。

    (26408240)STM32F103+四个VL53L0代码(2020新).zip

    内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

    基于课程设计:C语言爬虫、详细文档+全部资料+高分项目.zip

    【资源说明】 基于课程设计:C语言爬虫、详细文档+全部资料+高分项目.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    (176629254)杭州电子科技大学自动控制原理期末试卷答案 复习ppt

    《自动控制原理》是自动化及相关专业的重要课程,涵盖了控制系统的基础理论和分析方法。这份资料集是针对杭州电子科技大学自动控制原理课程的期末复习资源,包含了试卷答案和复习PPT,对于学习者来说是一份非常宝贵的参考资料。 我们来看文件"9自控原理第五章习题参考答案.doc",它提供了第五章的习题解答。第五章通常涉及根轨迹法,这是分析线性系统稳定性的一种图形方法。通过绘制根轨迹,我们可以直观地理解系统动态性能的变化,例如系统的稳定性、超调量和调节时间等。 接着,"1第一章作业(答案).docx"涵盖了课程的初步概念,如控制系统的基本组成部分、控制系统的定义以及开环与闭环控制的区别。第一章的内容通常包括控制系统的基本模型,如传递函数和信号流图。 "10测试4.docx"和"13第7章测试.docx"可能是关于控制系统设计和分析的测试题目,可能涉及到频率响应分析或状态空间模型等内容。第七章常常讨论系统稳定性分析,比如奈奎斯特稳定判据或劳斯判据。 "7测试1.docx"可能包含有关拉普拉斯变换和控制系统动态特性的问题,这是控制系统分析的基础工具。 "4自动控制第二章习题答案.pdf"提供了第二章习题

    066 - 直播逗大哥话术.docx

    066 - 直播逗大哥话术

    AOP项目demo 案例

    AOP项目demo 案例

    皮带输送线3D+2DCAD+加工件标准件清单BOMsw2016可编辑全套技术资料100%好用.zip

    皮带输送线3D+2DCAD+加工件标准件清单BOMsw2016可编辑全套技术资料100%好用.zip

    154-基于stm32单片机花样流水灯设计Proteus仿真+源程序.zip

    154-基于stm32单片机花样流水灯设计Proteus仿真+源程序.zip

    鲸鱼WOA-XGboost拟合预测建模模型,数据格式多维自变量输入,单维因变量输出,直接替数据就可以使用,程序内注释详细

    鲸鱼WOA-XGboost拟合预测建模模型,数据格式多维自变量输入,单维因变量输出,直接替数据就可以使用,程序内注释详细

    基于springboot的学生综合成绩测评系统源码(java毕业设计完整源码).zip

    项目均经过测试,可正常运行! 环境说明: 开发语言:java JDK版本:jdk1.8 框架:springboot 数据库:mysql 5.7/8 数据库工具:navicat 开发软件:eclipse/idea

    RocketDock-v1.3.5

    RocketDock-v1.3.5是一款专为Windows 7设计的桌面工具,它模仿Mac OS X的Dock功能,通过直观的图标排列提高应用启动效率。该工具提供快捷启动、动画效果、自定义设置以及扩展性,使用户能够根据个人喜好调整Dock栏并减少桌面杂乱。安装和设置过程简单,配有详细的说明文件,帮助用户更好地了解和使用工具。

    基于springboot的会员制医疗预约服务管理信息系统源码(java毕业设计完整源码+LW).zip

    会员制医疗预约服务管理信息系统的作用,可以提高会员制医疗预约服务管理的工作人员的效率,协助他们对会员制医疗预约服务信息进行统一管理,为管理者提供信息储存和查询搜索系统。一个良好的会员制医疗预约服务管理信息系统可以实现对会员制医疗预约服务的精细化管理:对在线会员制医疗预约服务管理流程的全过程进行电子化操作,其主要作用是管理和控制会员制医疗预约服务所有的信息,分析库存数据,使工作人员对会员制医疗预约服务管理信息系统进行监管,根据系统所提供的相应信息,采取适当的措施,及时补救管理中的漏洞,提高在线会员制医疗预约服务管理的工作效率,使得在线会员制医疗预约服务管理变的更加系统和规范。 环境说明: 开发语言:java JDK版本:jdk1.8 框架:springboot 数据库:mysql 5.7/8 数据库工具:navicat 开发软件:eclipse/idea

    (2368806)CCNA中文版PPT

    **CCNA(思科认证网络助理工程师)是网络技术领域中的一个基础认证,它涵盖了网络基础知识、IP编址、路由与交换技术等多个方面。以下是对CCNA中文版PPT中可能涉及的知识点的详细说明:** ### 第1章 高级IP编址 #### 1.1 IPv4地址结构 - IPv4地址由32位二进制组成,通常分为四段,每段8位,用点分十进制表示。 - 子网掩码用于定义网络部分和主机部分,如255.255.255.0。 - IP地址的分类:A类、B类、C类、D类(多播)和E类(保留)。 #### 1.2 子网划分 - 子网划分用于优化IP地址的分配,通过借用主机位创建更多的子网。 - 子网计算涉及掩码位数选择,以及如何确定可用的主机数和子网数。 - CIDR(无类别域间路由)表示法用于更有效地管理IP地址空间。 #### 1.3 私有IP地址 - 为了节省公网IP地址,私有IP地址被用于内部网络,如10.0.0.0/8,172.16.0.0/12,192.168.0.0/16。 #### 1.4 广播地址 - 每个网络都有一个特定的广播地址,所有数据包都会发送到这个地址以达到同一网络内的所有设备。

    基于springboot的藏区特产销售平台源码(java毕业设计完整源码+LW).zip

    项目实现了对特产信息管理、特产分类管理、特产分类管理、特产评分管理、系统管理、订单管理等业务进行管理。 环境说明: 开发语言:java JDK版本:jdk1.8 框架:springboot 数据库:mysql 5.7/8 数据库工具:navicat 开发软件:eclipse/idea

    “个人事务云服务”:日常事务管理系统的云计算应用

    随着21世纪网络和计算机技术的飞速发展,它们已经与我们的日常生活紧密融合。当前网络的运行速度已经达到千兆级别,覆盖范围广泛,深入到生活的每一个角落。这一进步推动了管理系统的发展,使得远程处理事务、远程工作信息管理和实时追踪工作状态成为可能。网上管理系统以其前所未有的体验满足了新时代的工作需求,因此得到了大力发展。 本系统是一个个人日常事务管理系统,利用计算机和网络技术开发的在线平台,能够实现日常安排、消费记录和重要提醒设置等功能。系统采用SSM框架和Vue技术,数据库使用MySQL,开发环境为Eclipse。系统用户角色包括普通用户和管理员,功能涵盖个人中心管理、用户管理、日常安排管理、消费记录管理和重要提醒管理。用户可以记录消费、安排日常事务和设置重要提醒,而管理员则负责管理用户信息和基础数据信息。该系统不仅方便了用户和管理员,还提高了个人事务管理的效率,更适应现代人的生活方式。

    基于java+springboot+mysql+微信小程序的考研资料分享系统 源码+数据库+论文(高分毕业设计).zip

    项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea、微信开发者工具 数据库:MySql5.7以上 部署环境:maven 数据库工具:navicat

    如何使用Python和PIL库生成带竖排文字的封面图像

    如何使用Python和PIL库生成带竖排文字的封面图像

Global site tag (gtag.js) - Google Analytics