1. 程式人生 > >基於SSM和jstl的分頁實現

基於SSM和jstl的分頁實現

以前用jsp和原生的JDBC實現過分頁,現在一看,不僅程式碼冗餘,而且可讀性差,今天分享一種簡潔的實現方式,我用起來是很方便的。
一.概述
主要思想就是建一個Page類,所有跟分頁有關的引數都放在這個類裡,這個類裡放一個集合用來裝返回的資料,前端用JSTL提供的標籤進行展示。這裡需要注意的是,Oracle與mysql不同,沒有提供類似limit這樣的函式,稍微麻煩一點,我們用rownum做分頁。
我們舉個例子,在資料庫(Oracle)裡有名為Game的一張表,欄位有no,name,company,type,現在要做的是在前端用jsp展示,看程式碼
二.結構
1. model包中有兩個類

: AnyPage和Game類

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頁面編碼角標的判斷,迴圈判斷的方式也是很好的想法。怎麼樣,很簡單吧。