批量删除和文件下载
一.批量删除
1.实现全选和全不选
$("#checkAll").click(function () {
var isCheck=$(this).prop("checked");
if(isCheck){
$(".checkNow").prop("checked",true);
}else {
$(".checkNow").prop("checked",false);
}
});
- prop()函数:可以获取复选框,下拉框等标签的boolean类型的属性值,如 checked=“true”, selected=“true”
- attr()函数:获取到的是: checked=“checked”, selected=“selected”
2.携带选中的id值,使用异步提交,进入后台
/*批量删除*/
function batchDel(){
//1.创建一个数组,用于存储 选中的员工编号
var ids=new Array();
$(".checkNow:checked").each(function () {
var id=$(this).val();
ids.push(id);
});
//2.使用ajax异步请求,将参数携带到后台
if(ids.length>0){//此处必须toString()
$.post("/emp/batchDel",{ids:ids.toString()},function () {
//3.删除后,在回调函数中执行页面跳转,数据重查,并留在当前页,而不是回到第一页
location.href="/emp/search?pageNum=${pageInfo.pageNum}"
});
}
}
3.Controller中,接参,删除
//批量删除
@RequestMapping("/batchDel")
@ResponseBody//没有该注解,不会执行ajax回调函数
public void batchDel(Integer[] ids){
service.batchDel(ids);
}
4.service
@Override
public void batchDel(Integer[] ids) {
EmpExample empExample = new EmpExample();
EmpExample.Criteria c = empExample.createCriteria();
c.andIdIn(Arrays.asList(ids));//数组转换成集合
empMapper.deleteByExample(empExample);
}
注意:
1.js中的数组ids必须toString
$.post("/emp/batchDel",{ids:ids.toString()},function () {}
2.后台接收参数只能是数组,不能使用集合,否则会出现不能实例化的异常
public void batchDel(Integer[] ids){}
3.异步请求后台方法中不能直接进行页面跳转,如下所示行不通:
public String batchDel(Integer[] ids){
service.batchDel(ids);
return "redirect:emp/search"
}
4.没有responseBody注解,前台ajax中回调函数不执行,页面不跳转
@ResponseBody//没有该注解,不会执行ajax回调函数,页面不跳转
//对应jsp中的回调函数
$.post("/emp/batchDel",{ids:ids.toString()},function () {
//3.删除后,在回调函数中执行页面跳转,数据重查,并留在当前页,而不是回到第一页
location.href="/emp/search?pageNum=${pageInfo.pageNum}"
});
二.图片下载
1. jsp
<td>
<img src="${emp.url}" alt="大头贴" style="width: 100px;height: 100px"><br>
<a href="/emp/down?url=${emp.url}&pageNum=${pageInfo.pageNum}">下载</a>
</td>
2. controller
//图片下载
@RequestMapping("/down")
public void imgDown( String url, int pageNum,HttpSession session, HttpServletResponse response) throws Exception {
//1.第一次过滤掉 数据库中url为null的情况,el表达式中没有null,是空字符串
if(url.length()>0){
String realPath = session.getServletContext().getRealPath(url);
File file = new File(realPath);
//2.第二次过滤掉 数据库中url不为null,但服务器路径下没有图片,或图片被人为清空
if(file.exists()){
//3.一个头,两个流
//3.0 获取输入流
FileInputStream is = new FileInputStream(file);
//3.1 截取url中/imgs后面的部分 作为 文件名
String fname=url.substring(6);
//3.2 重新编码,解决文件名中文乱码
fname = new String(fname.getBytes("gbk"), "iso8859-1");
//3.3添加响应头:--让浏览器以附件下载的形式打开响应的文件
response.addHeader("content-disposition","attachment;filename="+fname);
//3.4 获取输出流
ServletOutputStream os = response.getOutputStream();
IOUtils.copy(is,os);
return;//响应流 和 页面跳转不能同时出现,所以此处用return返回
}
}
//4.如果不能正常下载,页面会出现空白,此时跳转页面,去数据库重查,并留在当前页
response.sendRedirect("/emp/search?pageNum="+pageNum);
}
3. 注意事项
-
使用ajax异步请求不能实现下载 ajax是局部刷新,浏览器不能接受到响应头的改变
-
一个头,两个流 使用IOUtils.copy(is,os)方法实现
-
处理图片名称中的中文乱码
展示页面中,没有显示出图片:
- 此时点击下载会报错,原因有以下两种:
-
数据库中url字段为null,使用el表达式获取,会变成空字符串,见上图中第一次过滤
//1.第一次过滤掉 数据库中url为null的情况,el表达式中没有null,是空字符串 if(url.length()>0){
-
数据库中有url,但项目的image文件夹下的图片被删除,也就是项目发布路径下没有。见上图中的第二次过滤
//2.第二次过滤掉 数据库中url不为null,但服务器路径下没有图片,或图片被人为清空 if(file.exists()){