项目中遇到这样一个问题,要实现一个下载功能,参数有两个,一个id,一个标题。其中标题是中文。
js写法:
var params = {
"id": "0001",
"title": "需求响应速率概述"
}
window.open("downloadFilesController.do?download&id=" + params.id + "&title=" + params.title);
controller写法:
@controller
@requestMapping("/downloadFilesController")
public class downloadFilesController{
@requestMapping(params = "download")
public void download(
HttpServeletRequest request,
HttpServletResponse response,
@RequestParam("id") String id,
@RequestParam("title") String title
) {
commonFileDownBizc.downloadFile(request, response, id, title);
}
}
这段代码在chrome中是没有问题的。但是在ie8中就会报错。原因是这样的。ie8中是不能通过get方法传递中文参数到controller的。所以需要在js中给中文参数进行转码,转为Unicode号,然后到controller中进行解码,再传递给biz层。
js写法:
var params = {
"id": "0001",
"title": encodeURI(encodeURI("需求响应速率概述"))
}
window.open("downloadFilesController.do?download&id=" + params.id + "&title=" + params.title);
controller写法:
@controller
@requestMapping("/downloadFilesController")
public class downloadFilesController{
@requestMapping(params = "download")
public void download(
HttpServeletRequest request,
HttpServletResponse response,
@RequestParam("id") String id,
@RequestParam("title") String title
) {
title = URLDecoder.decode(title, "utf-8");
commonFileDownBizc.downloadFile(request, response, id, title);
}
}
注意: 转码一定要两次转码。第一次将三字节的中文转为带%的单字节,第二次将%看做转义字符进行第二次转码。具体的网上有很多文献可以参考。