jquery表格datatables实例解析 直接加载和延迟加载


Posted in Javascript onAugust 12, 2016

参考自官方文档,需要引入jquery.js,jquery.dataTables.js,dataTables.bootstrap.js(可选),
由于时间紧,省略了很多,所以总结份简化版的仅供参考。

1、直接加载,这个比较简单,如下

<div id="tid" class="col-sm-12 col-md-12">
  <div id="secondtid" hidden="hidden"></div>
</div>

jsp用了bootstrap的栅格,js如下

<script type="text/javascript">
    function getgaoxinqu() {
      $('#secondtid').remove();
      $("#tid").append(
              "<div id='secondtid' style='width: 100%;'><table id='table_id' class='table table-striped table-bordered table-hover no-footer dataTable display' ><thead><tr><th nowrap>id</th><th nowrap>高新区名称</th><th nowrap>地区</th><th nowrap>工商注册企业数</th><th nowrap>网址</th><th nowrap>工业总产值(千元)</th><th nowrap>工业增加值(千元)</th><th nowrap>主导产业</th><th nowrap>财政收入(万元)</th><th nowrap>财政支出(万元)</th></tr></thead><tbody></tbody></table></div>");
      $.ajax({
            url : '${contextPath}/mst/theme/otherOperatePlatformTheme.do?flag=gaoxinqu',// 跳转到 action 
            data : {
              barName : '1'
            },
            serverSide: true,//服务器处理 
            traditional : true,
            type : 'post',
            success : function(data) {
              var dataObj = eval(data);
              $('#table_id').DataTable(
                      {
                        data : dataObj,
                        sScrollY: 600,
                        sScrollX: '100%',
                        columns : [ {
                          data : 'id'
                        },{
                          data : 'name'
                        }, {
                          data : 'dy'
                        }, {
                          data : 'gxqyy'
                        }, {
                          data : 'www'
                        }, {
                          data : 'gysum'
                        }, {
                          data : 'gyadd'
                        }, {
                          data : 'zdcy'
                        } , {
                          data : 'cztr'
                        } , {
                          data : 'czzc'
                        } ],
                        order:[[ 0, "asc" ]],
                        language : {
                          search : "在表格中搜索:",
                          show : "显示",
                          "sProcessing" : "处理中...",
                          "sLengthMenu" : "显示 _MENU_ 项结果",
                          "sZeroRecords" : "没有匹配结果",
                          "sInfo" : "显示第 _START_ 至 _END_ 项结果,共 _TOTAL_ 项",
                          "sInfoEmpty" : "显示第 0 至 0 项结果,共 0 项",
                          "sInfoFiltered" : "(由 _MAX_ 项结果过滤)",
                          "sInfoPostFix" : "",
                          "sSearch" : "搜索:",
                          "sUrl" : "",
                          "sEmptyTable" : "表中数据为空",
                          "sLoadingRecords" : "载入中...",
                          "sInfoThousands" : ",",
                          "oPaginate" : {
                            "sFirst" : "首页",
                            "sPrevious" : "上页",
                            "sNext" : "下页",
                            "sLast" : "末页"
                          },
                          "oAria" : {
                            "sSortAscending" : ": 以升序排列此列",
                            "sSortDescending" : ": 以降序排列此列"
                          }
                        }
                      });
              showPage();
            },
            error : function() {
              alert("异常!");
            }
          });
      showPage();//高度调节
    }
</script>

后台传个json就行了,由于这个破项目表名都很奇葩凑合看吧。

List<GaoXinDistrict> gxlist=new ArrayList<GaoXinDistrict>();
      String sql="select * from ODS10000060";
      try {
        List<Map> list = oracledictionaryService.executeSqlToRecordMap(sql);
        for (Map map : list) {
          GaoXinDistrict gx=new GaoXinDistrict();
          Object id= map.get("ID");
          Object name = map.get("NAME");
          Object JB = map.get("JB");
          Object DY = map.get("DY");
          Object YEAR = map.get("YEAR");
          Object FZR = map.get("FZR");
          Object TBR = map.get("TBR");
          Object phone = map.get("PHONE");
          Object EMAIL = map.get("EMAIL");
          Object WWW = map.get("WWW");
          Object GXQMJSUM = map.get("GXQMJSUM");
          Object JCMJ = map.get("JCMJ");
          Object GXQYY = map.get("GXQYY");
          Object GYSUM = map.get("GYSUM");
          Object GYADD = map.get("GYADD");
          Object CZTR = map.get("CZTR");
          Object CZZC = map.get("CZZC");
          Object DEC = map.get("DEC");
          Object ZDCY = map.get("ZDCY");

          gx.setId(Integer.parseInt(String.valueOf(id)));
          gx.setName(name.toString());
          gx.setJB(JB.toString());
          gx.setDY(DY.toString());
          gx.setYEAR(YEAR.toString());
          gx.setFZR(FZR.toString());
          gx.setTBR(TBR.toString());
          gx.setPhone(phone.toString());
          gx.setEMAIL(EMAIL.toString());
          gx.setWWW(WWW.toString());
          gx.setGXQMJSUM(GXQMJSUM.toString());
          gx.setJCMJ(JCMJ.toString());
          gx.setGXQYY(GXQYY.toString());
          gx.setGYSUM(GYSUM.toString());
          gx.setGYADD(GYADD.toString());
          gx.setCZTR(CZTR.toString());
          gx.setCZZC(CZZC.toString());
          gx.setDEC(DEC.toString());
          gx.setZDCY(ZDCY.toString());

          gxlist.add(gx);
        }
        parseJSONResult(gxlist, response);
      } catch (Exception e) {
        e.printStackTrace();
      }

2、延迟加载
由于老项目用的struts1,造成前台form接收参数有问题,所以直接用servlet接收
前端jsp如1直接加载一样,js如下

function initDatatables(){
  /*var columns = new Array();
  $("#listTable thead th").each(function(index, element) {
    var fieldName=$(element).attr("fieldName");
    if(fieldName.indexOf('.')>0)fieldName=fieldName.substring(2);
    columns.push({"data":fieldName});
  }); 
  if($('#listTable').length<=0) return;
  //-- 列定义
  var columnDefs = new Array();
  $("#listTable thead th").each(function(index, element) {
    if($(element).attr("fieldType")!='VARCHAR'){        
      columnDefs.push({        
         "orderable": true, 
         "searchable" : false,
         "targets": index });
    }    
  });*/

  $('#listTable').DataTable( {
    "processing": true,//处理中显示
    "serverSide": true,//服务器处理 
    "sScrollY": 300,
    "sScrollX": "100%", 
    "columns":[{"data":"ID"},{"data":"YEAR"},{"data":"REGION"},{"data":"GYZCZ"},{"data":"QYS"}],
    /*"columns":columns,*/
    /*"columnDefs":columnDefs,*/
//   "bInfo": false,
//   "bPaginate": false,
//   "bFilter":false,/servlet/ComplexInquireServlet
//    "bLengthChange": false,
    "ajax": {
      "url": urlContextPath+"/mst/DatatablesLazyLoadServlet?flag=details",
      "type": "POST",
      "data": function ( d ) {
        var queryForm = document.queryConditionForm;                
        d['fieldCode'] = 'ID,YEAR,REGION,GYZCZ,QYS';
        d['tableCode'] = 'ODS10000030'; //表名
      }
    },
    "oLanguage": {
      "search" : "在表格中搜索:",
      "show" : "显示",
      "sProcessing" : "处理中...",
      "sLengthMenu" : "显示 _MENU_ 项结果",
      "sZeroRecords" : "没有匹配结果",
      "sInfo" : "显示第 _START_ 至 _END_ 项结果,共 _TOTAL_ 项",
      "sInfoEmpty" : "显示第 0 至 0 项结果,共 0 项",
      "sInfoFiltered" : "(由 _MAX_ 项结果过滤)",
      "sInfoPostFix" : "",
      "sSearch" : "搜索:",
      "sUrl" : "",
      "sEmptyTable" : "表中数据为空",
      "sLoadingRecords" : "载入中...",
      "sInfoThousands" : ",",
      "oPaginate" : {
        "sFirst" : "首页",
        "sPrevious" : "上页",
        "sNext" : "下页",
        "sLast" : "末页"
      },
      "oAria" : {
        "sSortAscending" : ": 以升序排列此列",
        "sSortDescending" : ": 以降序排列此列"
      }
    }
  } );
  showPage();
}


