这是本人写的第一篇博客,不足之处忘大家指正,相互学习。
写这篇博客的目的是因为在做excel导出功能时遇到两个问题,第一个问题是用链接发送url至后台执行导出功能时,链接中传输的中文出现乱码,但是后台并不能友好的解决中文参数乱码问题,第二个问题是改为ajax传参,后台程序虽然执行,但excel并不能导出,后期通过jq的一个方法解决了这两个问题。接下来分享我处理的过程及最后的解决方法。
1.编写之初使用链接加参数传送到后台执行导出功能
<script type="text/javascript">
function exportExcel() {
var stuNo=$("#stuNo").val();
var stuName=$("#stuName").val();
location.href = "${ctx}/gsapply/gsApply/exportExcel?stuNo="+stuNo
+ "&stuName="+stuName;
}
</script>
但是后台获取传送的参数出现问题,参数是一堆看不懂的&等英文,并不能转码,试了好几种方法,也解决不了乱码问题。
2.改为ajax传参数,是为了解决参数乱码问题
<script type="text/javascript">
function exportExcel() {
var stuNo=$("#stuNo").val();
var stuName=$("#stuName").val();
$.ajax({
type : "POST",
url : "${ctx}/gsapply/gsApply/exportExcel",
dataType : "json",
data : {
"stuNo" : stuNo,
"stuName":stuName
}
})
}
</script>
这样能获取参数,中文也不会出现乱码,但是执行导出功能时,后台程序执行了,前台并没有执行导出功能,就是excel表格并没有导出,请看下面的导出代码块
@ResponseBody
@RequestMapping(value = "exportExcel")
public String exportExcel(GsApply gsApply,HttpServletRequest request,
HttpServletResponse response,
RedirectAttributes redirectAttributes) {
try {
String fileName = DateUtils.getDate("yyyy_MM_dd_")+"资助详情列表" + ".xlsx";
//返回需要导出的列表
List<GsExportExcel> excelList=gsApplyService.ExportList(gsApply);
new ExportExcel("资助详情信息",GsExportExcel.class).setDataList(excelList).write(response, fileName)
.dispose();
return null;
} catch (Exception e) {
e.printStackTrace();
}
执行到图中代码块时,前台并没有实现导出功能,代码也是正确的。
3.解决问题及原因
每个公司总会有前辈教你一些东西,我这有个前辈知道的多,他给了我一个jq方法,完美的解决了传参和导出excel异常问题,请看下面代码块。
<script type="text/javascript">
function exportExcel() {
var exportUrl= "${ctx}/gsapply/gsApply/exportExcel";
download(exportUrl,decodeURIComponent($("#searchForm").serialize()),"post");
function download(url, data, method){
// 获取url和data
if( url && data ){
// data 是 string 或者 array/object
data = typeof data == 'string' ? data : jQuery.param(data);
// 把参数组装成 form的 input
var inputs = '';
jQuery.each(data.split('&'), function(){
var pair = this.split('=');
inputs+='<input type="hidden" name="'+ pair[0] +'" value="'+ pair[1] +'" />';
});
// request发送请求
jQuery('<form action="'+ url +'" method="'+ (method||'post') +'">'+inputs+'</form>')
.appendTo('body').submit().remove();
};
};
}
</script>
此方法主要是获取表单的参数,同时给予一个链接地址,并提交至后台,代码的目的是自己解析form中的参数,并生成独立的form表单,提交参数至后台后,同时又删除了自我生成的from.前面提到的ajax传参导致导出功能无法执行,是因为ajax传参导致excel导出功能的流丢失了,所以界面无法找到原来的流,匹配不上自然功能就无法执行。
看图中的红框,执行此方法只需要给予发送地址,加上需要获取参数的from表单的id即可,from中name等于的值就是你要传送至后台的参数对应的名字,此表单name属性值一定要与你想传递到后台的参数的那么值对应。
总结:此方法能解决很多传参问题及一些导出,下载过程中流丢失问题,是个很好的方法。这个方法主要是将表单先进行序列化再重新组成独立的form,获取参数并传递链接后,又自我删除,对原来的表单没有影响。
最后,很感谢每一位读者的浏览,谢谢!