程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> JSP編程 >> 關於JSP >> JSP通用分頁框架

JSP通用分頁框架

編輯:關於JSP

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

一.分頁類

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

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

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

用了過濾器,自然要在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);
}
//最後設置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();
}
}
}

五.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,這樣就會省下很多麻煩

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved