望尘轩中一盏茶

统计

留言簿

友情链接

阅读排行榜

评论排行榜

JSP&Servlet处理参数中的中文乱码总结

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

 1<%@ page language="java" contentType="text/html; charset=gbk"%>
 2<html>
 3  <head>
 4    <title>表单提交</title>
 5  </head>
 6  <body>
 7    <form action="deal.jsp" method="post">
 8        用户名:<input type="text" name="username"><br>
 9        密&nbsp;&nbsp;码:<input type="password" name="password"><br>
10        爱&nbsp;&nbsp;好:<input type="radio" name="love" value="运动">运动&nbsp;
11               <input type="radio" name="love" value="音乐">音乐<br>
12        &nbsp;&nbsp;<input type="submit" value="提交">
13    </form>
14  </body>
15</html>

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

 1<%@ page language="java" contentType="text/html; charset=gbk"%>
 2<html>
 3  <head>
 4    <title>显示用户信息</title>
 5  </head>
 6  <body>
 7    <%
 8        //request.setCharacterEncoding("gb2312");
 9        String username = request.getParameter("username");
10        //String username = new String(request.getParameter("username").getBytes("iso-8859-1"),"gbk");
11        String password = request.getParameter("password");
12        //String love = new String(request.getParameter("love").getBytes("iso-8859-1"),"gbk");
13        String love = request.getParameter("love");
14    %>
15    <%= username %>您好,你的密码是:<%= password %>,您的爱好是:<%= love %>!
16  </body>
17</html>

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

??????您好,你的密码是:1234569,您的爱好是:????! 

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

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

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

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

 1package org.wzhongyu;
 2
 3import java.io.IOException;
 4import java.io.PrintWriter;
 5import javax.servlet.ServletException;
 6import javax.servlet.http.HttpServlet;
 7import javax.servlet.http.HttpServletRequest;
 8import javax.servlet.http.HttpServletResponse;
 9
10public class formdeal extends HttpServlet {
11    public void destroy() {
12        super.destroy(); // Just puts "destroy" string in log
13        // Put your code here
14    }

15
16    public void doGet(HttpServletRequest request, HttpServletResponse response)
17            throws ServletException, IOException {
18            this.doPost(request, response);
19    }

20
21    public void doPost(HttpServletRequest request, HttpServletResponse response)
22            throws ServletException, IOException {
23        //response.setContentType("text/html; charset=gbk");
24        PrintWriter out = response.getWriter();
25        //request.setCharacterEncoding("gbk");
26        String username = request.getParameter("username");
27        String password = request.getParameter("password");
28        String love = request.getParameter("love");
29        out.print("您的用户名:" + username + "<br>"); //
30        out.print("您的密码:" + password + "<br>"); //
31        out.print("您的爱好:" + love); //
32    }

33    public void init() throws ServletException {
34        // Put your code here
35    }

36}

37

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

 1<?xml version="1.0" encoding="UTF-8"?>
 2<web-app version="2.5" 
 3    xmlns="http://java.sun.com/xml/ns/javaee" 
 4    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 5    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
 6    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 7  <servlet>
 8    <description>This is the description of my J2EE component</description>
 9    <display-name>This is the display name of my J2EE component</display-name>
10    <servlet-name>formdeal</servlet-name>
11    <servlet-class>org.wzhongyu.formdeal</servlet-class>
12  </servlet>
13
14  <servlet-mapping>
15    <servlet-name>formdeal</servlet-name>
16    <url-pattern>/servlet/formdeal</url-pattern>
17  </servlet-mapping>
18</web-app>
把信息提交页面的第7行改为:
<form action="./servlet/formdeal" method="post">
重新部署并执行页面,同样看到显示的中文信息是乱码。现在把第23行的注释符去掉,重新执行会看到下面的信息,提交过来的中文信息是乱码:
您的用户名:??????
您的密码:
123465
您的爱好:
????
把第25行的注释符也去掉,重新执行,可以看到可以显示正常的信息了,如下:
您的用户名:王冰
您的密码:
5632215
您的爱好:音乐
如果只去掉第25行的注释,执行程序则会显示下面的信息:
?????????
?????123456
???????
由此可见,这个两个都不可以忽略掉,也可以从下面的方式验证必须写上两个,把formdeal.java里的第29,30,31行的中文换成英文,同样注释掉第23行,而不要注释掉第25行,执行后显示的信息如下:
username???
password65462458
love
??

这是由于没有设置servlet响应的页面的字符编码造成的。
        在servlet里也可以这样进行处理,把第25行注释掉,而不要注释第23行,把第26行和第28行分别改为如下代码:

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

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



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

评论

# re: JSP&Servlet处理参数中的中文乱码总结 2007-11-12 13:15 freeman1984

可以用filter直接搞定  回复  更多评论   

# re: JSP&Servlet处理参数中的中文乱码总结[未登录] 2008-07-25 10:34 knight

很好  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 
我的便捷门:综合频道 数码频道 商城频道 电器频道 男人频道 女人频道 居家玩具 美容频道 饰品鞋包 食品频道 台湾馆频道