java servlet 参数乱码_JSP&Servlet处理参数中的中文乱码总结

从form表单提交信息到一个JSP页面或者一个Servlet进行处理的时候,提交的中文信息若不加处理的话就会显示乱码,如一串???。现在通过一个例子来进行总结如下:

写一个用户信息提交页面,通过这个页面向一个JSP页面或者一个servlet提交用户信息,代码如下:

1

4f1150b881333f12a311ae9ef34da474.png24f1150b881333f12a311ae9ef34da474.png34f1150b881333f12a311ae9ef34da474.png

4 4f1150b881333f12a311ae9ef34da474.png表单提交5 4f1150b881333f12a311ae9ef34da474.png6 4f1150b881333f12a311ae9ef34da474.png7 4f1150b881333f12a311ae9ef34da474.png8 4f1150b881333f12a311ae9ef34da474.png        用户名:
9 4f1150b881333f12a311ae9ef34da474.png        密  码:
10 4f1150b881333f12a311ae9ef34da474.png        爱  好:运动 11 4f1150b881333f12a311ae9ef34da474.png音乐
12 4f1150b881333f12a311ae9ef34da474.png  13 4f1150b881333f12a311ae9ef34da474.png14 4f1150b881333f12a311ae9ef34da474.png15 4f1150b881333f12a311ae9ef34da474.png

现在写deal处理页面,代码如下:

1

4f1150b881333f12a311ae9ef34da474.png24f1150b881333f12a311ae9ef34da474.png34f1150b881333f12a311ae9ef34da474.png

4 4f1150b881333f12a311ae9ef34da474.png显示用户信息5 4f1150b881333f12a311ae9ef34da474.png6 4f1150b881333f12a311ae9ef34da474.png7 4f1150b881333f12a311ae9ef34da474.png//request.setCharacterEncoding("gb2312");9 4f1150b881333f12a311ae9ef34da474.pngString username=request.getParameter("username");10 4f1150b881333f12a311ae9ef34da474.png//String username = new String(request.getParameter("username").getBytes("iso-8859-1"),"gbk");11 4f1150b881333f12a311ae9ef34da474.pngString password=request.getParameter("password");12 4f1150b881333f12a311ae9ef34da474.png//String love = new String(request.getParameter("love").getBytes("iso-8859-1"),"gbk");13 4f1150b881333f12a311ae9ef34da474.pngString love=request.getParameter("love");14 4f1150b881333f12a311ae9ef34da474.png%>15 4f1150b881333f12a311ae9ef34da474.png您好,你的密码是:,您的爱好是:!16 4f1150b881333f12a311ae9ef34da474.png17 4f1150b881333f12a311ae9ef34da474.png

从前面的信息提交页面提交来的信息包含中文,这时就会出现乱码。如:

4f1150b881333f12a311ae9ef34da474.png??????您好,你的密码是:1234569,您的爱好是:????!

现在,把第8行的注释符号去掉,重新执行页面(请确保web服务器会自动加载更改后的页面,否则请重新启动web服务器),这时可以看到正确的中文信息了,如:

4f1150b881333f12a311ae9ef34da474.png王冰您好,你的密码是:9856322,您的爱好是:音乐!

也可以使用另外一种方法进行处理,把deal.jsp的第8行注释掉,然后把第9行、第13行也注释掉,去掉第10行和第12行的注释符号,保存好重新执行页面(方法同上),同样会显示正常的信息。

下面通过前面的信息提交页面向一个servlet提交信息,然后对其中的中文乱码进行处理。写一个servlet程序(formdeal.java),如下:

1

