JSP通用分頁架構_JSP編程

來源:互聯網
上載者:User

寫一個通用的分頁架構,這樣在項目裡面如果想實現分頁功能,只需要稍加改動參數就可以實現分頁處理了。這樣寫了會節省很多時間。

一.分頁類

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

總頁數 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;}}

二.使用者類

這裡以查詢使用者來做分頁為例,所以就需要一個使用者類

使用者號 userId

使用者姓名 username

使用者密碼 password

註冊時間 regdate

完整代碼

import java.sql.Timestamp;public class User {private int userId;//使用者idprivate 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;}}

三.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();}}

對於threadLocal,這個變數會線上程中一直存在,那麼我們就可以在向伺服器發送請求的時候添加參數,伺服器返回資料的時候移除參數,一來一回的話,自然而然可以用過濾器

那麼過濾器如下:

import com.dao.SystemContext;import javax.servlet.*;import java.io.IOException;public class SystemFilter implements Filter{int pageSize;int pageIndex = 1;@Overridepublic void init(FilterConfig filterConfig) throws ServletException {try {pageSize = Integer.parseInt(filterConfig.getInitParameter("pagesize"));} catch (NumberFormatException e) {pageSize = 15;}}@Overridepublic 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();}}@Overridepublic void destroy() {}}

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

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"version="3.1"><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>

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

四.分頁代碼

分頁代碼應該寫一個介面和實作類別的,這裡示範項目就寫在了一起

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);}//最後設定pagespages.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();}}}

五.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="http://jsptags.com/tags/navigation/pager" %><%--參數依次是項目總數 每頁顯示數量 下方菜單顯示數 當前頁curPage--%><pg:pager items="<%=items%>" maxPageItems="<%=maxPageItems%>" maxIndexPages="<%=maxIndexPages%>" export="curPage=pageNumber"><pg:param name="<%=params%>"/><pg:first><a href="<%=pageUrl%>">首頁</a></pg:first><pg:prev><a href="<%=pageUrl%>">上一頁</a></pg:prev><pg:pages><%if(curPage==pageNumber) {%>[<%=pageNumber %>]<%} else {%><a href="<%=pageUrl%>"><%=pageNumber %></a><%}%></pg:pages><pg:next><a href="<%=pageUrl %>">下一頁</a></pg:next><pg:last><a href="<%=pageUrl %>">尾頁</a></pg:last></pg:pager>

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

七.總結

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.