1。首先我们先封装一个DatatablesHelper,这里封装了使用datatables对应的方法
import java.util.List;
import com.jfinal.json.JFinalJson;
import com.jfinal.plugin.activerecord.Record;
/**
* DBHelper数据库辅助类
* @author zhengkai
*/
public class DatatablesHelper {
int pageNumber=0;
int pageSize=0;
private String selectStr="";
private String fromStr="";
private String joinStr="";
private String whereStr="";
private String orderbyStr="";
public int getPageNumber() {
return pageNumber;
}
public void setPageNumber(int pageNumber) {
this.pageNumber = pageNumber;
}
public void setPageNumber(String pageNumber) {
if(StringUtils.isNumber(pageNumber)){
this.pageNumber = Integer.parseInt(pageNumber);
}
}
public void setPageNumberByStart(String iDisplayStart,String iDisplayLength) {
if(StringUtils.isNumber(iDisplayStart)&&StringUtils.isNumber(iDisplayLength)){
int s = Integer.parseInt(iDisplayStart);
int l = Integer.parseInt(iDisplayLength);
this.pageNumber = s/l+1;
}
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public void setPageSize(String pageSize) {
if(StringUtils.isNumber(pageSize)){
this.pageSize = Integer.parseInt(pageSize);
}
}
public String getSelectStr() {
return selectStr;
}
public void setSelectStr(String selectStr) {
if(StringUtils.isNotBlank(selectStr))
this.selectStr = selectStr;
}
public String getFromStr() {
return fromStr;
}
public void setFromStr(String fromStr) {
if(StringUtils.isNotBlank(fromStr))
this.fromStr = fromStr;
}
public String getJoinStr() {
return joinStr;
}
public void setJoinStr(String joinStr) {
if(StringUtils.isNotBlank(joinStr))
this.joinStr = joinStr;
}
public String getWhereStr() {
return whereStr;
}
public void setWhereStr(String whereStr) {
if(StringUtils.isNotBlank(whereStr))
this.whereStr = whereStr;
}
public void addWhereStr(String whereStr) {
if(StringUtils.isNotBlank(whereStr))
this.whereStr += " "+whereStr;
}
public String getOrderbyStr() {
return orderbyStr;
}
public void setOrderbyStr(String orderbyStr) {
if(StringUtils.isNotBlank(orderbyStr))
this.orderbyStr = orderbyStr;
}
public String getSql() {
return " "+selectStr+" "+fromStr+" "+joinStr+" "+whereStr+" "+orderbyStr+" ";
}
public String getSqlExceptSelect() {
return " "+fromStr+" "+joinStr+" "+whereStr+" "+orderbyStr+" ";
}
public String getSqlSelect() {
return " "+selectStr+" ";
}
/**
* 目前仅支持Record类型
* @author zhengk
*/
public ResponseDatatables getDatatables(String iTotalDisplayRecords,String iTotalRecords,List<Record> dataList){
ResponseDatatables datatables=new ResponseDatatables();
datatables.setiTotalDisplayRecords(iTotalDisplayRecords);
datatables.setiTotalRecords(iTotalRecords);
datatables.setList(dataList);
return datatables;
}
/**
* 封装成json
* @author zhengk
*/
public String getDatatablesJson(String iTotalDisplayRecords,String iTotalRecords,List<Record> dataList){
ResponseDatatables datatables=new ResponseDatatables();
datatables.setiTotalDisplayRecords(iTotalDisplayRecords);
datatables.setiTotalRecords(iTotalRecords);
datatables.setList(dataList);
return JFinalJson.getJson().toJson(datatables);
}
}
2。还需要一个ResponseDatatables的基础类,这是jfinal需要传输数据到前段的datatables格式的封装。
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import com.jfinal.plugin.activerecord.Record;
/**
* datatables返回json封装
* @author Moshow
*/
public class ResponseDatatables implements Serializable{
private static final long serialVersionUID = 1L;
//总记录数
String iTotalRecords="0";
//输入筛选条件后记录数
String iTotalDisplayRecords="0";
//核心数据
List<Record> list=new ArrayList<Record>();
public String getiTotalRecords() {
return iTotalRecords;
}
public void setiTotalRecords(String iTotalRecords) {
this.iTotalRecords = iTotalRecords;
}
public String getiTotalDisplayRecords() {
return iTotalDisplayRecords;
}
public void setiTotalDisplayRecords(String iTotalDisplayRecords) {
this.iTotalDisplayRecords = iTotalDisplayRecords;
}
public List<Record> getList() {
return list;
}
public void setList(List<Record> list) {
this.list = list;
}
/*public ResponseDatatables<Record> getDatatables(List<Record> dataList){
ResponseDatatables<Record> datatables=new ResponseDatatables<Record>();
datatables.setiTotalDisplayRecords(iTotalDisplayRecords);
datatables.setiTotalRecords(iTotalRecords);
datatables.setList(dataList);
return datatables;
}*/
public ResponseDatatables getDatatables(String iTotalDisplayRecords,String iTotalRecords,List<Record> dataList){
this.iTotalRecords = iTotalRecords;
this.iTotalDisplayRecords = iTotalDisplayRecords;
this.list = dataList;
return this;
}
/**
* 空构造
*/
public ResponseDatatables() {
}
/**
* 参数构造
*/
public ResponseDatatables(String iTotalRecords, String iTotalDisplayRecords,
List<Record> list) {
this.iTotalRecords = iTotalRecords;
this.iTotalDisplayRecords = iTotalDisplayRecords;
this.list = list;
}
}
3。这里是controller控制器,接下来就是Controller与View的对应了
public class CertController extends Controller {
/**
* 获取个人证书列表
* 参数:searchTxt1/searchTxt2为页面传回的条件
* 返回:json
* @author:zhengkai
*/
public void certPersonList() {
//分页获取
String searchTxt1=getPara("cert_number");
String searchTxt2=getPara("cert_name");
DatatablesHelper dbHelper=new DatatablesHelper();
dbHelper.setPageNumberByStart(getPara("iDisplayStart"),getPara("iDisplayLength"));
dbHelper.setPageSize(getPara("iDisplayLength"));
dbHelper.setSelectStr("select *");
dbHelper.setFromStr("from cert_person");
dbHelper.setWhereStr("where 1=1 ");
dbHelper.addWhereStr(StringUtils.nvlPlus(searchTxt1, " and cert_number like '%"+searchTxt1+"%'" ));
dbHelper.addWhereStr(StringUtils.nvlPlus(searchTxt2, " and cert_name like '%"+searchTxt2+"%'" ));
dbHelper.setOrderbyStr("order by cert_number desc ");
Page<Record> recordPage = Db.paginate(dbHelper.getPageNumber(), dbHelper.getPageSize(), dbHelper.getSqlSelect(), dbHelper.getSqlExceptSelect());
//计算统计数据 iTotalDisplayRecords为加搜索条件后 iTotalRecords为搜索前
String iTotalDisplayRecords=recordPage.getTotalRow()+"";
dbHelper.setWhereStr("where 1=1 ");//重置搜索条件后计算总记录,记得加上固定条件,例如查询某个customer的时候
String iTotalRecords=Db.queryLong("select count(1)"+dbHelper.getSqlExceptSelect())+"";
renderJson(dbHelper.getDatatablesJson(iTotalDisplayRecords,iTotalRecords, recordPage.getList()));
//renderJson(json);
}
}
4。datatables的table定义
<table id="datatables" class="table table-border table-bordered table-bg table-hover" cellspacing="0" width="100%">
<thead>
<tr>
<th>证书编码</th>
<th>个人姓名</th>
<th>认证课程</th>
<th>开始日期</th>
<th>结束日期</th>
<th>详情</th>
</tr>
</thead>
</table>
5。关于datatables引入,
官网https://datatables.net/
中文网http://www.datatables.club/
开始使用DataTables很简单,只需要引入两个文件, 一个css样式文件和DataTables本身的脚本文件。在DataTables CDN上,可以使用下面这两个文件
http://cdn.datatables.net/1.10.15/css/jquery.dataTables.min.css
http://cdn.datatables.net/1.10.15/js/jquery.dataTables.min.js
6。datatables的js定义,难得地方应是这里, 有很多种配置的,可以去官方看,记得当年研究了半天后来自己写了这个。
<script type="text/javascript">
$(function(){ });
var iDisplayLength=10;
var iDisplayStart=1;
var oTable;
/**
* 空值转换
*/
function nvl(data){
if (data == undefined||data==null||$.trim(data)=="") {
return " ";
} else {
return data;
}
}
function deleteDate(item){
$.post(
"${basePath}cert/deleteCertPerson", //url地址
"cert_number="+item, //序列化表单
function(data) { //回调
alert("删除成功!");
}
);
}
function datatables_init(){
//初始化datatables
oTable=$('#datatables')
.dataTable({
"bProcessing" : true,
"searching" :false,
"bDestory" : true,
"bRetrieve" : true,
"bPaginate" : true, //显示分页器
//前端自动分页模式,适用少量数据
/* "ajax" : {
"url" : "${basePath}erpbill/purorderQuery",
//默认为data,这里定义为demo
"dataSrc" : "list"
}, */
//服务端分页模式,适用大量数据
"bServerSide": true,
"sAjaxDataProp" : "list",
"sAjaxSource" : "${basePath}cert/certPersonList",
"fnServerParams" : //向服务器发送数据
function (aoData) {
aoData.push(
{ "name": "cert_number", "value": $("#cert_number").val() },
{ "name": "cert_name", "value": $("#cert_name").val() }
);
},
"columnDefs" : [//列加工模式,下标从0~n为左边到右边正数,-n为右边倒数第几个
{
"targets" : [ 0 ],
"data" : "cert_number",//证书名称
"orderable":false,
"render" : function(data, type, full) {
//return nvl(data);
return '<a target="_blank" href="${basePath}cert/certPersonDisplay?cert_number='+nvl(data)+'">'+nvl(data)+'</a>';
//return '<input type="checkbox" id="'+data+'">';
}
},
{
"targets" : [ 1 ],
"data" : "cert_name",//公司名称
"render" : function(data, type, full) {
return nvl(data);
}
},
{
"targets" : [ 2 ],
"data" : "cert_lesson",//公司地址
"render" : function(data, type, full) {
return nvl(data);
}
},
{
"targets" : [ 3 ],
"data" : "cert_validate_start",//开始日期
"render" : function(data, type, full) {
return nvl(data);
}
},{
"targets" : [ 4 ],
"data" : "cert_validate_end",//结束日期
"render" : function(data, type, full) {
return nvl(data);
}
},
{
"targets" : [ 5 ],
"data" : "cert_number",
"orderable":false,
"render" : function(data, type, full) {
return ''//'<a class="btn btn-primary-outline radius"><span class="row-details" id="'+data+'"><i class="Hui-iconfont Hui-iconfont-arrow3-bottom">详情</i></span></a> '
<#if isAdmin??>
+'<a class="btn btn-primary-outline radius" onclick="layer_show(\'证书编辑\',\'${basePath}cert/certPersonEdit?oid='+nvl(data)+'\',\'\',\'550\')"><i class="Hui-iconfont Hui-iconfont-edit2"></i>编辑</a>'
</#if>
+'<a class="btn btn-primary-outline radius" onclick="layer_show(\'证书详情\',\'${basePath}cert/certPersonDisplay?cert_number='+nvl(data)+'\',\'\',\'550\')"><i class="Hui-iconfont Hui-iconfont-edit2"></i>查看</a>'
;
}
}
]
});
oTable.fnDraw();
}
//页面初始化
datatables_init();
//重新加载,可以按钮触发
function reloadDatatables(){
oTable.fnClearTable(); //清空一下table
oTable.fnDestroy(); //还原初始化了的datatable
datatables_init(); //重新加载
}
//监听点击详情
$('.table').on('click', ' tbody td .row-details',
function() {
var nTr = $(this).parents('tr')[0];
if (oTable.fnIsOpen(nTr)) //判断是否已打开
{
/* This row is already open - close it */
$(this).children().addClass("Hui-iconfont-arrow3-bottom").removeClass("Hui-iconfont-arrow3-top");
oTable.fnClose(nTr);
} else {
/* This row is opened*/
$(this).children().addClass("Hui-iconfont-arrow3-top").removeClass("Hui-iconfont-arrow3-bottom");
// 调用方法显示详细信息 data_id为自定义属性 存放配置ID
fnFormatDetails(nTr, $(this).attr("id"));
}
});
function fnFormatDetails(nTr, pdataId) {
//根据配置Id 异步查询数据
$.get("${basePath}cert/certPersonDetail?cert_number="+pdataId,
function(data) {
var sOut = '';
if(data!=""){
//绘制开始样式
sOut = '<table class="table table-border table-bordered table-hover"><thead><tr class="warning"><th>证书编码</th><th>个人姓名</th><th>认证课程</th></tr></thead><tbody>';
//循环输出列表样式
sOut += '<tr class="danger"><td>' + data.cert_number +'</td><td>'+ data.cert_name +'</td><td>'+ data.cert_lesson+'</td></tr>';
//绘制结束样式
sOut += '</tbody></table>';
oTable.fnOpen(nTr, sOut, 'details');
}else{
sOut = '<center> <p style="width:70%"><i class="Hui-iconfont Hui-iconfont-face-ku">没有'+pdataId+'详细信息</i></p></center>';
oTable.fnOpen(nTr, sOut, 'details');
}
});
}
/*弹出窗口*/
function window_pop(title,url,w,h){
layer_show(title,url,w,h);
}
</script>