function showQueryTable(){
  //建table
  $('#secondtid').remove();
  $("#tid").append(
          "<div id='secondtid' style='width: 100%;'>" +
          "<table id='listTable' class='table table-striped table-bordered table-hover no-footer dataTable display' ><thead><tr>" +
          "<th nowrap>id</th>" +
          "<th nowrap>年份</th>" +
          "<th nowrap>地区</th>" +
          "<th nowrap>工业总产值(万元)</th>" +
          "<th nowrap>企业数(家)</th>" +
          "</tr></thead><tbody></tbody></table>" +
          "</div>");
  //创建表头 
  /*$.ajax({
        url : urlContextPath+'/mst/DatatablesLazyLoadServlet?flag=titles',// 跳转到 action 
        data : {
          index : ''
        },
        type : 'post',
        success : function(data) {
          var dataObj = eval(data);
        },
        error : function() {
          alert("异常!");
        }
  });*/
  //填充数据
  initDatatables();
}

注:这个已经是简化版的了,表头可以用另一个ajax传过来,这里省略直接写死了。
下面是后台部分

public class DatatablesLazyLoad extends HttpServlet{
  @Override
  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    this.process(request, response);
  }

  /**
   * datatables 延迟加载 数据加载,flag标注details表示注入数据,titles表示注入标题。
   * @param request
   * @param response
   */
  private void process(HttpServletRequest request, HttpServletResponse response) {
    ServletContext servletContext=request.getSession().getServletContext();
    WebApplicationContext wac =WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
    DictionaryServiceImpl ds=(DictionaryServiceImpl)wac.getBean("oracledictionaryService");

    String flag = request.getParameter("flag");
    String tableCode = request.getParameter("tableCode");
    String fieldCode = request.getParameter("fieldCode");

    if(flag==null)return;
    if(flag.equals("titles")){

    }else if(flag.equals("details")){
      String draw = request.getParameter("draw");
      String start = request.getParameter("start");
      String length = request.getParameter("length");
      StringBuilder sql = new StringBuilder("select ");
      List titles = this.getTitles(tableCode,fieldCode,ds);
      for(int i=0;i<titles.size();i++){
        Map record = (Map)titles.get(i);      
        sql.append(" ").append(record.get("FIELDNAME")).append(", ");
      }
      if(sql.lastIndexOf(",")>0) sql.deleteCharAt(sql.lastIndexOf(","));
      sql.append(" from ").append(tableCode);
      sql.append(" where 1=1 ");
      String filterSql = getFilterSql(titles,request);
      Integer totalCount =ds.getSqlRecordCount("select count(*) from (" + sql.toString()+ ") tmp");
      Integer filterCount = ds.getSqlRecordCount("select count(*) from (" + sql.toString()+filterSql+ ") tmp");

      String[] strings = fieldCode.split(",");

      String orderSql = getOrderSql(strings,request);
      sql.append(filterSql);
      sql.append(orderSql);
      List<Map> lt = ds.executeSqlToRecordMap(sql.toString(),Integer.valueOf(start),Integer.valueOf(length));
      Map result = new LinkedHashMap();
      result.put("draw", draw);
      result.put("recordsTotal", totalCount);//记录总行数
      result.put("recordsFiltered", filterCount);//过滤的行数   

      int count=Integer.valueOf(length)+1;
      for(Map r : lt){
        r.put("DT_RowId", r.get("id"));//设置行主键

        Map rowDate = new LinkedHashMap();//row data
        rowDate.putAll(r);
        r.put("DT_RowData", rowDate);


        r.put("countInx", count);
        count++;
      }
      result.put("data", lt);
      try {
        convertListToJson(result, response);
      } catch (Exception e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
      }
    }
  }

  /**
   * 得到所有的列标题名称
   * @return 
   */
  private List getTitles(String tableCode,String fieldCode,DictionaryServiceImpl ds){
    /*StringBuilder sql = new StringBuilder("select UPPER(ODS_DF_NAME) fieldName,ODS_DF_CN_NAME fieldLabel,ODS_DF_CODE fieldCode,UPPER(ODS_DF_DATA_TYPE) fieldType from ODS.ODS_DF_INFO_REG ");
    sql.append(" where ODS_TB_CODE= '"+tableCode+"' ");
    List<Map> list = ds.executeSqlToRecordMap(sql.toString());
    return list;*/


    StringBuilder sql = new StringBuilder("select UPPER(ODS_DF_NAME) fieldName,ODS_DF_CN_NAME fieldLabel,ODS_DF_CODE fieldCode,UPPER(ODS_DF_DATA_TYPE) fieldType from ODS.ODS_DF_INFO_REG ");
    sql.append(" where 1=1 ");
    sql.append(" and ODS_TB_CODE = '"+tableCode+"'");
    sql.append(" and ODS_DF_NAME in (");
    String[] tmp = fieldCode.split(",");
    StringBuilder ids = new StringBuilder();
    for(String t : tmp){
      if(StringUtils.isEmpty(t)) continue;
      ids.append("'").append(t).append("',");
    }
    if(ids.lastIndexOf(",")>0) ids.deleteCharAt(ids.lastIndexOf(","));
    sql.append(ids);
    sql.append(")");    
    List lt = ds.executeSqlToRecordMap(sql.toString());
    return lt;
  }

  /**
   * 前台搜索
   * @param fieldLt
   * @return
   */
  private String getFilterSql(List<Map> fieldLt,HttpServletRequest request) {
    StringBuilder filterSql = new StringBuilder(" and ( ");
    String searchKey = "search[value]";
    String searchValue = request.getParameter(searchKey);
    System.out.println(searchValue);
    if(StringUtils.isEmpty(searchValue)) return "";
    List<String> filterDetail = new ArrayList();
    for(int i=0;i<fieldLt.size();i++){
      Map field = fieldLt.get(i);
      if(field.get("FIELDTYPE").equals("VARCHAR")){
        String subKey = "columns["+i+"][searchable]";    
        if("true".equals(request.getParameter(subKey))){
          String fieldName = field.get("FIELDNAME").toString();


          String subSql = fieldName + " like '%"+searchValue+"%'";
          filterDetail.add(subSql);
        }
      }
    }
    if(filterDetail.size()==0) return "";
    boolean f = true;
    for(String subSql : filterDetail){
      if(f){
        f= false;
        filterSql.append(subSql);
      }else{
        filterSql.append(" OR ").append(subSql);
      }
    }
    filterSql.append(")");

    return filterSql.toString();
  }

  /**
   * 排序
   * @param fieldLt
   * @return
   */
  private String getOrderSql(String[] titles,HttpServletRequest request){

    StringBuilder orderSql = new StringBuilder(" order by ");
    String indexKey = "order[0][column]";
    String dirKey = "order[0][dir]";
    Integer columnIndex = Integer.valueOf(request.getParameter(indexKey));
    String dir = request.getParameter(dirKey);
    if(columnIndex<=titles.length){
      orderSql.append(titles[columnIndex]).append(" ").append(dir);
      return orderSql.toString();
    }

    return "";
  }

  public void convertListToJson(Map map,HttpServletResponse response)throws Exception{
    JSONArray json = JSONArray.fromObject(map); 
    response.setHeader("Cache-Control", "no-cache");
    response.setContentType("text/html; charset=GBK"); 
    PrintWriter writer;
    writer = response.getWriter();
    writer.write(json.get(0).toString());
    writer.close();
  }
}

