1.前言

  相信很多初学者在学习javaWeb基础知识时,总会遇到各种各样的乱码问题,我也是从那个时候过来的。当时遇到各种乱码问题,只能通过面向百度的方式,解决各种乱码问题,乱码虽然问题能解决,但是总是知其然不知其所以然。如果你也存在一些疑惑,并且仔细阅读这篇文章,我相信我会帮助到你。

2.请求参数传递乱码问题

解决的办法

  先看参数传递方式

    1.form表单(get提交)、url传参、超链接在这里我统归于get参数传递方式

    2.form表单(post提交)、request请求转发在这里我统归于post参数传递方式

  再看Tomcat版本号

    1.Tomcat 8及以上版本

    2.Tomcat 8以下版本

举例:

  example1:get参数传递方式 + Tomcat 8 以下版本 

  这种情况下,会出现乱码问题,讲清楚这个东西,需要先了解一个Tomcat的连接器组件(Connector):

  Connector是Tomcat中的一个重要的组件,它负责监听Tomcat收到的请求信息,并将这些请求信息传递给Servlet规范中所定义的Request,然后将转换后的请求交给Engine组件去处理,最后将Engine返回的Response返回给客户端。

  Connector对象的构造方法在Tomcat 7.x的版本是这样的:

 protected String URIEncoding = null;
public Connector(String protocol) {
setProtocol(protocol);
try {
Class<?> clazz = Class.forName(protocolHandlerClassName);
this.protocolHandler = (ProtocolHandler) clazz.newInstance();
} catch (Exception e) {
log.error(sm.getString(
"coyoteConnector.protocolHandlerInstantiationFailed"), e);
}
}

  在代码中我们并没有看到它去设置URIEncoding,那么在封装GET请求时,如果该字段的值为null,则会在解析的GET请求时,赋予默认值:ISO-8859-1,而ISO-8859-1是不包含中文的,所以自然会出现中文乱码,这个时候,我们可能会尝试使用这种下面方式处理乱码问题:

request.setCharacterEncoding("utf-8");

  但是,在 get参数传递方式 + Tomcat 8 以下版本 这种环境下,上面的方式处理不了乱码问题,遇到这种情况,通常解决方式有两种:

  1.如果方便找到Tomcat 的配置文件,修改Tomcat的配置文件(conf/server.xml)

    Tomcat 的server.xml配置文件有这样一段: 

<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000" redirectPort="8443" />

    在Connector这个标签内,是没有URIEncoding这个属性的,那么加上这个属性更改为:

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

    重启Tomcat服务器,就能解决了。

  2.获得参数前进行编码方式转换

    当使用一些内置的Tomcat服务器(例如MyEclipse中内置了Tomcat服务器),修改配置文件显然不是一个好方式,反正我是没找到MyEclipse的Tomcat配置文件。。。又或者不想使用上面的方式,那么这个时候可以使用下面这种方式:

    例如:想要获得表单传递过来的一个username参数,可以进行下面的操作:

String username = new String (request.getParameter("username").getBytes("iso8859-1"),"utf-8");

    这样username的值就不会是乱码了。

  example2:get参数传递方式 + Tomcat 8 及以上版本 

  在这种情况下,不会出现乱码问题,还是上面的Tomcat 组件Connector,在Tomcat 8 中该对象的构造方法为:

 protected String URIEncoding = null;
public Connector(String protocol) {
setProtocol(protocol);
ProtocolHandler p = null;
try {
Class<?> clazz = Class.forName(protocolHandlerClassName);
p = (ProtocolHandler) clazz.getDeclaredConstructor().newInstance();
} catch (Exception e) {
log.error(sm.getString(
"coyoteConnector.protocolHandlerInstantiationFailed"), e);
} finally {
this.protocolHandler = p;
} if (!Globals.STRICT_SERVLET_COMPLIANCE) {
URIEncoding = "UTF-8";
URIEncodingLower = URIEncoding.toLowerCase(Locale.ENGLISH);
}
}

  与上面的Tomcat 7中的Connector构造器对比就可以发现,URIEncoding的默认值为UTF-8,所以get方式请求传递的中文参数我们就不需要处理了。

  

  example3:post参数传递方式 + Tomcat

  使用post参数传递方式,无论是Tomcat 8 版本前后,都需要进行乱码处理,通过网络抓包,我们可以看到post方式传递的参数会放在请求体中,这也是与get方式的一点不同之处(get方式传递的参数从url地址栏中能看到,是放在请求行中的),处理post方式的中文乱码,实际上是处理流的编码,说了这么多,其实只需要在获得参数前,加上这样一行代码即可:

request.setCharacterEncoding("utf-8");

  就会发现 post参数传递方式 + Tomcat 中文传参问题解决了。

3.响应数据乱码问题      

  响应数据乱码经常的表现形式是:浏览器接收到服务器端的响应数据后,呈现在页面,页面出现了乱码。

  这种解决方式很简单。

  直接 response.setContentType("text/html;charset=utf-8");

4.结语

  以上总结了关于一些常见中文参数传递乱码的解决方式,有什么问题可以留言,我们一起讨论。上诉总结如有不正确之处,希望能够指出,我定当认真修复,谢谢。

转载请注明出处!

参考:

