表单的乱码的问题:
乱码的原因:客户端的编码与服务端的编码不一致
解决的方法:客户端的编码与服务端的编码一致。
Post 的解决方式:
A:硬编码:request.setCharacterEncoding("GBK");[平常使用]
B:软编码:
String username = request.getParameter("username");
//重新解码(软编码)
username = new String(username.getBytes("ISO-8859-1"),"GBK");
Get 的解决方式:
request.setCharacterEncoding("GBK");对 Get 请求不起作用。
A:软编码:
String username = request.getParameter("username");
//重新解码(软编码)
username = new String(username.getBytes("ISO-8859-1"),"GBK");
B:server.xml 中在端口号中配置(平常使用)
即不是 GET,也不是 Post 的请求。
HttpServletResponse 对象
response.setCharacterEncoding(charset);
//设置响就应编码
response.setContentType(type);
//设置响应格式。格式定义在 tomcat 的 web.xml 中。
在网页中的超链接,例如
click me,如果超链
接里的地址有中文就如上面的'一样,即使在 web.xml 中设置转换字符集的 filter,在
servlet 中得到的值还是乱码。下面是我的几个实验,
(1) 首先,在 web.xml 中没有字符集转换的 filter 下,在表单中提交中文的情况,HTML 片
段如下
Html 代码
在文本框中输入'世界', 毫无疑问这个时候在 servlet 中得到的 name 的值是乱码
例如:name = ????
(2)现在再把 form 中的 method 方法换成 post 并且仍然是在 web.xml 中没有字符集转换的
filter 下,看在表单中提交中文会不会有乱码,HTML 片段如下
Html 代码
在文本框中输入'世界', 这个时候在 servlet 中得到的 name 的值仍然是乱码 例
如:name = ????
(3)现在在 web.xml 中加入字符集转换的 filter,代码如下
Xml 代码
Set Character Encoding
filters.SetCharacterEncodingFilter
encoding
GBK
Set Character Encoding
/*
Set Character Encoding
filters.SetCharacterEncodingFilter
encoding
GBK
Set Character Encoding
/*
(4)现在咱们还是现在 form 的 method 属性是 get 时候进行测试,在
文本框中输入世界,然后在 servlet 中得到的 name 值仍然是乱码,name = ????
(5)然后再在 form 的 method 属性是 post 时候进行测试,在文本框中输入世界,然后在
servlet 中得到的 name 值就是正常的值的没有乱码。
我现在用的浏览器是 IE,就是表单提交中文时候,如果正确的设置了字符集转换的 filter,
那么在 form 中的 post 方法中提交时,在 servlet 中得到的正常的值,如果在 form 中的 get
方法中提交时候,得到的中文数据居然是乱码,这个有点不可思议。
(6)然后在同样的环境下,在超链接的 href 属性中提交中文参数值,例如
Html 代码
click me 在 servlet 中得到的是乱
码。在这种情况下在 servlet 中进行转码。例如,
Java 代码
try {
name = new String(name.getBytes("ISO-8859-1"), "gbk");
} catch(Exception e) {
e.printStackTrace();
}
try {
String(name.getBytes("ISO-8859-1"), "gbk");
} catch(Exception e) {
e.printStackTrace();
} 或者
java.net.URLDecoder.decode(name) 通过这个语句进行转码也是可以得到正常值的。
(7)同样是在有字符集转换的 filter 下,在 JSP 中使用 JSTL 的
标签是否可以避免
乱码吗,使用如下的标签
Html 代码
Hello
Hello 然后在 servlet 中得到的仍然是乱码,仍然需要(6)中
介绍的方法进行转换,才能得到正确的值。
(8)通过 post 方法提交的表单中的中文值是不需要通过(6)中的进行转码的,如果进行转码
的话,反而会造成乱码。那么,在 serlvet 中,如果让这两种提交方式(超链接提交和表单
post 方法)都通用的话,如果超链接的值没有中文的话是可以实现通用的,如果超链接提交
的参数有中文的话,就会出现问题,那么就必须在超链接提交的 URL 中另加一个额外的参数
来标识是从哪里提交的,以此来决定是否需要对特定的值进行转化。有没有更好的办法在超
链接里提交中文时候在 servlet 中不进行转码呢。答案就是(5)。如果把超链接提交转化为
表单的 post 提交,中文就不会出现乱码,见(9)
(9)
Js 代码
function linkClick(linkObject) {
var formObject = document.createElement('form');
document.body.appendChild(formObject);
formObject.setAttribute('method', 'post');
var url = linkObject.href;
var uri = '';
var i = url.indexOf('?');
if(i == -1) {
formObject.action = url;
} else {
formObject.action = url.substring(0, i);
}
if( i >= 0 && url.length >= i + 1) {
uri = url.substring(i + 1, url.length);
}
var sa = uri.split('&');
for(var i = 0; i < sa.length; i++) {
var isa = sa[i].split('=');
var inputObject = document.createElement('input');
inputObject.setAttribute('type', 'hidden');
inputObject.setAttribute('name', isa[0]);
inputObject.setAttribute('value', isa[1]);
formObject.appendChild(inputObject);
}
formObject.submit();
return false;
}
function linkClick(linkObject) {
var formObject = document.createElement('form');
document.body.appendChild(formObject);
formObject.setAttribute('method', 'post');
var url = linkObject.href;
var uri = '';
var i = url.indexOf('?');
if(i == -1) {
formObject.action = url;
} else {
formObject.action = url.substring(0, i);
}
if( i >= 0 && url.length >= i + 1) {
uri = url.substring(i + 1, url.length);
}
var sa = uri.split('&');
for(var i = 0; i < sa.length; i++) {
var isa = sa[i].split('=');
var inputObject = document.createElement('input');
inputObject.setAttribute('type', 'hidden');
inputObject.setAttribute('name', isa[0]);
inputObject.setAttribute('value', isa[1]);
formObject.appendChild(inputObject);
}
formObject.submit();
return false;
} 下面是 html 代码
href='./servlet/MyServlet?name= 世 界 &id=1'
Html 代码
click me
click me
这样就 OK 了,在 linkClick 方法里面会自己创建一个表单,然后会去解析你的参数并自动
转化成 hidden,并给 hidden 域赋值,这样,再也不怕提交中文参数,并且也不需要在 servlet
中进行麻烦的转码,真是一劳永逸啊,但是需要在 JSP 的超链接中加上上面的方法。上面的
程序用的是 IE6 和 tomcat5。
onclick="return