乱码的涌现根本缘故原由在于编码和解码利用了不同的编码方案。比如用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后面,有长度的限定。下面是同一个页面两种办法的要求报许文。
在上面的要求页面的username输入框里输入的是“天下杯”三个汉字,password输入框中输入\"大众123\"大众后按下Submit按钮提交要求。截获到的要求报文如下:
要求报文中对汉字的处理:
从上面两种报文可以看出页面上输入的“天下杯”三个汉字被更换成了\"大众%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\"大众编码,其它的编码方案可以吗?答案是可以的。在jsp页面代码的头部有这样一段代码\公众<%@ page language=\"大众java\"大众 contentType=\公众text/html; charset=UTF-8\"大众 pageEncoding=\"大众UTF-8\公众%>\"大众个中charset的值便是浏览器在提交要求报文前,对要求报文做“整形”手术时用的字符集,同是也是浏览器阐明做事器的相应页面时的字符集。
在理解了以上内容后,开始阐发表单办法通报参数的乱码问题。
以上例为例,点击\"大众Submit\公众按钮后,浏览器将做完“整形”手术后的要求报文发送给WEB做事器上的Servlet容器,容器在收到这个要求报文后,会解析这个要求报文并用这个报文的信息天生一个HttpServletRequest工具,然后将这个HttpServletRequest工具传给这个页面所要要求的jsp或Servlet(上例中为\公众requestresult.jsp\公众)。在这个被要求的jsp或Servlet(上例中为\"大众requestresult.jsp\"大众)中,利用HttpServletRequest工具的getParameter(\公众\公众)方法来取得上一页面传来的参数。默认情形下,这一方法利用的是\"大众ISO-8859-1\"大众来解码,以是对付英文或数字的参数值自然能精确取得,但对付汉字这样的字符是解不出来的,由于那几个汉字曾经做过“整形”手术,已经认不出来了。要想再把它们认出来,那就得要把手术的主刀年夜夫找到,然后再做一次“还原”手术。下面供应的几个方案,可用于不同的情形。