JeeSite | 數據分頁與翻頁


  本文章介紹的是JeeSite開源項目二次開發時的一些筆記,對於沒有使用過JeeSite的可以不用往下看了,因為下面的代碼是跟JeeSite二次開發相關的代碼,不做JeeSite的二次開發,以下代碼對您無用,在這里友情提醒,避免浪費您寶貴的時間。

 

  翻頁功能在各種項目中都會用到,在JeeSite開源項目中使用翻頁也非常的容易,只要在配置文件中進行就可以就可以使用,系統的默認值為30頁。

  配置文件在src\main\resources\jeesite.properties文件中,配置如下:

1 page.pageSize=30

  但是這種配置並不能滿足所有的分頁要求,也就是說在不同的列表中分頁的條數是不同的。如果在配置文件中修改分頁條數,那么會影響到整個項目的分頁,它是一個全局的配置參數,這樣就很不方便了。

 

JeeSite手冊的分頁

  在做項目的時候,由於使用JeeSite的默認頁數無法滿足項目的需求,因為不可能每個列表頁都以30條記錄作為一頁,因此只能看手冊。看手冊又沒有具體理解如何使用,JeeSite手冊中最分頁的描述如下:

1 // 設置分頁參數,則分頁,如果不設置,則根據條件獲取全部
2 user.setPage(page);
3 // 執行分頁查詢
4 page.setList(userDao.findPage(user));

  按照手冊的方法簡單的嘗試了一下,但是沒有效果,因此就只能查看分頁的源碼了。

 

分頁源碼

  在使用開源項目的時候遇到問題,如果又沒有手冊,或者手冊說明不是特別詳細的話,除了在網上找資料外,就只剩下閱讀開源項目的源代碼了。(注:關於分頁這個問題在網上還是有很多人問的,大部分都是說修改配置文件,但是同樣無法滿足提問人的需要,因為大家需要的是不同的列表中有不同的分頁條數。)

  在Eclipse下按下Ctrl+Shift+R,輸入“page.java”,然后打開該Java文件。看一下Page類的構造方法,代碼如下:

 1 /**
 2  * 構造方法
 3  * @param request 傳遞 repage 參數,來記住頁碼
 4  * @param response 用於設置 Cookie,記住頁碼
 5  */
 6 public Page(HttpServletRequest request, HttpServletResponse response){
 7     this(request, response, -2);
 8 }
 9 
10 /**
11  * 構造方法
12  * @param request 傳遞 repage 參數,來記住頁碼
13  * @param response 用於設置 Cookie,記住頁碼
14  * @param defaultPageSize 默認分頁大小,如果傳遞 -1 則為不分頁,返回所有數據
15  */
16 public Page(HttpServletRequest request, HttpServletResponse response, int defaultPageSize){
17     // 設置頁碼參數(傳遞repage參數,來記住頁碼)
18     String no = request.getParameter("pageNo");
19     if (StringUtils.isNumeric(no)){
20         CookieUtils.setCookie(response, "pageNo", no);
21         this.setPageNo(Integer.parseInt(no));
22     }else if (request.getParameter("repage")!=null){
23         no = CookieUtils.getCookie(request, "pageNo");
24         if (StringUtils.isNumeric(no)){
25             this.setPageNo(Integer.parseInt(no));
26         }
27     }
28     // 設置頁面大小參數(傳遞repage參數,來記住頁碼大小)
29     String size = request.getParameter("pageSize");
30     if (StringUtils.isNumeric(size)){
31         CookieUtils.setCookie(response, "pageSize", size);
32         this.setPageSize(Integer.parseInt(size));
33     }else if (request.getParameter("repage")!=null){
34         size = CookieUtils.getCookie(request, "pageSize");
35         if (StringUtils.isNumeric(size)){
36             this.setPageSize(Integer.parseInt(size));
37         }
38     }else if (defaultPageSize != -2){
39         this.pageSize = defaultPageSize;
40     }
41     // 設置頁面分頁函數
42     String funcName = request.getParameter("funcName");
43     if (StringUtils.isNotBlank(funcName)){
44         CookieUtils.setCookie(response, "funcName", funcName);
45         this.setFuncName(funcName);
46     }else if (request.getParameter("repage")!=null){
47         funcName = CookieUtils.getCookie(request, "funcName");
48         if (StringUtils.isNotBlank(funcName)){
49             this.setFuncName(funcName);
50         }
51     }
52     // 設置排序參數
53     String orderBy = request.getParameter("orderBy");
54     if (StringUtils.isNotBlank(orderBy)){
55         this.setOrderBy(orderBy);
56     }
57 }
58 
59 /**
60  * 構造方法
61  * @param pageNo 當前頁碼
62  * @param pageSize 分頁大小
63  */
64 public Page(int pageNo, int pageSize) {
65     this(pageNo, pageSize, 0);
66 }
67 
68 /**
69  * 構造方法
70  * @param pageNo 當前頁碼
71  * @param pageSize 分頁大小
72  * @param count 數據條數
73  */
74 public Page(int pageNo, int pageSize, long count) {
75     this(pageNo, pageSize, count, new ArrayList<T>());
76 }
77 
78 /**
79  * 構造方法
80  * @param pageNo 當前頁碼
81  * @param pageSize 分頁大小
82  * @param count 數據條數
83  * @param list 本頁數據對象列表
84  */
85 public Page(int pageNo, int pageSize, long count, List<T> list) {
86     this.setCount(count);
87     this.setPageNo(pageNo);
88     this.pageSize = pageSize;
89     this.list = list;
90 }

  從源碼中可以看出Page類有很多的構造方法,如果需要自定義每頁有多少條記錄,那么需要使用的構造方法是第二個構造方法,代碼如下:

 1 /**
 2  * 構造方法
 3  * @param request 傳遞 repage 參數,來記住頁碼
 4  * @param response 用於設置 Cookie,記住頁碼
 5  * @param defaultPageSize 默認分頁大小,如果傳遞 -1 則為不分頁,返回所有數據
 6  */
 7 public Page(HttpServletRequest request, HttpServletResponse response, int defaultPageSize){
 8     // 設置頁碼參數(傳遞repage參數,來記住頁碼)
 9     String no = request.getParameter("pageNo");
10     if (StringUtils.isNumeric(no)){
11         CookieUtils.setCookie(response, "pageNo", no);
12         this.setPageNo(Integer.parseInt(no));
13     }else if (request.getParameter("repage")!=null){
14         no = CookieUtils.getCookie(request, "pageNo");
15         if (StringUtils.isNumeric(no)){
16             this.setPageNo(Integer.parseInt(no));
17         }
18     }

  這個構造方法比系統默認生成代碼使用的構造函數多了一個參數——defaultPageSize,這個參數可以用來設置每頁的記錄數,調用方法如下:

1 Page<Xxx> p = new Page<Xxx>(request, response, 10);
2 Page<Xxx> page = xxxService.findPage(p, xxx);

  JeeSite生成的代碼中調用的方法如下(JeeSite有一個代碼生成的功能,代碼生成中對分頁的使用如下):

1 Page<Xxx> page = xxxService.findPage(new Page<Xxx>(request, response), xxx);

  在該源碼上下斷點,發現這里在實例化Page類時,調用的構造方法如下:

1 /**
2  * 構造方法
3  * @param request 傳遞 repage 參數,來記住頁碼
4  * @param response 用於設置 Cookie,記住頁碼
5  */
6 public Page(HttpServletRequest request, HttpServletResponse response){
7     this(request, response, -2);
8 }

  在該構造方法中同樣調用的是Page.java中第二個構造方法。

 

JS翻頁

  在JeeSite中使用了BootStrap的前端庫,使用這個前端庫可以很容易的使用“彈出的模態對話框”。使用模態對話框,可能會是一個表單提交一些數據,也可能是其他表單數據列表。使用模態對話框時,如果是數據列表的話,那么也會涉及到列表分頁的問題。調用的代碼如下:

 1 <div class="control-group">
 2     <label class="control-label">個人信息:</label>
 3     <div class="controls">
 4         <input type="text" name="personName" />
 5         <form:hidden path="personId" />
 6         <span class="help-inline"><font color="red">*</font> </span><a
 7             href="url/Controller..."
 8             role="button" class="btn" data-target="#PersonModal"
 9             data-toggle="modal">選擇</a>
10     </div>
11 </div>
12 ……
13 <div id="PersonModal" class="modal hide fade" tabindex="-1" role="dialog"
14     aria-labelledby="myModalLabel" aria-hidden="true">
15     <div class="modal-header">
16         <button type="button" class="close" data-dismiss="modal"
17             aria-hidden="true">×</button>
18         <h3 id="PersonModalLabel">選擇人員</h3>
19     </div>
20     <div class="modal-body" id="PersonBody"></div>
21     <div class="modal-footer">
22         <button class="btn" data-dismiss="modal" aria-hidden="true">取消</button>
23         <button class="btn btn-primary" id="selectPerson">確定</button>
24     </div>
25 </div>

  當點擊上半段代碼的“選擇”按鈕時,通過href指定的URL地址可以將另外一個頁面顯示到該頁面中,然后獲取到的數據會在下半段代碼的具有屬性“modal-body”的div中顯示出來。這時,顯示的是另外一個頁面的內容的,而顯示頁面的JS代碼是無法帶過來的。那么,翻頁默認調用的JS代碼就不能使用了。翻頁的代碼如下:

1 function page(n,s){
2     $("#pageNo").val(n);
3     $("#pageSize").val(s);
4     $("#searchForm").submit();
5     return false;
6 }

  這段代碼是就無法調用了,那么要翻頁就需要重新定義了,並且,重新定義后的JS代碼要在完成分頁的情況下將數據仍然顯示到“modal-body”中。但是重新定義一個翻頁的JS函數如何讓頁碼列表調用呢?

  在Page類中,提供了一個非常實用的方法,它可以指定翻頁的JS函數,方法如下:

1 /**
2  * 設置點擊頁碼調用的js函數名稱,默認為page,在一頁有多個分頁對象時使用。
3  * @param funcName 默認為page
4  */
5 public void setFuncName(String funcName) {
6     this.funcName = funcName;
7 }

  有了這個函數就可以完成翻頁了,甚至在多個模態對話框中都使用到需要翻頁的列表,也可以解決了。調用方法如下:

1 Page<Xxx> p = new Page<Xxx>(request, response, 10);
2 p.setFuncName("ctPage");
3 Page<Xxx> page = xxxService.findPage(p, xxx);

  這樣,生成的分頁頁碼中在調用翻頁函數時,就可以調用自定義的翻頁函數ctPage()了。定義的翻頁方法如下:

 1 function hrPage(n, s) {         
 2     $.ajax({  
 3         type: "POST",  
 4         url:"${ctx}/...",   // 具體的地址省略
 5         data:{pageNo:n, pageSize:s},
 6         async: false,
 7         error: function(request) { 
 8             
 9         },
10         success: function(data) {
11             $('#PersonBody').empty();
12             $('#PersonBody').append(data);
13         }
14     });
15 }

  函數體就是自定義的翻頁方法了。

 

  這些都是我在實際使用JeeSite時所遇到的問題的解決方法。有問題歡迎討論!!

 

  關於JeeSite的另一篇筆記是:JeeSite中Excel導入導出

 


 

我的微信公眾號:“碼農UP2U”


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM