批量删除和文件下载

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/bibic226/article/details/102666283

批量删除和文件下载

一.批量删除

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. 注意事项
  1. 使用ajax异步请求不能实现下载 ajax是局部刷新,浏览器不能接受到响应头的改变

  2. 一个头,两个流 使用IOUtils.copy(is,os)方法实现

  3. 处理图片名称中的中文乱码

展示页面中,没有显示出图片:
  • 此时点击下载会报错,原因有以下两种:
  1. 数据库中url字段为null,使用el表达式获取,会变成空字符串,见上图中第一次过滤

    //1.第一次过滤掉 数据库中url为null的情况,el表达式中没有null,是空字符串
            if(url.length()>0){
    
  2. 数据库中有url,但项目的image文件夹下的图片被删除,也就是项目发布路径下没有。见上图中的第二次过滤

    //2.第二次过滤掉 数据库中url不为null,但服务器路径下没有图片,或图片被人为清空
                if(file.exists()){
    

猜你喜欢

转载自blog.csdn.net/bibic226/article/details/102666283