当前位置:编程学习 > JS >>

解决jsp参数传递乱码的问题

解决jsp参数传递乱码的问题
计算机生于美国,英语是他的母语,而英语以外的其它语言对他来说都是外语。他跟我们一样,不管外语掌握到什么

程度,也不会像母语那样使用得那么好,时常也会出一些“拼写错误”问题。
 
     乱码的出现根本原因在于编码和解码使用了不同的编码方案。比如用GBK编码的文件,用UTF-8去解码结果肯定都

是火星文。所以要解决这个问题,中心思想就在于使用统一的编码方案。
 
     jsp页面间的参数传递有以下几种方式:1、表单(form)的提交。2、直接使用URL后接参数的形式(超级链接)。

3、如果两个jsp页面在两个不同的窗口中,并且这两个窗口是父子的关系,子窗口中的jsp也可以使用javascript和

DOM(window.opener.XXX.value)来取得父窗口中的jsp的输入元素的值。下面就前两种方式中出现的乱码问题做一下

剖析。
 
     1、表单(form)的提交实现参数页面间的传递
     在介绍表单传递参数的内容之前,先来了解一些预备知识。表单的提交方式和请求报文中对汉字的处理。
 
     表单的提交方式:
     通常使用的表单的提交方式主要是:post和get两种。两者的区别在于:post方式是把数据内容放在请求的数据

正文部分,没有长度的限制;get方式则是把数据内容直接跟在请求的头部的URL后面,有长度的限制。下面是同一个

页面两种方式的请求报许文。
Requesttest.jsp代码 
<%@ page language="java" contentType="text/html; charset=UTF-8" 
    pageEncoding="UTF-8"%>  
<!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>Insert title here</title>  
</head>  
<body>  
<%-- post方式提交表单 --%>  
<form action="http://localhost:8888/EncodingTest/requestresult.jsp" method="post">  
    UserName:<input type="text" name="username"/>  
    Password:<input type="password" name="password"/>  
    <input type="submit" value="Submit">  
</form>  
</body>  
</html> 
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!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>Insert title here</title>

</head> <body> <%-- post方式提交表单 --%> <form

action="http://localhost:8888/EncodingTestb/requestresult.jsp" method="post"> UserName:<input

type="text" name="username"/> Password:<input type="password" name="password"/> <input type="submit"

value="Submit"> </form> </body> </html>
      在上面的请求页面的username输入框里输入的是“世界杯”三个汉字,password输入框中输入"123"后按下

Submit按钮提交请求。截获到的请求报文如下:
Post方式的请求报文代码 
POST /EncodingTest/requestresult.jsp HTTP/1.1 
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash,

application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*  
Referer: http://localhost:8080/TomcatJndiTest/requesttest.jsp  
Accept-Language: zh-cn  
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; aff-kingsoft-ciba;

.NET CLR 2.0.50727)  
Content-Type: application/x-www-form-urlencoded  
Accept-Encoding: gzip, deflate  
Host: localhost:8888 
Content-Length: 49 
Connection: Keep-Alive  
Cache-Control: no-cache  
 
username=%E4%B8%96%E7%95%8C%E6%9D%AF&password=123 
POST /EncodingTest/requestresult.jsp HTTP/1.1 Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg,

application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint,

application/msword, */* Referer: http://localhost:8080/TomcatJndiTest/requesttest.jsp Accept-Language:

zh-cn User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; aff-kingsoft-

ciba; .NET CLR 2.0.50727) Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip,

deflate Host: localhost:8888 Content-Length: 49 Connection: Keep-Alive Cache-Control: no-cache

username=%E4%B8%96%E7%95%8C%E6%9D%AF&password=123
      以上报文内容,可以看出post方式的请求报文是有专门的数据部的。,
      下面的同一请求页面的get提交方式的请求报文:
Get方式的请求报文代码 
GET /EncodingTest/requestresult.jsp?username=%E4%B8%96%E7%95%8C%E6%9D%AF&password=123 HTTP/1.1 
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash,

application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*  
Referer: http://localhost:8080/TomcatJndiTest/requesttest.jsp  
Accept-Language: zh-cn  
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; aff-kingsoft-ciba;

.NET CLR 2.0.50727)  
Accept-Encoding: gzip, deflate  
Host: localhost:8888 
Connection: Keep-Alive 
GET /EncodingTest/requestresult.jsp?username=%E4%B8%96%E7%95%8C%E6%9D%AF&password=123 HTTP/1.1 Accept:

image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-

excel, application/vnd.ms-powerpoint, application/msword, */* Referer:

http://localhost:8080/TomcatJndiTest/requesttest.jsp Accept-Language: zh-cn User-Agent: Mozilla/4.0

(compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; aff-kingsoft-ciba; .NET CLR 2.0.50727)

Accept-Encoding: gzip, deflate Host: localhost:8888 Connection: Keep-Alive
     以上报文内容,可以看出get方式的请求报文没有专门的数据部,数据是直接跟在url的后面。
 
       请求报文中对汉字的处理:
       从上面两种报文可以看出页面上输入的“世界杯”三个汉字被替换成了"%E4%B8%96%E7%95%8C%E6%9D%AF”这样

一个字符串,然后发给服务器的。看到这,可能会有两个问题:问题一、这个字符串是什么?问题二、为什么要做这

样的替换?
 
      这个字符串是“世界杯”这三个汉字对应的"UTF-8”编码"E4B896E7958CE69DAF"在每个字节前追加一个"%"后形

成的。至于为什么要做这样的转化,我的理解是:因为请求报文会以"ISO-8859-1"的编码方式编码后,通过网络流的

方式传送到服务器端。"ISO-8859-1"仅支持数字、英文字母和一些特殊字符,所以像汉字等这样的字符"ISO-8859-1"

是不认识的。所以就必须先给这些"ISO-8859-1"不支持的字符做个“整形”手术。这样才能正确的将页面上的信息传

送到服务器端。
 
      这时可能又会有另外一个问题:上面的例子中为什么会选用"UTF-8"编码,其它的编码方案可以吗

补充:Web开发 , Jsp ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,