本人在最近一个小项目中整合的,看到osc上还没有,就发一个先。
欢迎大侠们拍砖。
界面table的代码:
<table cellpadding="0" cellspacing="0" border="0" class="table table-striped table-bordered" id="otable" width="100%"> <thead> <tr> <th>ServerID</th> <th>SystemID</th> <th>服务名称</th> <th>Ip</th> <th>在线时间</th> <th>最后一次在线时间</th> <th>是否在线</th> </tr> </thead> <tbody> </tbody> </table>
js里初始化table oTable = $('#otable').initDT({ "sAjaxSource": "${_BASE_PATH}/server/query" });
java端jfinal controller里的方法:
public void query() { StringBuilder where = new StringBuilder("from dbo.GpsServerInfo where 1=1 "); List<String> params = new ArrayList<String>(); if (!StringUtils.isBlank(getPara("serverID"))) { where.append("and ServerId like ? "); params.add("" + getPara("serverID") + "%"); } if (!StringUtils.isBlank(getPara("serverType"))) { where.append("and System_ID = ?"); params.add(getPara("serverType")); } DataTablesModel dtm = GpsServerInfo.dao.paginateDataTables(getParaToInt("page") .intValue(), getParaToInt("rp").intValue(), "select ServerID,ServerID as showID,System_ID,IpAddress,OnlineTime,LastOnlineTime,OnLineFlag ", where.toString(),params.toArray()); List<List<String>> rows = dtm.getRows(); for (int i = 0; i < rows.size(); i++) { List<String> row = rows.get(i); if ("1".equals(row.get(5))) { row.set(5, "<span class=\"label label-success\">online</span>"); } else if ("0".equals(row.get(5))) { row.set(5, "<span class=\"label label-warning\">offline</span>"); } else { row.set(5, ""); } row.add(2, CodeConfig.getValueByKeyFromCode("configCode", row.get(1))); } this.renderJson(dtm); }
我针对datatables单独封装了一个分页查询,返回的结果格式的json字符串是:
{"total":39,//总记录数
"rp":10,//每页条数
"page":1,//当前页
"ids":["1","2","8","9","10","32","33","65","67","99"],//id列表
"rows":[["1","P20120806094914","通讯网关服务","192.168.83.226","2013-05-22 17:28:33.053","2013-05-22 17:37:55.21","<span class=\"label label-success\">online<\/span>"],
["2","P20100115165302","业务服务","192.168.83.253","2013-02-27 13:37:18.703","2013-02-27 14:03:10.437","<span class=\"label label-warning\">offline<\/span>"],
["8","P20130108141508","短信网关","192.168.83.126","2013-05-17 13:33:41.737","2013-05-19 12:08:29.953","<span class=\"label label-warning\">offline<\/span>"],
["9","P20130108141459","转发服务","192.168.83.226","2013-03-06 15:29:09.667","2013-03-06 15:34:39.667","<span class=\"label label-success\">online<\/span>"],
["10","P20110307164005","接收服务","192.168.83.100","2013-04-07 12:47:22.233","2013-04-08 10:59:22.653","<span class=\"label label-success\">online<\/span>"],
["32","P20100115165302","业务服务","192.168.83.253","2013-02-26 08:52:19.843","","<span class=\"label label-success\">online<\/span>"],
["33","P20100115165302","业务服务","192.168.83.253","2013-02-26 09:54:31.0","2013-02-26 09:56:56.06","<span class=\"label label-success\">online<\/span>"],
["65","P20120806094914","通讯网关服务","192.168.83.253","2013-03-07 11:15:05.26","2013-03-07 14:28:59.073","<span class=\"label label-success\">online<\/span>"],
["67","P20100115165302","业务服务","192.168.83.253","2013-04-27 08:59:45.52","2013-04-27 10:56:54.233","<span class=\"label label-success\">online<\/span>"],
["99","P20130108141459","转发服务","192.168.83.126","2013-03-06 16:31:44.683","2013-03-06 16:52:22.637","<span class=\"label label-success\">online<\/span>"]
]
}
下面是单独封装的分页方法:
/** * */ package com.starnet.frame.core.activerecord; import com.jfinal.plugin.activerecord.Model; import com.jfinal.plugin.activerecord.Page; import com.jfinal.plugin.activerecord.TableInfo; import com.jfinal.plugin.activerecord.TableInfoMapping; import com.starnet.frame.core.model.DataTablesModel; import java.util.*; /** * @author huxiang * */ @SuppressWarnings({ "rawtypes" }) public abstract class DbModel<T extends DbModel> extends Model<T> { private static final long serialVersionUID = -6215428115177000482L; private static final TableInfoMapping tableInfoMapping = TableInfoMapping .me(); /** * 用来针对DataTables封装的分页查询 * * @param pageNumber * @param pageSize * @param select * @param sqlExceptSelect * @param paras * @return */ @SuppressWarnings("unchecked") public DataTablesModel paginateDataTables(int pageNumber, int pageSize, String select, String sqlExceptSelect, Object... paras) { Page<T> pages = super.paginate(pageNumber, pageSize, select, sqlExceptSelect, paras); TableInfo tInfo = tableInfoMapping.getTableInfo(getClass()); List<String> ids = new ArrayList<String>(); List<List<String>> cells = new ArrayList<List<String>>(); for (int i = 0; i < pages.getList().size(); i++) { T t = pages.getList().get(i); Map attrs = t.getAttrs(); Set<String> key = attrs.keySet(); List<String> cell = new ArrayList<String>(); for (Iterator it = key.iterator(); it.hasNext();) { String s = (String) it.next(); if (s.toLowerCase().equals(tInfo.getPrimaryKey().toLowerCase())) { ids.add(attrs.get(s).toString()); } else { if (null != attrs.get(s)) { cell.add(attrs.get(s).toString()); } else { cell.add(""); } } } cells.add(cell); } return new DataTablesModel(pageNumber, pageSize, pages.getTotalRow(), ids, cells); } /** * 用来针对DataTables封装的分页查询 * * @param pageNumber * @param pageSize * @param select * @param sqlExceptSelect * @return */ public DataTablesModel paginateDataTables(int pageNumber, int pageSize, String select, String sqlExceptSelect) { return this.paginateDataTables(pageNumber, pageSize, select, sqlExceptSelect, new Object[0]); } }
另需要说明的是:原来jfinal的查询返回的字段顺序不是按照查询selcet的顺序。我直接改了jfinal的大小写不敏感工厂类主要可以按照查询的字段顺序获取结果,其实就是改成了LinkedHashSet、LinkedHashMap:
package com.starnet.frame.core.activerecord; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.Map; import java.util.Set; import com.jfinal.plugin.activerecord.IContainerFactory; /** * 修改了原jfinal的大小写不敏感工厂类,主要可以按照查询的字段顺序获取结果 * @author huxiang * */ @SuppressWarnings({"rawtypes", "unchecked"}) public class CaseInsensitiveContainerFactory implements IContainerFactory { private static boolean toLowerCase = false; public CaseInsensitiveContainerFactory() { } public CaseInsensitiveContainerFactory(boolean toLowerCase) { CaseInsensitiveContainerFactory.toLowerCase = toLowerCase; } public Map<String, Object> getAttrsMap() { return new CaseInsensitiveMap(); } public Map<String, Object> getColumnsMap() { return new CaseInsensitiveMap(); } public Set<String> getModifyFlagSet() { return new CaseInsensitiveSet(); } private static Object convertCase(Object key) { if (key instanceof String) return toLowerCase ? ((String) key).toLowerCase() : ((String) key) .toUpperCase(); return key; } /* * 1:非静态内部类拥有对外部类的所有成员的完全访问权限,包括实例字段和方法, * 为实现这一行为,非静态内部类存储着对外部类的实例的一个隐式引用 * 2:序列化时要求所有的成员变量是Serializable 包括上面谈到的引式引用 * 3:外部类CaseInsensitiveContainerFactory 需要 implements Serializable 才能被序列化 * 4:可以使用静态内部类来实现内部类的序列化,而非让外部类实现 implements Serializable */ public static class CaseInsensitiveSet extends LinkedHashSet { private static final long serialVersionUID = 102410961064096233L; public boolean add(Object e) { return super.add(convertCase(e)); } public boolean remove(Object e) { return super.remove(convertCase(e)); } public boolean contains(Object e) { return super.contains(convertCase(e)); } } public static class CaseInsensitiveMap extends LinkedHashMap { private static final long serialVersionUID = 6843981594457576677L; public Object get(Object key) { return super.get(convertCase(key)); } public boolean containsKey(Object key) { return super.containsKey(convertCase(key)); } public Object put(Object key, Object value) { return super.put(convertCase(key), value); } public void putAll(Map m) { for (Map.Entry e : (Set<Map.Entry>) (m.entrySet())) put(e.getKey(), e.getValue()); } public Object remove(Object key) { return super.remove(convertCase(key)); } } }
最后非常感谢jfinal,也谢谢分享开源的开发者。