乱码的涌现根本缘故原由在于编码和解码利用了不同的编码方案。
比如用GBK编码的文件,用UTF-8去解码结果肯定都是火星文。
以是要办理这个问题,中央思想就在于利用统一的编码方案。

jsp页面间的参数通报有以下几种办法:

1、表单(form)的提交。

jspurl传多个参数深圳尚私塾Java专家解决JSP参数传递乱码 NoSQL

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\"大众来解码,以是对付英文或数字的参数值自然能精确取得,但对付汉字这样的字符是解不出来的,由于那几个汉字曾经做过“整形”手术,已经认不出来了。
要想再把它们认出来,那就得要把手术的主刀年夜夫找到,然后再做一次“还原”手术。
下面供应的几个方案,可用于不同的情形。