JSP通用分頁框架

SimaDouglas 8年前發布 | 36K 次閱讀 JSP Java開發

來自: http://blog.csdn.net/u012706811/article/details/50685355


寫一個通用的分頁框架,這樣一個項目里面如果想做分頁,只需要改動少數參數就可以實現分頁處理了,這樣寫起來會簡單很多


一.分頁類

既然要分頁那么我們就要考慮建一個通用的分頁類,里面需要的參數一般有:

  • 總頁數 totalPage
  • 總共記錄數 totalRecord
  • 每頁顯示數 pageSize
  • 當前頁pageIndex
  • 承載當前頁數據的集合 List datas
    完整代碼:Page.java
  • import java.util.List;

    public class Pager<E> { / 總共頁數 / private int totalPages; / 總共記錄數 / private int totalRecords; / 每頁顯示數量 / private int pageSize; / 當前頁 / private int pageIndex; /* 當前頁數據集合 */ private List<E> datas;

    public void setTotalPages(int totalPages) {
        this.totalPages = totalPages;
    }
    
    public void setTotalRecords(int totalRecords) {
        this.totalRecords = totalRecords;
    }
    
    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }
    
    public void setPageIndex(int pageIndex) {
        this.pageIndex = pageIndex;
    }
    
    public void setDatas(List<E> datas) {
        this.datas = datas;
    }
    
    public int getTotalPages() {
        return totalPages;
    }
    
    public int getTotalRecords() {
        return totalRecords;
    }
    
    public int getPageSize() {
        return pageSize;
    }
    
    public int getPageIndex() {
        return pageIndex;
    }
    
    public List<E> getDatas() {
        return datas;
    }
    

    }</pre>

    二.用戶類

    這里以查詢用戶來做分頁為例,所以就需要一個用戶類

  • 用戶號 userId
  • 用戶姓名 username
  • 用戶密碼 password
  • 注冊時間 regdate
    完整代碼
  • import java.sql.Timestamp;

    public class User { private int userId;//用戶id private String username;//用戶名 private String password;//密碼 private Timestamp regdate;//注冊時間

    public int getUserId() {
        return userId;
    }
    
    public void setUserId(int userId) {
        this.userId = userId;
    }
    
    public String getUsername() {
        return username;
    }
    
    public void setUsername(String username) {
        this.username = username;
    }
    
    public String getPassword() {
        return password;
    }
    
    public void setPassword(String password) {
        this.password = password;
    }
    
    public Timestamp getRegdate() {
        return regdate;
    }
    
    public void setRegdate(Timestamp regdate) {
        this.regdate = regdate;
    }
    

    }</pre>

    三.threadLocal提取公用參數

    先說如果不提取公共參數,比如pagesize,pageindex,那么我們的查詢方法應該是這樣子:

       public void GetUsers(String name,int pagesize,int pageIndex)

    如果以后再增加參數,無疑這里的參數會變的很多,所以我們利用threadLocal把pagesize和pageindex提取出來.

    先寫這個類

    public class SystemContext {
        //頁大小
        private static ThreadLocal<Integer> pageSize = new ThreadLocal<>();
        //當前頁
        private static ThreadLocal<Integer> pageIndex = new ThreadLocal<>();

    public static Integer getPageSize() {
        return pageSize.get();
    }
    public static void removePageSize(){
        pageSize.remove();
    }
    public static void setPageSize(int _pageSize) {
        pageSize.set(_pageSize);
    }
    
    public Integer getPageIndex() {
        return pageIndex.get();
    }
    
    public void setPageIndex(int _pageIndex) {
        pageIndex.set(_pageIndex);
    }
    public static void removePageIndex(){
        pageIndex.remove();
    }
    

    }</pre>

    對于threadLocal,這個變量會在線程中一直存在,那么我們就可以在向服務器發送請求的時候添加參數,服務器返回數據的時候移除參數,一來一回的話,自然而然可以用過濾器
    那么過濾器如下:

    import com.dao.SystemContext;

    import javax.servlet.*; import java.io.IOException;

    public class SystemFilter implements Filter{ int pageSize; int pageIndex = 1; @Override public void init(FilterConfig filterConfig) throws ServletException { try { pageSize = Integer.parseInt(filterConfig.getInitParameter("pagesize")); } catch (NumberFormatException e) { pageSize = 15; } }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    
        try {
            pageIndex = Integer.parseInt(servletRequest.getParameter("pageindex"));
        }catch (NumberFormatException e){
            //什么也不做,pageindex=1
        }
        try {
            //開始請求的時候配置參數
            SystemContext.setPageSize(pageSize);
            SystemContext.setPageIndex(pageIndex);
            filterChain.doFilter(servletRequest,servletResponse);
        }finally {
            //請求返回的時候移除參數
            SystemContext.removePageIndex();
            SystemContext.removePageSize();
        }
    
    
    }
    
    @Override
    public void destroy() {
    
    }
    

    }</pre>

    用了過濾器,自然要在web.xml中配置過濾器

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee 
    
    
    <filter>
        <filter-name>SystemFilter</filter-name>
        <filter-class>com.filter.SystemFilter</filter-class>
        <!--配置沒頁大小-->
        <init-param>
            <param-name>pagesize</param-name>
            <param-value>15</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>SystemFilter</filter-name>
        <!--這里配置需要分頁的頁面-->
        <url-pattern>/index.jsp</url-pattern>
    
    </filter-mapping>
    

    </web-app></pre>

    這樣的好處不言而喻,結構清晰,修改方便.接下來是分頁代碼

    四.分頁代碼

    分頁代碼應該寫一個接口和實現類的,這里演示項目就寫在了一起

    import com.util.Pager;
    import com.util.User;

    import java.sql.*; import java.util.ArrayList; import java.util.List;

    public class UserDAO {

    private Connection conn = null;
    private ResultSet rs = null;
    private PreparedStatement ps = null;
    
    

    // public static void main(String[] args) { // UserDAO dao = new UserDAO(); // dao.GetUsers("",15,1); // dao.close(); // }

    public UserDAO() {
        String driverName = "com.mysql.jdbc.Driver";
        String url = "jdbc:mysql://localhost:3306/fenyedemo";
        String user = "root";String password = "123456";
        try {
            Class.forName(driverName);
            conn = DriverManager.getConnection(url,user,password);
        } catch (ClassNotFoundException e) {
            System.out.println("沒有發現驅動");
            e.printStackTrace();
        } catch (SQLException e) {
            System.out.println("獲取連接失敗");
            e.printStackTrace();
        }
    }
    /** * 具體分頁實現代碼 * @param name 查詢條件 * @return */
    public Pager GetUsers(String name){
        //獲取分頁參數
        int pagesize = SystemContext.getPageSize();
        int pageIndex = SystemContext.getPageIndex();
        //分頁具體sql語句
        String sql = "select * from user ";
        String sqlCount = "select count(*) from user ";
        if (name!=null && !name.trim().equals("")){
            sql += "where username LIKE %"+name+"%";
            sqlCount += "where username LIKE %"+name+"%";
        }
        sql += " LIMIT ?,?";
        //存放當前頁的集合
        List<User> datas = new ArrayList<>();
        //存放當前分頁的集合
        Pager<User> pages = new Pager<>();
        User userTemp = null;
        try {
            ps = conn.prepareStatement(sql);
            if(pageIndex<=0) pageIndex=1;
            //設置參數
            ps.setInt(1,(pageIndex-1)*pagesize);
            ps.setInt(2,pagesize);
            rs = ps.executeQuery();
            //循環取出,添加到datas中
            while (rs.next()){
                userTemp = new User();
                userTemp.setUserId(rs.getString("id"));
                userTemp.setUsername(rs.getString("username"));
                userTemp.setPassword(rs.getString("password"));
                userTemp.setRegdate(rs.getTimestamp("regdate"));
                datas.add(userTemp);
            }
            //最后設置pages
            pages.setPageIndex(pageIndex);
            pages.setPageSize(pagesize);
            ps = conn.prepareStatement(sqlCount);
            rs = ps.executeQuery();
            while(rs.next()){
                pages.setTotalRecords(rs.getInt(1));
                pages.setTotalPages((rs.getInt(1)-1)/pagesize+1);
            }
            pages.setDatas(datas);
        } catch (SQLException e) {
            System.out.println("獲取出錯");
            e.printStackTrace();
        }
    
        return pages;
    
    }
    
    
    public void close(){
         try {
             if (rs!=null) rs.close(); rs = null;
             if (ps!=null) ps.close(); ps = null;
             if (conn!=null) conn.close(); conn = null;
        } catch (SQLException e) {
             System.out.println("關閉失敗");
            e.printStackTrace();
        }
    }
    

    }</pre>

    五.jsp測試頁面

    普通頁面就是顯示數據,這個很簡單,代碼如下

    <%@ page import="com.dao.UserDAO" %>
    <%@ page import="com.util.Pager" %>
    <%@ page import="com.util.User" %>
    <%@ page import="java.util.Iterator" %>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <% String condition = request.getParameter("condition"); UserDAO userDAO = new UserDAO(); Pager<User> pages = null; if (condition!=null && !condition.trim().equals("")){ pages = userDAO.GetUsers(condition); }else { pages = userDAO.GetUsers(null); } userDAO.close(); %>
    <html>
    <head>
        <title>測試用例</title>
    </head>
    <body>
    <h1 align="center">分頁測試</h1>
    <table align="center" border="1" width="700">
        <tr>
            <td colspan="100%">
                <form method="get" action="index.jsp">
                    <input type="text" name="condition">
                    <input type="submit" value="查詢">
                </form>
            </td>
        </tr>
        <tr>
            <th>ID</th>
            <th>USERNAME</th>
            <th>PASSWORD</th>
            <th>DATA</th>
        </tr>
        <% for (Iterator it = pages.getDatas().iterator(); it.hasNext() ; ) { User userTemp = (User) it.next(); %>
        <tr>
            <td><%=userTemp.getUserId()%></td>
            <td><%=userTemp.getUsername()%></td>
            <td><%=userTemp.getPassword()%></td>
            <td><%=userTemp.getRegdate()%></td>
        </tr>
        <% }%>
    </table>
    </body>
    </html>

    此時已經有一些效果了
    這里寫圖片描述

    六.JSP頁面添加控制選項

    添加控制選項這里使用分頁框架pager-taglib,也是為了更好的支持通用性.
    首先在index.jsp頁面查詢之后靜態引入一個新的頁面,作為底部控制頁面

    使用方法,就是去下載相應的jar,然后引入到項目的lib中即可
    這里寫圖片描述

     <tr><td colspan="100%">
            <jsp:include page="fenye.jsp">
                <jsp:param name="items" value="<%=pages.getTotalRecords()%>"/>
                <jsp:param name="maxPageItems" value="<%=pages.getPageSize()%>"/>
                <jsp:param name="maxIndexPages" value="10"/>
                <jsp:param name="params" value="condition"/>
            </jsp:include>
        </td></tr>

    下面開始寫fenye.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8" %>
    <% int items = Integer.parseInt(request.getParameter("items")); int maxPageItems = Integer.parseInt(request.getParameter("maxPageItems")); int maxIndexPages = Integer.parseInt(request.getParameter("maxIndexPages")); String params = request.getParameter("params"); %>
    <%--引入分頁框架--%>
    <%@taglib prefix="pg" uri="
    
    
    </pg:pages>
    <pg:next>
        <a href="<%=pageUrl %>">下一頁</a>
    </pg:next>
    <pg:last>
        <a href="<%=pageUrl %>">尾頁</a>
    </pg:last>
    

    </pg:pager></pre>

    分頁設計基本就是上面框架,重點是參數傳遞,這里參數傳遞利用靜態引入的時候,配置jsp:param,然后到fenye,jsp中再取出.
    其中pager-taglib中有一個標簽是”/>,這個就是針對我的查詢條件傳遞過來的參數,如果沒傳遞,那么查詢的話點擊下一頁也會出錯,這里還有一個問題就是編碼問題,pager-taglib默認編碼是GB2312,你可以重新打包文件編譯,也可以在tomcat的server.xml文件中配置urlEncording=”utf-8”,這樣就會沒問題了.
    這里寫圖片描述

    七.總結

    這樣的一個框架,如果其他需要實現分頁的就可以直接套用了,建立相應的實體類,寫好分頁代碼,直接套用Systemcontex.java和SystemFilter.java(記得在web.xml配置相應的過濾文件),再jsp中可以直接使用fenye.jsp,這樣就會省下很多麻煩

    </div>

     本文由用戶 SimaDouglas 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
     轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
     本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!