4f1150b881333f12a311ae9ef34da474.pngpackageorg.wzhongyu;24f1150b881333f12a311ae9ef34da474.png34f1150b881333f12a311ae9ef34da474.pngimportjava.io.IOException;44f1150b881333f12a311ae9ef34da474.pngimportjava.io.PrintWriter;54f1150b881333f12a311ae9ef34da474.pngimportjavax.servlet.ServletException;64f1150b881333f12a311ae9ef34da474.pngimportjavax.servlet.http.HttpServlet;74f1150b881333f12a311ae9ef34da474.pngimportjavax.servlet.http.HttpServletRequest;84f1150b881333f12a311ae9ef34da474.pngimportjavax.servlet.http.HttpServletResponse;94f1150b881333f12a311ae9ef34da474.png101fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublicclassformdealextendsHttpServlet{1197e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicvoiddestroy(){12d18c02628675d0a2c816449d98bda930.pngsuper.destroy();//Just puts "destroy" string in log13d18c02628675d0a2c816449d98bda930.png//Put your code here14ecedf933ec37d714bd4c2545da43add2.png}15d18c02628675d0a2c816449d98bda930.png16d18c02628675d0a2c816449d98bda930.pngpublicvoiddoGet(HttpServletRequest request, HttpServletResponse response)1797e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifthrowsServletException, IOException{18d18c02628675d0a2c816449d98bda930.pngthis.doPost(request, response);19ecedf933ec37d714bd4c2545da43add2.png    }20d18c02628675d0a2c816449d98bda930.png21d18c02628675d0a2c816449d98bda930.pngpublicvoiddoPost(HttpServletRequest request, HttpServletResponse response)2297e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifthrowsServletException, IOException{23d18c02628675d0a2c816449d98bda930.png//response.setContentType("text/html; charset=gbk");24d18c02628675d0a2c816449d98bda930.pngPrintWriter out=response.getWriter();25d18c02628675d0a2c816449d98bda930.png//request.setCharacterEncoding("gbk");26d18c02628675d0a2c816449d98bda930.pngString username=request.getParameter("username");27d18c02628675d0a2c816449d98bda930.png        String password=request.getParameter("password");28d18c02628675d0a2c816449d98bda930.png        String love=request.getParameter("love");29d18c02628675d0a2c816449d98bda930.png        out.print("您的用户名:"+username+"
");//30d18c02628675d0a2c816449d98bda930.pngout.print("您的密码:"+password+"
");//31d18c02628675d0a2c816449d98bda930.pngout.print("您的爱好:"+love);//32ecedf933ec37d714bd4c2545da43add2.png}3397e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicvoidinit()throwsServletException{34d18c02628675d0a2c816449d98bda930.png//Put your code here35ecedf933ec37d714bd4c2545da43add2.png}368f1ba5b45633e9678d1db480c16cae3f.png}374f1150b881333f12a311ae9ef34da474.png

该servlet的部署描述文件(web.xml)如下:

1

4f1150b881333f12a311ae9ef34da474.png<?xml  version="1.0" encoding="UTF-8"?>24f1150b881333f12a311ae9ef34da474.png    xmlns="http://java.sun.com/xml/ns/javaee"44f1150b881333f12a311ae9ef34da474.png    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"54f1150b881333f12a311ae9ef34da474.png    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee64f1150b881333f12a311ae9ef34da474.png    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">74f1150b881333f12a311ae9ef34da474.png84f1150b881333f12a311ae9ef34da474.pngThis is the description of my J2EE component94f1150b881333f12a311ae9ef34da474.pngThis is the display name of my J2EE component104f1150b881333f12a311ae9ef34da474.pngformdeal114f1150b881333f12a311ae9ef34da474.pngorg.wzhongyu.formdeal124f1150b881333f12a311ae9ef34da474.png134f1150b881333f12a311ae9ef34da474.png144f1150b881333f12a311ae9ef34da474.png154f1150b881333f12a311ae9ef34da474.pngformdeal164f1150b881333f12a311ae9ef34da474.png/servlet/formdeal174f1150b881333f12a311ae9ef34da474.png184f1150b881333f12a311ae9ef34da474.png把信息提交页面的第7行改为:

4f1150b881333f12a311ae9ef34da474.png重新部署并执行页面,同样看到显示的中文信息是乱码。现在把第23行的注释符去掉,重新执行会看到下面的信息,提交过来的中文信息是乱码:

4f1150b881333f12a311ae9ef34da474.png您的用户名:??????4f1150b881333f12a311ae9ef34da474.png您的密码:1234654f1150b881333f12a311ae9ef34da474.png您的爱好:????把第25行的注释符也去掉,重新执行,可以看到可以显示正常的信息了,如下:

4f1150b881333f12a311ae9ef34da474.png您的用户名:王冰

4f1150b881333f12a311ae9ef34da474.png您的密码:56322154f1150b881333f12a311ae9ef34da474.png您的爱好:音乐如果只去掉第25行的注释,执行程序则会显示下面的信息:

4f1150b881333f12a311ae9ef34da474.png?????????4f1150b881333f12a311ae9ef34da474.png?????1234564f1150b881333f12a311ae9ef34da474.png???????由此可见,这个两个都不可以忽略掉,也可以从下面的方式验证必须写上两个,把formdeal.java里的第29,30,31行的中文换成英文,同样注释掉第23行,而不要注释掉第25行,执行后显示的信息如下:

4f1150b881333f12a311ae9ef34da474.pngusername???4f1150b881333f12a311ae9ef34da474.pngpassword65462458

4f1150b881333f12a311ae9ef34da474.pnglove??

这是由于没有设置servlet响应的页面的字符编码造成的。

在servlet里也可以这样进行处理,把第25行注释掉,而不要注释第23行,把第26行和第28行分别改为如下代码:

4f1150b881333f12a311ae9ef34da474.pngString username=newString(request.getParameter("username").getBytes("iso-8859-1"),"gbk"); 

4f1150b881333f12a311ae9ef34da474.png        String love=newString(request.getParameter("love").getBytes("iso-8859-1"),"gbk");这样也可以正常显示中文信息。

1

4f1150b881333f12a311ae9ef34da474.png2011年2月27日补充24f1150b881333f12a311ae9ef34da474.png34f1150b881333f12a311ae9ef34da474.png源于最近项目在不同的Linux系统中部署导致部分程序字符为乱码的问题,进行处理时需要注意以下问题:44f1150b881333f12a311ae9ef34da474.pnggetBytes()方法在将字符串进行转码时,是根据操作系统平台的默认字符编码进行转码的。54f1150b881333f12a311ae9ef34da474.pnggetBytes(Charset charset)方法是使用指定的字符编码进行转码。64f1150b881333f12a311ae9ef34da474.png74f1150b881333f12a311ae9ef34da474.png对于乱码问题,最好是项目的所有出入口都统一编码,文件的编码也要统一,请求部分使用过滤器进行处理。

posted on 2007-11-11 17:41 wzhongyu 阅读(3190) 评论(2)  编辑  收藏 所属分类: Java学习

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值