Servlet解决参数乱码问题
为什么会产生乱码?
之所以会产生乱码,是由于服务器端和客户端的编码方式不一致造成的。客户端与服务器端的交互过程中,存在着两次数据交换:第一次,客户端向服务器端发起请求,第二次数据交换,服务器端响应客户端的请求后做出应答,将处理结果返回给客户端。
前提了解,无论服务器端是在接受数据还是在返回数据时,如果不指定其数据编码格式,那么他就会以其默认的“iso8859-1”来编码。
首先看客户端向服务器端发出请求:
客户端的页面以何种编码方式打开某个页面,通过http协议发送请求给服务器端时,就以何种编码方式将提交数据转换成其对应的二进制数来进行http传输。这个编码方式是在页面制作时已经指定了的,最常见的是做一个html文件时通过<meta http-equiv="content-type" content="text/html; charset=UTF-8">指定编码格式为utf8。那么,在服务器端接受这些数据时就要通过utf8来将这些二进制数据进行解码。如果用其他的编码方式,比如gbk来解码,就会出现乱码。
举例:客户端传输“北京”两个字给服务器端,如果页面打开时是utf-8格式,那么就会以utf8来将“北京”转化成其对应的二进制数A:1000100111001010(瞎编的),在服务器端接收时,如果没有指定以utf8来接受这个二进制流A,那么服务器以其默认编码格式ISO8859-1来解码A,以为不同的编码方式对应的码表不一样,同样是1000100111001010,ISO8859-1可能解析不出来相应的字符,那么就会以?或者乱码来代替,然后输出,这是我们就看到了乱码。
所以我们要做的就是统一两边的编码格式,在服务器端以客户端页面的编码格式来解析传过来的二进制数据流。可在servlet的doGet()和doPost()方法中作如下操作:
页面以get方法提交表单:
处理GET 提交方法的servlet 中的doGet()方法
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { String username = request.getParameter("username");
username = new String(username.getBytes("iso8859-1"),"utf-8");//将接收来的二进制数据流以iso8859-1解码再转换成utf-8
System.out.println(username);
}
对于doPost()方法,代码如下
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { //解决post方法提交数据中的乱码问题
//
request.setCharacterEncoding("utf-8");//将解码方式设为来源网页的编码方式即可,这句话加在这个方法的第一句
String add = request.getParameter("address");
System.out.println(add); }
再看服务器端向客户端返回数据
原理基本上同客户端向服务器端发送请求,要做到两边编码方式一致。做法就是在服务器响应时,第一,设置客户端相应的http协议它的数据输出编码格式为指定的格式(假如utf8);第二将要输出的数据以utf8格式编码。
public class RequestAllexampleServlet2 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { response.setContentType("text/html;charset=utf-8");//设置http输出格式
response.setCharacterEncoding("utf-8");//设置字符编码格式
response.getWriter().write("北京"); }
访问这个Servlet结果为:
Servlet解决参数乱码问题的更多相关文章
- Servlet解决中文乱码问题
request.setCharacterEncoding("UTF-8"); 并且把这句话放在request.getParameter()之前
- jQuery Ajax传值给Servlet,在Servlet里Get接受参数乱码的解决方法
最近在学jquery ui,在做一个小功能的时候需要将前台的值获取到,通过Ajax传递给Servlet,然后再在返回数据结果,但是在Servlet接受参数的时候,通过后台打印,发现接受乱码,代码示例如 ...
- Web---演示servlet技术(servlet生命周期),解决中文乱码问题
本节讲解决中文乱码问题的4种方法. 还有更好的方法,也就是用过滤器,这里就不演示了,博主目前也不会~呼♪(^∇^*)~过段时间才会学. servlet生命周期演示: index.jsp: <%@ ...
- Servlet接收JSP参数乱码问题解决办法
转自:http://lavasoft.blog.51cto.com/62575/274527/ 环境: apache-tomcat-6.0.24.zip jdk1.6.0_16 WindosXP ...
- tomcat解决GET请求中文参数乱码
通常,在使用Spring MVC框架的应用程序中,为了解决中文参数乱码的问题,都会添加如下过滤器配置: <filter> <filter-name>encodingFilter ...
- 解决Url带中文参数乱码问题
这里我来介绍下如何配置Tomcat 来解决Url带中文参数乱码问题: 首先打开Tomcat安装目录,以Tomcat7为例,其他版本基本一样: 打开conf文件 打开server.xml 大概在70行左 ...
- url传带有汉字的参数乱码解决
url传带有汉字的参数乱码解决 var reg = new RegExp("(^|&)createName=([^&]*)(&|$)"); var r = ...
- URL传参时中文参数乱码的解决方法
URL传参时,中文参数乱码的解决: 今天在工作中遇到了这样的一个问题,在页面之间跳转时,我将中文的参数放入到url中,使用location进行跳转传参,但是发现接收到的参数值是乱码.我的代码是这样写的 ...
- 急!急!急!请问win32api参数乱码如何解决!
我想做一个QQ自动登陆,使用的QQ是2009.现在先模拟打开QQ,然后通过api调用回调函数.回调函数为一个委托方法,但是在方法中整个参数乱码,请问如何解决? 具体流程为,启动QQ,获取当前启动QQ的 ...
随机推荐
- python正则表达式re
Python正则表达式: re 正则表达式的元字符有. ^ $ * ? { [ ] | ( ).表示任意字符[]用来匹配一个指定的字符类别,所谓的字符类别就是你想匹配的一个字符集,对于字符集中的字符可 ...
- ubuntu14.04下直接修改apache2默认目录导致wordpress样式改变的解决办法
一开始看到网上有各种各样的解决方法: 第一种是直接将 sites-available目录下的000-default.conf中的下列代码: DocumentRoot /var/www/html 修改为 ...
- 有人要分享pjax吗?
安装 1.在 composer.json 的 require里 加入 "yuanchao/pjax-for-laravel-5": "dev-master" 2 ...
- LeetCode 162 Find Peak Element
Problem: A peak element is an element that is greater than its neighbors. Given an input array where ...
- yii asset 初步
yii 版本是2.0 .8 我 js 目录 web->js->login.js 页面引入js方法一: $this->registerJsFile('@web/js/login.js' ...
- UE3名称结构(Name)
解释说明: (1) 直接通过FName的index进行比较来判断两个FName是否相等 (2) 通过FName的index从全局Names数组中取出对应的FNameEntry,可以获得FName的字符 ...
- Dump类型说明
通过使用windbg提供DbgHelp库中的MiniDumpWriteDump函数在程序崩溃时写dump文件记录程序当时状态,为后续分析问题提供现场. 该函数提供了DumpType参数,让程序员根据具 ...
- Microsoft Visual Studio PDB文件相关事宜
Microsoft Visual Studio PDB:调试的符号文件,程序数据库 (PDB) 文件保存着调试和项目状态信息,使用这些信息可以对程序的调试配置: 当以 /ZI 或 /Zi(用于 C/C ...
- h5 notes
HTML5 服务器发送事件(Server-Sent Events)
- docker 实践笔记
开机默认启动docker 服务:vim /etc/rc.local 末尾加上service docker start 查看docker镜像:docker images 运行docker: