基於SSM和jstl的分頁實現
阿新 • • 發佈:2019-01-23
以前用jsp和原生的JDBC實現過分頁,現在一看,不僅程式碼冗餘,而且可讀性差,今天分享一種簡潔的實現方式,我用起來是很方便的。
一.概述
主要思想就是建一個Page類,所有跟分頁有關的引數都放在這個類裡,這個類裡放一個集合用來裝返回的資料,前端用JSTL提供的標籤進行展示。這裡需要注意的是,Oracle與mysql不同,沒有提供類似limit這樣的函式,稍微麻煩一點,我們用rownum做分頁。
我們舉個例子,在資料庫(Oracle)裡有名為Game的一張表,欄位有no,name,company,type,現在要做的是在前端用jsp展示,看程式碼
二.結構
1. model包中有兩個類
public class AnyPage<T> {
private int currentPage; //畫面接收到的當前頁數。
private int dataCountOnePage = 5; //每頁要顯示的資料量。
private int indexRowNum; //當前頁要顯示的第一條記錄的行號。
private int lastRowNum; //當前頁要顯示的最後一條記錄的行號。
private int dataCount; //資料庫記錄總數
private int pageCount; //頁碼數
private List<T> games; //每頁要顯示的資料集合。
private T t;
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
public List<T> getGames() {
return games;
}
public void setGames (List<T> games) {
this.games = games;
}
public int getDataCount() {
return dataCount;
}
//根據資料庫總資料量算出總頁數
public void setDataCount(int dataCount) {
this.dataCount = dataCount;
pageCount = dataCount / dataCountOnePage;
if (dataCount % dataCountOnePage != 0) {
pageCount = pageCount + 1;
}
}
public int getPageCount() {
return pageCount;
}
public void setPageCount(int pageCount) {
this.pageCount = pageCount;
}
public int getCurrentPage() {
return currentPage;
}
//根據當前的頁數算出開始和結束的rownum
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
this.lastRowNum = currentPage * dataCountOnePage;
this.indexRowNum = this.lastRowNum - (dataCountOnePage - 1);
}
public int getDataCountOnePage() {
return dataCountOnePage;
}
public void setDataCountOnePage(int dataCountOnePage) {
this.dataCountOnePage = dataCountOnePage;
}
public int getIndexRowNum() {
return indexRowNum;
}
public void setIndexRowNum(int indexRowNum) {
this.indexRowNum = indexRowNum;
}
public int getLastRowNum() {
return lastRowNum;
}
public void setLastRowNum(int lastRowNum) {
this.lastRowNum = lastRowNum;
}
}
//Game類
public class Game {
//對應資料庫的欄位
private int no;
private String name;
private String company;
private String type;
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
在這裡AnyPage採用泛型,也是一個小技巧。
2.mapper包:GameMapper的介面和XML配置檔案
//mapper介面
public interface GameMapper {
//分頁查詢
List<Game> selectByPage(AnyPage anyPage);
//統計總數量
AnyPage selectDataCount();
}
//XML配置
<mapper namespace="com.easy.mapper.GameMapper">
<select id="selectByPage" parameterType="com.easy.model.AnyPage" resultType="com.easy.model.Game">
select no, name, company, type
from
(select rownum r, no, name, company, type
from game where no > #{no})
where r between #{indexRowNum} and #{lastRowNum}
</select>
<select id="selectDataCount" resultType="com.easy.model.AnyPage">
select count(no) dataCount from game
</select>
</mapper>
3.service包:GameService介面
//定義分頁查詢的介面
public interface GameService {
public AnyPage selectByPage(AnyPage anyPage);
}
**4.serviceImpl包**
//具體實現類,這裡用的是spring整合
@Service
public class GameServiceImpl implements GameService{
@Autowired
GameMapper gameMapper;
@Override
public AnyPage selectByPage(AnyPage anyPage) {
//根據引數查詢到分頁後的game
List<Game> list = gameMapper.selectByPage(anyPage);
//查詢總數量
AnyPage anyPage2 = gameMapper.selectDataCount();
anyPage2.setGames(list);
//以AnyPage的形式返回
return anyPage2;
}
}
5.Controller包
```
//這裡使用的是SpringMVC作為控制器
public class GameController {
@Autowired
GameService gameService;
@RequestMapping("sp")
public String selectByPage(AnyPage anyPage, Map<String, Object> map) {
//在服務層將分頁程式碼處理好
AnyPage anyPage2 = gameService.selectByPage(anyPage);
anyPage2.setCurrentPage(anyPage.getCurrentPage());
///以map作為資料模型
map.put("anyPage", anyPage2);
return "games";
}
}
6.前端:jsp
<h1>分頁展示</h1>
<table border="1" cellspacing="0">
<tr>
<td>#</td>
<td>遊戲名</td>
<td>公司</td>
<td>型別</td>
</tr>
<c:forEach items="${requestScope.anyPage.games}" var="game" varStatus="b1">
<tr>
<td>${b1.count}</td>
<td>${game.name }</td>
<td>${game.company }</td>
<td>${game.type }</td>
</tr>
</c:forEach>
</table>
<c:forEach begin="1" end="${requestScope.anyPage.pageCount }" var="page">
<c:if test="${not page eq requestScope.anyPage.currentPage }">
<a href="${pageContext.request.contextPath }/gc/sp?currentPage=${page}">
${page}
</a>
</c:if>
<c:if test="${not page eq requestScope.anyPage.currentPage }">
${page}
</c:if>
</c:forEach>
“`
這裡面我截取了其中重要的部分,JSTL提供的標籤真的很方便,省去了大量的java程式碼,可讀性性也比較高,還有需要注意的是,最後ye頁面編碼角標的判斷,迴圈判斷的方式也是很好的想法。怎麼樣,很簡單吧。