JSP通用分頁(yè)框架
寫一個(gè)通用的分頁(yè)框架,這樣在項(xiàng)目里面如果想實(shí)現(xiàn)分頁(yè)功能,只需要稍加改動(dòng)參數(shù)就可以實(shí)現(xiàn)分頁(yè)處理了。這樣寫了會(huì)節(jié)省很多時(shí)間。
一.分頁(yè)類
既然要分頁(yè)那么我們就要考慮建一個(gè)通用的分頁(yè)類,里面需要的參數(shù)一般有:
總頁(yè)數(shù) totalPage
總共記錄數(shù) totalRecord
每頁(yè)顯示數(shù) pageSize
當(dāng)前頁(yè)pageIndex
承載當(dāng)前頁(yè)數(shù)據(jù)的集合 List datas
完整代碼:Page.java
import java.util.List; public class Pager<E> { /** * 總共頁(yè)數(shù) */ private int totalPages; /** * 總共記錄數(shù) */ private int totalRecords; /** * 每頁(yè)顯示數(shù)量 */ private int pageSize; /** * 當(dāng)前頁(yè) */ private int pageIndex; /** * 當(dāng)前頁(yè)數(shù)據(jù)集合 */ 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; } }
二.用戶類
這里以查詢用戶來(lái)做分頁(yè)為例,所以就需要一個(gè)用戶類
用戶號(hào) userId
用戶姓名 username
用戶密碼 password
注冊(cè)時(shí)間 regdate
完整代碼
import java.sql.Timestamp; public class User { private int userId;//用戶id private String username;//用戶名 private String password;//密碼 private Timestamp regdate;//注冊(cè)時(shí)間 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提取公用參數(shù)
先說(shuō)如果不提取公共參數(shù),比如pagesize,pageindex,那么我們的查詢方法應(yīng)該是這樣子:
public void GetUsers(String name,int pagesize,int pageIndex)
如果以后再增加參數(shù),無(wú)疑這里的參數(shù)會(huì)變的很多,所以我們利用threadLocal把pagesize和pageindex提取出來(lái).
先寫這個(gè)類
public class SystemContext { //頁(yè)大小 private static ThreadLocal<Integer> pageSize = new ThreadLocal<>(); //當(dāng)前頁(yè) 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(); } }
對(duì)于threadLocal,這個(gè)變量會(huì)在線程中一直存在,那么我們就可以在向服務(wù)器發(fā)送請(qǐng)求的時(shí)候添加參數(shù),服務(wù)器返回?cái)?shù)據(jù)的時(shí)候移除參數(shù),一來(lái)一回的話,自然而然可以用過(guò)濾器
那么過(guò)濾器如下:
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 { //開(kāi)始請(qǐng)求的時(shí)候配置參數(shù) SystemContext.setPageSize(pageSize); SystemContext.setPageIndex(pageIndex); filterChain.doFilter(servletRequest,servletResponse); }finally { //請(qǐng)求返回的時(shí)候移除參數(shù) SystemContext.removePageIndex(); SystemContext.removePageSize(); } } @Override public void destroy() { } }
用了過(guò)濾器,自然要在web.xml中配置過(guò)濾器
<?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> <!--配置沒(méi)頁(yè)大小--> <init-param> <param-name>pagesize</param-name> <param-value>15</param-value> </init-param> </filter> <filter-mapping> <filter-name>SystemFilter</filter-name> <!--這里配置需要分頁(yè)的頁(yè)面--> <url-pattern>/index.jsp</url-pattern> </filter-mapping> </web-app>
這樣的好處不言而喻,結(jié)構(gòu)清晰,修改方便.接下來(lái)是分頁(yè)代碼
四.分頁(yè)代碼
分頁(yè)代碼應(yīng)該寫一個(gè)接口和實(shí)現(xiàn)類的,這里演示項(xiàng)目就寫在了一起
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("沒(méi)有發(fā)現(xiàn)驅(qū)動(dòng)"); e.printStackTrace(); } catch (SQLException e) { System.out.println("獲取連接失敗"); e.printStackTrace(); } } /** * 具體分頁(yè)實(shí)現(xiàn)代碼 * @param name 查詢條件 * @return */ public Pager GetUsers(String name){ //獲取分頁(yè)參數(shù) int pagesize = SystemContext.getPageSize(); int pageIndex = SystemContext.getPageIndex(); //分頁(yè)具體sql語(yǔ)句 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 ?,?"; //存放當(dāng)前頁(yè)的集合 List<User> datas = new ArrayList<>(); //存放當(dāng)前分頁(yè)的集合 Pager<User> pages = new Pager<>(); User userTemp = null; try { ps = conn.prepareStatement(sql); if(pageIndex<=0) pageIndex=1; //設(shè)置參數(shù) ps.setInt(1,(pageIndex-1)*pagesize); ps.setInt(2,pagesize); rs = ps.executeQuery(); //循環(huán)取出,添加到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); } //最后設(shè)置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("獲取出錯(cuò)"); 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("關(guān)閉失敗"); e.printStackTrace(); } } }
五.jsp測(cè)試頁(yè)面
普通頁(yè)面就是顯示數(shù)據(jù),這個(gè)很簡(jiǎn)單,代碼如下
<%@ 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>測(cè)試用例</title> </head> <body> <h1 align="center">分頁(yè)測(cè)試</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>
此時(shí)已經(jīng)有一些效果了
六.JSP頁(yè)面添加控制選項(xiàng)
添加控制選項(xiàng)這里使用分頁(yè)框架pager-taglib,也是為了更好的支持通用性.
首先在index.jsp頁(yè)面查詢之后靜態(tài)引入一個(gè)新的頁(yè)面,作為底部控制頁(yè)面
使用方法,就是去下載相應(yīng)的jar,然后引入到項(xiàng)目的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>
下面開(kāi)始寫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"); %> <%--引入分頁(yè)框架--%> <%@taglib prefix="pg" uri="http://jsptags.com/tags/navigation/pager" %> <%--參數(shù)依次是項(xiàng)目總數(shù) 每頁(yè)顯示數(shù)量 下方菜單顯示數(shù) 當(dāng)前頁(yè)curPage--%> <pg:pager items="<%=items%>" maxPageItems="<%=maxPageItems%>" maxIndexPages="<%=maxIndexPages%>" export="curPage=pageNumber"> <pg:param name="<%=params%>"/> <pg:first> <a href="<%=pageUrl%>">首頁(yè)</a> </pg:first> <pg:prev> <a href="<%=pageUrl%>">上一頁(yè)</a> </pg:prev> <pg:pages> <% if(curPage==pageNumber) { %> [<%=pageNumber %>] <% } else { %> <a href="<%=pageUrl%>"><%=pageNumber %></a> <% } %> </pg:pages> <pg:next> <a href="<%=pageUrl %>">下一頁(yè)</a> </pg:next> <pg:last> <a href="<%=pageUrl %>">尾頁(yè)</a> </pg:last> </pg:pager>
分頁(yè)設(shè)計(jì)基本就是上面框架,重點(diǎn)是參數(shù)傳遞,這里參數(shù)傳遞利用靜態(tài)引入的時(shí)候,配置jsp:param,然后到fenye,jsp中再取出.
其中pager-taglib中有一個(gè)標(biāo)簽是”/>,這個(gè)就是針對(duì)我的查詢條件傳遞過(guò)來(lái)的參數(shù),如果沒(méi)傳遞,那么查詢的話點(diǎn)擊下一頁(yè)也會(huì)出錯(cuò),這里還有一個(gè)問(wèn)題就是編碼問(wèn)題,pager-taglib默認(rèn)編碼是GB2312,你可以重新打包文件編譯,也可以在tomcat的server.xml文件中配置urlEncording=”utf-8”,這樣就會(huì)沒(méi)問(wèn)題了.
七.總結(jié)
這樣的一個(gè)框架,如果其他需要實(shí)現(xiàn)分頁(yè)的就可以直接套用了,建立相應(yīng)的實(shí)體類,寫好分頁(yè)代碼,直接套用Systemcontex.java和SystemFilter.java(記得在web.xml配置相應(yīng)的過(guò)濾文件),再jsp中可以直接使用fenye.jsp,這樣就會(huì)省下很多麻煩
- JavaScript實(shí)現(xiàn)列表分頁(yè)功能特效
- js腳本分頁(yè)代碼分享(7種樣式)
- 純javascript實(shí)現(xiàn)分頁(yè)(兩種方法)
- ANGULARJS中使用JQUERY分頁(yè)控件
- JSP+EXt2.0實(shí)現(xiàn)分頁(yè)的方法
- JSP實(shí)現(xiàn)的簡(jiǎn)單分頁(yè)示例
- 使用Jquery+Ajax+Json如何實(shí)現(xiàn)分頁(yè)顯示附JAVA+JQuery實(shí)現(xiàn)異步分頁(yè)
- JSP實(shí)現(xiàn)的簡(jiǎn)單分頁(yè)顯示效果代碼
- jquery+json實(shí)現(xiàn)分頁(yè)效果
- jquery分頁(yè)插件jquery.pagination.js使用方法解析
- jquery分頁(yè)插件jquery.pagination.js實(shí)現(xiàn)無(wú)刷新分頁(yè)
- Angular.js與Bootstrap相結(jié)合實(shí)現(xiàn)表格分頁(yè)代碼
- js實(shí)現(xiàn)ajax分頁(yè)完整實(shí)例
- js多功能分頁(yè)組件layPage使用方法詳解
- 基于Vue.js的表格分頁(yè)組件
- 純JS前端實(shí)現(xiàn)分頁(yè)代碼
相關(guān)文章
jsp 對(duì)request.getSession(false)的理解(附程序員常疏忽的一個(gè)漏洞)
在網(wǎng)上經(jīng)??吹接腥藢?duì)request.getSession(false)提出疑問(wèn),我第一次也很迷惑,看了一下J2EE1.3 API,看一下官網(wǎng)是怎么解釋的。2009-07-07用JSP下載word文件(不會(huì)直接用IE打開(kāi))
用JSP下載word文件(不會(huì)直接用IE打開(kāi))...2006-10-10