总结,做的比较急,也没好好整理下直接贴出来,因为也不难,肯定有地方写的不好,仅供参考。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
深入理解JavaScript中的对象复制(Object Clone)
May 18 Javascript
下一代Bootstrap的5个特点 超酷炫!
Jun 17 Javascript
微信小程序 前端源码逻辑和工作流详解
Oct 08 Javascript
js实现小窗口拖拽效果
Dec 03 Javascript
Bootstrap3 datetimepicker控件使用实例
Dec 13 Javascript
Web纯前端“旭日图”实现元素周期表
Mar 10 Javascript
JS表单提交验证、input(type=number) 去三角 刷新验证码
Jun 21 Javascript
js Dom实现换肤效果
Oct 21 Javascript
React Native 截屏组件的示例代码
Dec 06 Javascript
微信小程序设置全局请求URL及封装wx.request请求操作示例
Apr 02 Javascript
vue3修改link标签默认icon无效问题详解
Oct 09 Javascript
QT与javascript交互数据的实现
May 26 Javascript
jquery插件uploadify多图上传功能实现代码
Aug 12 #Javascript
Javascript中的对象和原型(二)
Aug 12 #Javascript
JavaScript中的对象和原型(一)
Aug 12 #Javascript
JavaScript中对象的不同创建方法
Aug 12 #Javascript
酷! 不同风格页面布局幻灯片特效js实现
Feb 19 #Javascript
JS+CSS3模拟溢出滚动效果
Aug 12 #Javascript
JS中script标签defer和async属性的区别详解
Aug 12 #Javascript
You might like
让PHP支持页面回退的两种方法[转]
2007/02/14 PHP
php google或baidu分页代码
2009/11/26 PHP
PHP实现支持GET,POST,Multipart/form-data的HTTP请求类
2014/09/24 PHP
Zend Framework实现自定义过滤器的方法
2016/12/09 PHP
PHP实现微信支付(jsapi支付)流程步骤详解
2018/03/15 PHP
JQuery 初体验(建议学习jquery)
2009/04/25 Javascript
JS截取字符串常用方法整理及使用示例
2013/10/18 Javascript
Js实现当前点击a标签变色突出显示其他a标签回复原色
2013/11/27 Javascript
javascript的几种继承方法介绍
2016/03/22 Javascript
JS组件Bootstrap dropdown组件扩展hover事件
2016/04/17 Javascript
jquery删除table当前行的实例代码
2016/10/07 Javascript
angularjs中ng-attr的用法详解
2016/12/31 Javascript
jQuery插件FusionCharts实现的2D柱状图效果示例【附demo源码下载】
2017/03/06 Javascript
Vue.Draggable实现拖拽效果
2020/07/29 Javascript
快速了解vue-cli 3.0 新特性
2018/02/28 Javascript
原生JS实现的雪花飘落动画效果
2018/05/03 Javascript
vue中keep-alive的用法及问题描述
2018/05/15 Javascript
详解JavaScript 的变量
2019/03/08 Javascript
编写更好的JavaScript条件式和匹配条件的技巧(小结)
2019/06/27 Javascript
vue配置多代理服务接口地址操作
2020/09/08 Javascript
[57:22]完美世界DOTA2联赛PWL S2 FTD vs PXG 第二场 11.27
2020/12/01 DOTA
[01:02:38]DOTA2-DPC中国联赛定级赛 LBZS vs Phoenix BO3第二场 1月10日
2021/03/11 DOTA
python爬虫正则表达式之处理换行符
2018/06/08 Python
使用pytorch实现可视化中间层的结果
2019/12/30 Python
解决Pycharm的项目目录突然消失的问题
2020/01/20 Python
python实现图片横向和纵向拼接
2020/03/05 Python
python爬虫实现获取下一页代码
2020/03/13 Python
django中related_name的用法说明
2020/05/20 Python
Python调用shell cmd方法代码示例解析
2020/06/18 Python
HTML5实现的震撼3D焦点图动画的示例代码
2019/09/26 HTML / CSS
Boutique 1美国:阿联酋奢侈时尚零售商
2017/10/16 全球购物
家长会主持词开场白
2014/03/18 职场文书
质量承诺书怎么写
2014/05/24 职场文书
共青团员自我评价范文
2014/09/14 职场文书
上班迟到检讨书300字
2014/10/18 职场文书
全陪导游词开场白
2015/05/29 职场文书