博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Servlet接收JSP参数乱码问题解决办法
阅读量:5329 次
发布时间:2019-06-14

本文共 3015 字,大约阅读时间需要 10 分钟。

转自:http://lavasoft.blog.51cto.com/62575/274527/
 
环境:
apache-tomcat-6.0.24.zip
jdk1.6.0_16
WindosXP 简体中文版
Netbeans6.8
 
目标:
解决Servlet接收到JSP传递的参数后乱码问题,乱码发生在Servlet一方。
 
JSP向Serlvet传递参数有两种方式,一种是GET方式,另一种是POST方式,为了解决乱码问题,必须对这两种方式工作原理有个深刻理解才行。
 
这里先写一个简单的JSP(工程所有的源代码文件编码均为GBK),里面有两种提交参数的方式:
<
%@page 
contentType
="text/html" 
pageEncoding
="GBK"%
> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
     "http://www.w3.org/TR/html4/loose.dtd"> 
<
html
> 
        
<
head
> 
                
<
meta 
http-equiv
="Content-Type" 
content
="text/html; charset=UTF-8"
> 
                
<
title
>JSP Page
</title> 
        
</head> 
        
<
body
> 
                
<
h1
>页面提交中文测试!
</h1> 
                
<
h2
>GET方式
</h2> 
                
<a href="/testweb/TestServlet?param=中文">GET方式提交中文测试</a> 
                
<
h2
>POST方式
</h2> 
                
<form action="/testweb/TestServlet" method="post"> 
                        <input type="text" name="param" value="中文"/> 
                        <button type="submit" name="提交中文参数测试" value="提交中文参数测试"/> 
                </form> 
        
</body> 
</html>
 
然后定义一个Servlet接收提交的参数。
 
这里强调一点,在此使用的tomcat没有经过任何的修改与配置。
当页面通过两种方式请求Servlet的时候,参数的编码原本为GBK,在通过HTTP服务将请求发送出去的时候,会将参数重新按照ISO-8859-1编码后发送。因此,不管GET或POST方式,Servlet接收到的参数数据的编码均为ISO-8859-1,必须重新转码为GBK,才能正确显示中文参数。
 
 
1、GET方式的请求与接收过程
页面中参数“param=中文”的编码原本为GBK,当用GET方式发送参数的时候,参数值会被Web服务器从GBK转码为ISO-8859-1。
Servlet接收到的GET请求参数的编码当然为ISO-8859-1了,对于中文肯定显示不了,因此要将ISO-8859-1转换为GBK就可以正常显示中文了。
                String param = request.getParameter(
"param"); 
                String x = 
new String(param.getBytes(
"ISO-8859-1"), 
"GBK"); 
                System.out.println(
"GET方式获取的中文参数值:" + x);
 
 
2、POST方式请求与接收过程
页面中参数“param=中文”的编码原本为GBK,当点击页面中提交按钮后,参数会以GBK编码格式发送给Servlet,因此Servlet接收参数的时候必须将请求的编码明确设定为GBK,这样才能正确接收中文。
                request.setCharacterEncoding(
"GBK"); 
                String param = request.getParameter(
"param"); 
                System.out.println(
"POST方式获取的中文参数值:" + param);
 
或者,可以按照get方式来接收post的参数:
                String param = request.getParameter(
"param"); 
                String x = 
new String(param.getBytes(
"ISO-8859-1"), 
"GBK"); 
                System.out.println(
"GET方式获取的中文参数值:" + x);
 
 
疑问:为什么在GET方式下不设定请求的编码格式呢?原因是GET方式使用的编码为ISO-8859-1,用GBK、UTF-8等接收效果都是一样的(都是一堆字母和符号),编不编都一个样,如果指定ISO-8859-1编码是多一翻手续,如果指定了非ISO-8859-1编码,是脑子还不清醒,没搞明白这个原理,因此,GET方式就不要指定请求的编码了。
 
下面看看Servlet的写法:
package jweb.lavasoft; 
import java.io.IOException; 
import java.io.PrintWriter; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
public 
class DealPageParamServlet 
extends HttpServlet { 
        
protected 
void doGet(HttpServletRequest request, HttpServletResponse response) 
                        
throws ServletException, IOException { 
                String param = request.getParameter(
"param"); 
                String x = 
new String(param.getBytes(
"ISO-8859-1"), 
"GBK"); 
                System.out.println(
"GET方式获取的中文参数值:" + x); 
        } 
        
protected 
void doPost(HttpServletRequest request, HttpServletResponse response) 
                        
throws ServletException, IOException { 
                request.setCharacterEncoding(
"GBK"); 
                String param = request.getParameter(
"param"); 
                System.out.println(
"POST方式获取的中文参数值:" + param); 
        } 
}
 
其实,只要搞明白了编码过程,遇到乱码问题就能从容应对了。
常常见到有人遇到乱码了,就开始修改Tocmat的server.xml的配置文件,或者添加过滤器等等,糊里糊涂搞,大多数情况问题都能解决掉,其实也仅仅是个瞎猫逮住个死耗子。

本文出自 “” 博客,请务必保留此出处

转载于:https://www.cnblogs.com/gnivor/p/4233696.html

你可能感兴趣的文章
Automatically populating $HTTP_RAW_POST_DATA is deprecated......
查看>>
StringBuffer类&包装类
查看>>
spring源码研究1 如何导入源码
查看>>
【短语学习】什么是TPS
查看>>
技巧方法
查看>>
创建WebApi Odata v3 终结点
查看>>
图片加载判断
查看>>
java中23种优秀的设计模式
查看>>
stage3d 你不知道的巨坑
查看>>
netty
查看>>
Java反射+注解案例
查看>>
MYSQL注入提升权限(sa用户)system admin
查看>>
Ubuntu下GTK的安装安装过程
查看>>
软件工程个人作业03
查看>>
Codeforces711C 【DP】
查看>>
在Windows上安装私有GitHub的开源替代-GitLab
查看>>
maven 阿里仓库配置文件
查看>>
Jasperreport5.6.9-----1
查看>>
linux:你不知道的echo
查看>>
nodejs简单读写文件
查看>>