亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JSP > 正文

JSP通用分頁框架

2024-09-05 00:22:27
字體:
來源:轉載
供稿:網友

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

一.分頁類

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

總頁數 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通用分頁框架

六.JSP頁面添加控制選項

添加控制選項這里使用分頁框架pager-taglib,也是為了更好的支持通用性. 

首先在index.jsp頁面查詢之后靜態引入一個新的頁面,作為底部控制頁面

使用方法,就是去下載相應的jar,然后引入到項目的lib中即可

JSP通用分頁框架

<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”,這樣就會沒問題了.

JSP通用分頁框架

七.總結

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


注:相關教程知識閱讀請移步到JSP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品∨欧美精品v日韩精品| 欧美巨乳美女视频| 97视频免费在线观看| 超在线视频97| 久久精品精品电影网| 亚洲精品国产综合久久| 欧洲日本亚洲国产区| 国产精品久久久久久久久久三级| 久久久久久久97| 国产精品com| 国产精品成人免费视频| 国产精品∨欧美精品v日韩精品| 欧美激情在线播放| 在线精品播放av| 亚洲mm色国产网站| 国产成人福利视频| 欧美重口另类videos人妖| 成人福利在线视频| 免费不卡在线观看av| 久久久久久久av| 成人亚洲综合色就1024| 成年人精品视频| 一区三区二区视频| 在线电影欧美日韩一区二区私密| 亚洲老头同性xxxxx| 78m国产成人精品视频| 日韩有码视频在线| 国产精品视频精品视频| 欧美日韩国产激情| 欧美wwwxxxx| 欧美视频在线观看 亚洲欧| 午夜剧场成人观在线视频免费观看| 91地址最新发布| 性亚洲最疯狂xxxx高清| 国产成人免费av| 日日噜噜噜夜夜爽亚洲精品| 久久亚洲国产精品| 中文字幕欧美精品日韩中文字幕| 日韩免费电影在线观看| 最近2019中文免费高清视频观看www99| 国产有码一区二区| 91国内精品久久| 亚洲欧美色婷婷| 亚洲乱亚洲乱妇无码| 欧美激情视频免费观看| 亚洲天堂一区二区三区| 久久久久久久久电影| 亚洲国产精久久久久久久| 欧洲成人午夜免费大片| 97精品一区二区三区| 91色视频在线观看| 成人黄色av免费在线观看| 日韩av色综合| 亚洲国产毛片完整版| 国产欧美日韩中文字幕在线| 国产色婷婷国产综合在线理论片a| 国产精品人成电影| 欧美精品aaa| 91影院在线免费观看视频| 成人激情黄色网| 欧美国产日韩一区二区在线观看| 欧美日韩国产在线播放| 成人免费视频97| 国内精品久久久久久| 国产精品久久精品| 国产日韩精品一区二区| 久久影院在线观看| 欧美成人黑人xx视频免费观看| 久久午夜a级毛片| 日本中文字幕成人| 国产精品成人av性教育| 尤物九九久久国产精品的分类| 亚洲白拍色综合图区| 69**夜色精品国产69乱| 日韩欧美精品在线观看| 一区二区三区四区在线观看视频| 国产精品pans私拍| 国产精品v日韩精品| 欧美亚洲国产另类| 欧美性精品220| 国产精品一区专区欧美日韩| 不卡伊人av在线播放| 国内精品久久久久久中文字幕| 98精品国产高清在线xxxx天堂| 亚洲精品美女在线观看| 久久久精品久久| 亚洲激情在线观看视频免费| 精品人伦一区二区三区蜜桃网站| 色婷婷av一区二区三区在线观看| 国产精品网址在线| 91在线高清视频| 全球成人中文在线| 亚洲aa在线观看| 成人av电影天堂| 亚洲美女动态图120秒| 欧美精品一区二区免费| 成人国产精品久久久久久亚洲| 性金发美女69hd大尺寸| 精品欧美aⅴ在线网站| 欧美成人在线网站| 不卡av电影院| 最近日韩中文字幕中文| 亚洲另类激情图| 国产精品免费电影| 亚洲一区二区久久久久久久| 欧美大秀在线观看| 久久久视频在线| 欧洲美女7788成人免费视频| 亚洲综合大片69999| 亚洲免费电影在线观看| 亚洲精品动漫久久久久| 成人疯狂猛交xxx| 91在线无精精品一区二区| 亚洲精品久久久久中文字幕欢迎你| 国产精品免费久久久久久| 国产精品久久久久久久午夜| x99av成人免费| 欧美激情亚洲视频| 午夜免费久久久久| 伦伦影院午夜日韩欧美限制| 久久久久久久国产| 色av中文字幕一区| 成人在线精品视频| 亚洲欧洲日产国码av系列天堂| 亚洲欧洲高清在线| 久久久亚洲天堂| 亚洲男女自偷自拍图片另类| 国产亚洲欧美日韩美女| 国产精品成人免费视频| 1769国内精品视频在线播放| 66m—66摸成人免费视频| 精品久久中文字幕久久av| 国产有码在线一区二区视频| 成人黄色av免费在线观看| 欧美性猛交xxxx免费看| 亚洲精品免费一区二区三区| 亚洲最新在线视频| 国产在线观看精品一区二区三区| 久久精品男人天堂| 国产精品久久久久久久久借妻| 亚洲一区二区三区久久| 精品自拍视频在线观看| 日韩电视剧免费观看网站| 日韩小视频在线观看| 色无极亚洲影院| 国产69久久精品成人| 欧美性xxxxx极品| 日本在线观看天堂男亚洲| 国产99视频精品免视看7| 亚洲九九九在线观看| 中文字幕免费精品一区高清| 国模精品一区二区三区色天香| 欧美激情中文字幕乱码免费| 日韩中文字幕在线视频| 国产精品免费视频久久久| 亚洲日本成人网| 最近2019中文字幕mv免费看| 欧美性20hd另类| 国产97免费视| 久久久精品国产亚洲| 亚洲天堂av图片| 亚洲免费高清视频| 国产精品视频白浆免费视频| 91日本在线视频|