其实需求很简单,就是点击按钮后,向后台传入查询条件,然后根据查询条件获取满足条件的记录通过excel下载。
方案一:使用ajax方式不可以原因
导出excel算是文件下载了,后台需要向前台(浏览器)写文件流,而ajax请求获取的数据的都是字符串(此点当时在调试页面的时候,Response响应中满是乱码的字符串文本),它没法解决后台返回的文件流,但是浏览器可以。
换句话说 ajax貌似实现不了文件下载的功能,所以使用window.location.href直接地址重定向
前端jsp代码:
js代码:
function exportUserPage(){
var pageNow = $("#pageNow").val();
var gender = "";
$('input[name="gender"]:checked').each(function(){
gender += $(this).val()+",";
});
gender = deleteLastComma(gender);
var age = $('input[name="age"]').val();
var experience = $('input[name="experience"]').val();
var json = {
gender:gender,
age:age,
experience:experience,
pageNow:pageNow
}
// 注意这里因为url中有中文等字符,所以需要编码
// 还有这里url中/userFilter前添加了..,取的是相对路径
location.href=encodeURI('../userFilter/exportUserPage.action?parameterMap='+ JSON.stringify(json));
}
关于上面url中需要加..的原因如下:
假设当前路径如下:http://192.168.1.138:8080/rsbi/frame/Frame.action,点击下载按钮后,会正常跳转到
http://192.168.1.138:8080/rsbi/userFilter/exportUserPage.action;但是如果location.href去掉了..,即location.href=encodeURI('/userFilter/exportUserPage.action?parameterMap='+ JSON.stringify(json));
那么点击下载按钮后会跳转到http://192.168.1.138:8080/userFilter/exportUserPage.action,丢失了项目名称rsbi,此时会无法正常调用后台方法,报404错误!!!
后端接收请求代码
@RequestMapping(value="/exportUserPage.action")
public void exportUserPage( HttpServletResponse response,HttpServletRequest request){
Map parameterMap = null;
try {
// 对应前端的编码,在这里进行解码,并解析json为Map
String value = URLDecoder.decode(request.getParameter("parameterMap"), "UTF-8");
parameterMap = (Map)JSON.parse(value);
System.out.println("value");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
Map queryCondition = parameterToQueryCondition(parameterMap);
// 1 获取当前页数
Object pageObj = parameterMap.get(GeneralConstants.PAGE_NOW);
Integer pageNow = PageUtil.getPage(pageObj);
// 2 获取实际数据
int start = (pageNow - 1) * PAGE_SIZE;//开始条数
int end = PAGE_SIZE;
List
下面是excel生成类
public class ExcelUtil {
/**
* 导出Excel
* @param sheetName sheet名称
* @param title 标题
* @param mapList 内容
* @param wb HSSFWorkbook对象
* @return
*/
public static HSSFWorkbook getHSSFWorkbook(String sheetName, String []title, List
开发过程中也遇到一些问题,如400错误等,可以参考:https://blog.csdn.net/h2604396739/article/details/84954626