https://www.jianshu.com/p/0ff9cbfc1cca

  

    

jsp和servlet开发过程中参数传递乱码问题总结的更多相关文章

  1. 【WEB】jsp向servlet传参中文乱码问题解决

    传参方式:POST.GET.link方式 servlet向jsp传中文参数msg if(username.equals("") || password.euqals("& ...

  2. jsp与servlet之间的参数传递【转】

    JSP与 servlet之间的传值有两种情况:JSP -> servlet, servlet -> JSP. 通过对象 request和 session (不考虑 application) ...

  3. JSP写入MySQL数据库中出现乱码问题笔记

    1.在数据库链接字符串上要形如:jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=UTF-8(注意要加chara ...

  4. spring mvc开发过程中的乱码问题

    在保证jsp,xml,数据库,编辑器编码一致的情况下. 1,用户输入中文,后台接收到也是中文,但是保存到数据库时乱码, 解决方法: 链接数据库的url="jdbc:mysql://local ...

  5. Web(Jsp+ Servlet)开发中如何解决中文乱码问题

    1.中文乱码的成因 编码的字符集和解码的字符集不一致. 2.web开发过程中可能出现的乱码的位置及解决方案 ①request乱码 在向服务器传递数据时,所传递的中文有可能出现乱码. post请求(协议 ...

  6. jsp和servlet中文乱码

    jsp和servlet之间出现中文乱码的集中原因和解决方法详解:http://blog.csdn.net/longyuhome/article/details/7856270

  7. Java编程中中文乱码问题的研究及解决方案

    0 引言 Java最大的特性是与平台的无关性及开发环境的多样性.字符串被Java应用程序转化之前,是根据操作系统默认的编码方式编码.Java语言内部采用Unicode编码,它是定长双字节编码,即任何符 ...

  8. [转]JSP或servlet中(以及上传下载文件)中文乱码或不显示的解决方案

    时间 2014-04-14 14:33:44  CSDN博客 原文  http://blog.csdn.net/xby1993/article/details/23677375 主题 ServletJ ...

  9. 【转】解决jsp参数传递乱码的问题

    解决jsp参数传递乱码的问题 计算机生于美国,英语是他的母语,而英语以外的其它语言对他来说都是外语.他跟我们一样,不管外语掌握到什么程度,也不会像母语那样使用得那么好,时常也会出一些“拼写错误”问题. ...

随机推荐

  1. STM32F072从零配置工程-基于HAL库的串口UART中断配置

    先上一个采用串口直接传输的Demo: 此处的思路是完全采用HAL库来实现的,核心是运用HAL_UART_Transmit_IT和HAL_UART_Receive_IT两个函数来实现的,可以作为一个De ...

  2. 渐进式web应用开发---promise式数据库(五)

    在前面的一篇文章中,我们已经实现了使用indexedDB实现ajax本地数据存储的功能,详情,请看这篇文章.现在我们需要把上面的一篇文章中的代码使用promise结构来重构下.我们为什么需要使用pro ...

  3. Excel催化剂开源第7波-VSTO开发中Ribbon动态加载菜单

    在VS开发环境中,特别是VSTO的开发,微软已经现成地给开发者准备了设计器模式的功能区开发,相对传统的VBA.ExcelDna和其他方式的COM加载项开发来说,不需要手写xml功能区,直接类似拖拉窗体 ...

  4. [ZJOI]2008 生日聚会

    显然DP. 将题目转化下: 求由n个0.m个1组成,且满足任意子串0的数量和1的数量差绝对值不超过k的01串数量.n, m≤150,k≤20. 直接做没什么思路,,那我们尽量利用题目的时间和空间限制, ...

  5. window平台下 cmd 命令窗口的编码设置

    在WINDOWS上打开控制台界面,发现默认的编码是GBK,这样有时候写完的代码运行的时候就会出码,基于此,查阅各方资料,终于得出两种方案. 一.临时解决方案(只针对本次会话有效) 1. 打开控制台,输 ...

  6. linux初学者-磁盘拉伸缩减篇

    linux初学者-磁盘拉伸缩减篇 在系统的使用过程中,往往会出现这样的问题,由于刚开始无法估计需要的磁盘空间,导致后期磁盘空间不够,使得数据没地方存储,又或者后期磁盘空间过大,造成资源的浪费.这种在使 ...

  7. 剖析std::function接口与实现

    目录 前言 一.std::function的原理与接口 1.1 std::function是函数包装器 1.2 C++注重运行时效率 1.3 用函数指针实现多态 1.4 std::function的接 ...

  8. textarea的拖拽怎么解决

    textarea文本域在页面中是可以拖动的,即时你给了固定的宽度和高度,但这在我们页面布局中,使我们不需要的,因为可拖拽很多时候会影响我们页面的布局和整体的美观度. css3提供了一个resize属性 ...

  9. Ubuntu下Mongo的安装和笔记

    在linux下的安装 打开https://www.mongodb.com/download-center#community选择linux然后选择自己的Version复制DOWNLOAD旁边的链接 打 ...

  10. set和map结构,class类

    1.set数据结构和map数据结构: (1)set: 数据结构set(集合,无序且值不能重复的数据集合,特点是key值和value值相同,没有重复的value //1 创建set ,,]) conso ...