主頁(yè) > 知識(shí)庫(kù) > JSP通用分頁(yè)框架

JSP通用分頁(yè)框架

熱門標(biāo)簽:銀行業(yè)務(wù) 電子圍欄 Linux服務(wù)器 阿里云 團(tuán)購(gòu)網(wǎng)站 服務(wù)器配置 Mysql連接數(shù)設(shè)置 科大訊飛語(yǔ)音識(shí)別系統(tǒng)

寫一個(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 PagerE> {
/**
* 總共頁(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 ListE> 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(ListE> 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 ListE> getDatas() {
return datas;
}
}

二.用戶類

這里以查詢用戶來(lái)做分頁(yè)為例,所以就需要一個(gè)用戶類

用戶號(hào) userId

用戶姓名 username

用戶密碼 password

注冊(cè)時(shí)間 regdate

完整代碼

import java.sql.Timest
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 ThreadLocalInteger> pageSize = new ThreadLocal>();
//當(dāng)前頁(yè)
private static ThreadLocalInteger> 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 {
//開始請(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>
!--配置沒頁(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("沒有發(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è)的集合
ListUser> datas = new ArrayList>();
//存放當(dāng)前分頁(yè)的集合
PagerUser> 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();
PagerUser> 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>

下面開始寫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ù),如果沒傳遞,那么查詢的話點(diǎn)擊下一頁(yè)也會(huì)出錯(cuò),這里還有一個(gè)問題就是編碼問題,pager-taglib默認(rèn)編碼是GB2312,你可以重新打包文件編譯,也可以在tomcat的server.xml文件中配置urlEncording=”utf-8”,這樣就會(huì)沒問題了.

七.總結(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è)代碼

標(biāo)簽:大理 廣元 衡水 蚌埠 棗莊 衢州 萍鄉(xiāng) 江蘇

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《JSP通用分頁(yè)框架》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266