JFinal整合datatables實現的表格

本人在最近一個小項目中整合的,看到osc上尚未,就發一個先。 html

歡迎大俠們拍磚。 java

界面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字符串是: sql

{"total":39,//總記錄數 json

  "rp":10,//每頁條數 app

  "page":1,//當前頁 ui

  "ids":["1","2","8","9","10","32","33","65","67","99"],//id列表 this

  "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>"], spa

             ["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>"], code

             ["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>"], server

             ["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,也謝謝分享開源的開發者。

相關文章
相關標籤/搜索