function query()
{
$("#s").html("<tr><td>正在加载中...</td></tr>");
var type=$('#select_type').val();
var forward=$('#select_forward').val();
var customer=$('#customer').val();
var cpmc=$('#cpmc').val();
$("#s").load("<%=request.getContextPath()%>/historyQueryAction.do",
{"method":"query","type":type,"forward":forward,“customer":customer,"cpmc":cpmc});
}
我想用jsp实现这样一个效果:上面是查询区域,select_type是个下拉框,用来选择运输方式,select_forward也是下拉框,用来选择车辆去向customer是客户,cpmc是产品名称,点击查询后,在下面显示出查询结果,但是不刷新页面,这个效果很简单,不过实现时会遇到一个比较棘手的问题:中文参数的传递。下面总结几种方法,来解决这个麻烦:
首先,将所有页面的编码都转成utf-8,一般的问题都能解决,
》》在html文件头部加入如下代码:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
》》在服务器端加上:request.setCharacterEncoding("UTF-8");
》》如果还是不行,那就用Editplus打开文件,另存为utf-8编码的文件。之所以这么做,是因为jQuery使用的编码是utf-8,但是操作系统默认的编码是gbk。这个问题在ie上比较突出。用火狐浏览器测试就没事。
》》$.ajax()传的值做下处理
encodeURIComponent("中文字符")
当然,如果全站能改成utf-8最好了,如果是旧的系统,上面的方法可以一试。
》》还有可以改成
$.ajax({
url:"<%=request.getContextPath()%>/historyQueryAction.do" ,
type:"POST" ,
dataType:"json" ,
data:"{"method":"query","type":type,"forward":forward,“customer":escape(customer),"cpmc":escape(cpmc)}",
success:function(results){
alert(results.message);
}
});这种方法也是只加一个escape就好了。
》》如果不想换,非要用load方法,那也行啊,不过麻烦点:首先,要在可能出现中文乱码的地方加上escape方法
$("#s").load("<%=request.getContextPath()%>/historyQueryAction.do",
{"method":"query","type":type,"forward":forward,"test":"","customer":escape(customer),"cpmc":escape(cpmc)});
于是传到struts后台的参数变成了%u模式的Unicode编码如在产品名称输入:热轧H型钢就变成了%u70ED%u8F67H%u578B%u94A2,然后再写一个转换函数:
public String unicode2Gbk(String receiveData) {
StringBuffer rtn = new StringBuffer();
while (receiveData.length() >= 1) {
if (receiveData.startsWith("%u")) {
// 如果开头的是汉字
String temp = receiveData.substring(0, 6);
// 截取前六位进行处理
temp = temp.replace("%u", "");
// 将编码类型u和web url 传递转换符%去掉
int j = Integer.parseInt(temp, 16);
// 将十六进制的字符串转化成整形
rtn.append((char) j);
// 将整形强制转成字符串,添加到返回队列里
receiveData = receiveData.substring(6, receiveData.length());
// 将剩余的字符串取出来进行下一步处理
} else {// 如果开头的不是汉字(英文或数字)
rtn.append(receiveData.substring(0, 1));
// 直接添加到返回字符队列中
receiveData = receiveData.substring(1, receiveData.length());
// 将剩余的字符串取出来进行下一步处理
}
}
return rtn.toString();
}
这样也能解决