程序判斷 如果大於10 就顯示10頁 如果小於10 就顯示實際頁碼,
...分頁自有一套演算法,主要變數就是分頁單位 跟當前頁面
『貳』 JSP 簡單的分頁 如:首頁 第一頁 1 2 3 4 5 6 上一頁 首頁 顯示第7頁的時候第一頁隱藏這樣的效果!
寫一個公共的pageView.jsp,裡面顯示,做判斷。
<!-- 分頁信息 -->
<c:if test="${page.totalPage gt 1}">
<div align="right" style="margin: 0" class="pageview">
<div class="pages_numlnk" style="font-family: tahoma;">
<!-- 顯示頁碼 -->
<c:forEach begin="${page.pageIndex.startPage }" end="${page.pageIndex.endPage}" var="i">
<c:if test="${i eq page.currentPage}">
<b>${i }</b>
</c:if>
<c:if test="${i ne page.currentPage}">
<a href="#" onclick="gotoPage0('${i }');return false;">${i }</a>
</c:if>
</c:forEach>
<!-- 總頁碼 -->
<span style="color: rgb(255, 69, 0);"> 共<b>${page.totalPage }</b>頁 共<b>${page.totalItems }</b>條記錄 </span>
<c:if test="${page.currentPage gt 1 }">
<a href="#" onclick="gotoPage0(1);return false;">[首頁]</a>
<a href="#" onclick="gotoPage0(${page.currentPage - 1 });return false;">[上一頁]</a>
</c:if>
<c:if test="${page.currentPage lt page.totalPage}">
<a href="#" onclick="gotoPage0(${page.currentPage + 1 });return false;">[下一頁]</a>
<a href="#" onclick="gotoPage0(${page.totalPage });return false;">[尾頁]</a>
</c:if>
<!-- 跳轉到指定頁碼 -->
<input id="toPageNum" type="text" size="4" style="font: 10px; height: 15px" />
<img onclick="gotoPage0(document.getElementById('toPageNum').value)" align="absMiddle"
src="${baseUrl }/images/button_go.gif">
</div>
<script type="text/javascript">
function gotoPage0(pageNum){
if(isNaN(pageNum)){
alert("請輸入正確的頁碼");
document.getElementById('toPageNum').focus();
return false;
}
if(pageNum < 1){
pageNum = 1;
}
if(pageNum > ${page.totalPage}){
pageNum = ${page.totalPage};
}
if(typeof(gotoPage) == "undefined"){
alert("請提供gotoPage()方法");
return false;
}
gotoPage(pageNum);
}
</script>
</div>
</c:if>
『叄』 JSP頁面分頁怎麼做
分頁須知知識點:
(1)JDBC2.0的可滾動結果集。
(2)HTTP GET請求。
一、可滾動結果集
Connection con = DriverManager.getConnection();
PreparedStatement stmt = con.prepareStatement(sql,ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stmt.executeQuery();
常用方法:
(1)rs.absolute(n); 可以將指針跳到第n行。
(2)rs.relative(n); 可以將指針相對向下或向上n行。
(3)rs.first();
(4)rs.last();
(5)int curRow = rs.getRow(); 指針指向的當前行
二、功能實現分解
1.計算結果的個數
rs.last();
int size = rs.getRow();
即可得到結果的個數。
2.得到需要分幾頁
如果一頁能夠放5條記錄,則
int pageCount = (size%5==0)?(size/5):(size/5+1);
即可獲得需要分幾頁。
3.控制一頁中規定顯示記錄個數
如果一頁能顯示5條記錄,可以通過使用count進行計數。
int count = 0;
do{
if(count>=5) break;
.....
count++;
}while(rs.next());
通過break語句,能夠使其顯示到超過規定條目就跳出。
4.如何知道當前是第幾頁
通過HTTP get的特點,在地址欄中標明當前地址,如http://.......?curPage=1 表示現在是第一頁。
String tmp = request.getParameter("curPage");
if(tmp==null){
tmp="1";
}
curPage = Integer.parseInt(tmp);
可以獲得當前頁。
注意:
rs.absolute(1);表示指向第一條記錄;
不存在rs.absolute(0);
rs.absolute((curPage-1)*PAGESIZE+1); 把結果集指針調整到當前頁應該顯示的記錄的開始.
比如如果一頁顯示5條記錄,當前頁是第二頁,則需要把指針調整到6,當前頁是第三頁,則需要把指針調整為11.
5.點擊首頁、上一頁、下一頁、尾頁的行為
<a href="multipage.jsp?curPage=<%curPage+1%>" >下一頁</a>
<a href="multipage.jsp?curPage=<%curPage-1%>" >上一頁</a>
<a href="multipage.jsp?curPage=<%pageCount%>" >尾頁</a>
<a href="multipage.jsp?curPage=1" >首頁</a>
6.為了保存當前頁位置,則需要把當前頁位置設為全局變數。
<%@ page contentType="text/html" pageEncoding="GB2312" language="java"%>
<%@ page import="java.sql.*"%>
<html>
<head>
<title>hello</title>
</head>
<body>
<table border="1" spacing="2">
<%!
public static final String DRIVER = "com.mysql.jdbc.Driver";
public static final String USER = "root";
public static final String PASS = "12345";
public static final String URL = "jdbc:mysql://localhost:3306/MLDN";
public static final int PAGESIZE = 5;
int pageCount;
int curPage = 1;
%>
<%
//一頁放5個
String user = null;
String pass = null;
try{
Class.forName(DRIVER);
Connection con = DriverManager.getConnection(URL,USER,PASS);
String sql = "SELECT empno,ename,job,hiredate,sal,comm FROM emp";
PreparedStatement stat = con.prepareStatement(sql,ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stat.executeQuery();
rs.last();
int size = rs.getRow();
pageCount = (size%PAGESIZE==0)?(size/PAGESIZE):(size/PAGESIZE+1);
String tmp = request.getParameter("curPage");
if(tmp==null){
tmp="1";
}
curPage = Integer.parseInt(tmp);
if(curPage>=pageCount) curPage = pageCount;
boolean flag = rs.absolute((curPage-1)*PAGESIZE+1);
out.println(curPage);
int count = 0;
do{
if(count>=PAGESIZE)break;
int empno = rs.getInt(1);
String ename = rs.getString(2);
String job = rs.getString(3);
Date hiredate = rs.getDate(4);
float sal = rs.getFloat(5);
int comm = rs.getInt(6);
count++;
%>
<tr>
<td><%=empno%></td>
<td><%=ename%></td>
<td><%=job%></td>
<td><%=hiredate%></td>
<td><%=sal%></td>
<td><%=comm%></td>
</tr>
<%
}while(rs.next());
con.close();
}
catch(Exception e){
}
%>
</table>
<a href = "multipage.jsp?curPage=1" >首頁</a>
<a href = "multipage.jsp?curPage=<%=curPage-1%>" >上一頁</a>
<a href = "multipage.jsp?curPage=<%=curPage+1%>" >下一頁</a>
<a href = "multipage.jsp?curPage=<%=pageCount%>" >尾頁</a>
第<%=curPage%>頁/共<%=pageCount%>頁
</body>
</html>
『肆』 在JSP頁面中實現分頁顯示和翻頁功能,需要來回傳遞哪幾個參數
頁面分頁通常有兩種展現形式:
查詢出全部結果數據,以集合等形式保存在內存中,每次在內存中讀取一頁的數據顯示。該方法首次載入數據量較大,耗時會很久,而且可能展現出的數據可能包含被修改或刪除過的過期或垃圾數據,存儲數據也會消耗大量的內存,但首次載入後,分頁展現會非常迅速,效果較好。
每次切頁時從資料庫中檢索當前頁所需展現數據,每次查詢數較少,總體開銷也就減少了,再進行SQL優化,也能達到較高的效率,而且實時檢索不易出現數據錯誤的問題。
使用分頁功能,最關鍵的參數如下:
請求參數:
1)當前需要展示的頁碼,變數,默認從第一頁開始,可能是頁面上的上下頁,通過當前頁碼±1來計算出來,也可能是頁面有頁碼頁表用戶通過點擊相應數字或是輸入框用戶手輸入的頁碼;
2)每頁顯示的數量,通常是變數,可以從頁碼提供相應的下拉框供用戶選擇。若是定義為常量,那就不需要每次傳遞了;
3)總數量,根據篩選條件決定,若是篩選條件固定,則只需將此定義為常量,不必作為參數傳輸,否則則需要根據篩選條件每次查詢資料庫獲取計數。
返回參數:
返回需要展示的列表及以上請求參數,通常列表通過Ajax計數實現,那也就不需要返回請求參數了。所展示的列表通常會使用集合類型進行封裝或是數據讀取成json格式由前台進行解析。
『伍』 jsp分頁設定顯示的頁碼數
這樣很簡單,但你想什麼時候顯示第10頁後面的呢?
for (int i = 1; i <= (pageCount<10?pageCount:10); i++) {
out.println("<a href=usersHandle?flag=fenye&pageNow=" + i+ ">[" + i + "]</a>");}
如果每次點擊有取頁內碼參數容.比如pageNow.
for (int i = pageNow; i <= (pageCount<(pageNow+9)?pageCount:(pageNow+9)); i++) {
out.println("<a href=usersHandle?flag=fenye&pageNow=" + i+ ">[" + i + "]</a>");}
『陸』 javabean servlet jsp c標簽。怎麼實現分頁行顏色設定。
如果你要所有行顏色你就在table或者每行里邊設定顏色,如果你想奇數偶數行不同就用C:if判斷一下奇數一種顏色偶數一種顏色
『柒』 在JSP中如何實現分頁技術啊
title: JSP分頁技術實現
summary:使用工具類實現通用分頁處理
author: evan_zhao
email: [email protected]
目前比較廣泛使用的分頁方式是將查詢結果緩存在HttpSession或有狀態bean中,翻頁的時候從緩存中取出一頁數據顯示。這種方法有兩個主要的缺點:一是用戶可能看到的是過期數據;二是如果數據量非常大時第一次查詢遍歷結果集會耗費很長時間,並且緩存的數據也會佔用大量內存,效率明顯下降。
其它常見的方法還有每次翻頁都查詢一次資料庫,從ResultSet中只取出一頁數據(使用rs.last();rs.getRow()獲得總計錄條數,使用rs.absolute()定位到本頁起始記錄)。這種方式在某些資料庫(如oracle)的JDBC實現中差不多也是需要遍歷所有記錄,實驗證明在記錄數很大時速度非常慢。
至於緩存結果集ResultSet的方法則完全是一種錯誤的做法。因為ResultSet在Statement或Connection關閉時也會被關閉,如果要使ResultSet有效勢必長時間佔用資料庫連接。
因此比較好的分頁做法應該是每次翻頁的時候只從資料庫里檢索頁面大小的塊區的數據。這樣雖然每次翻頁都需要查詢資料庫,但查詢出的記錄數很少,網路傳輸數據量不大,如果使用連接池更可以略過最耗時的建立資料庫連接過程。而在資料庫端有各種成熟的優化技術用於提高查詢速度,比在應用伺服器層做緩存有效多了。
在oracle資料庫中查詢結果的行號使用偽列ROWNUM表示(從1開始)。例如select * from employee where rownum<10 返回前10條記錄。但因為rownum是在查詢之後排序之前賦值的,所以查詢employee按birthday排序的第100到120條記錄應該這么寫:
[pre] select * from (
select my_table.*, rownum as my_rownum from (
select name, birthday from employee order by birthday
) my_table where rownum <120
) where my_rownum>=100
[/pre]
mySQL可以使用LIMIT子句:
select name, birthday from employee order by birthday LIMIT 99,20
DB2有rownumber()函數用於獲取當前行數。
SQL Server沒研究過,可以參考這篇文章:http://www.csdn.net/develop/article/18/18627.shtm
在Web程序中分頁會被頻繁使用,但分頁的實現細節卻是編程過程中比較麻煩的事情。大多分頁顯示的查詢操作都同時需要處理復雜的多重查詢條件,sql語句需要動態拼接組成,再加上分頁需要的記錄定位、總記錄條數查詢以及查詢結果的遍歷、封裝和顯示,程序會變得很復雜並且難以理解。因此需要一些工具類簡化分頁代碼,使程序員專注於業務邏輯部分。下面是我設計的兩個工具類:
PagedStatement 封裝了資料庫連接、總記錄數查詢、分頁查詢、結果數據封裝和關閉資料庫連接等操作,並使用了PreparedStatement支持動態設置參數。
RowSetPage 參考PetStore的page by page iterator模式, 設計RowSetPage用於封裝查詢結果(使用OracleCachedRowSet緩存查詢出的一頁數據,關於使用CachedRowSet封裝資料庫查詢結果請參考JSP頁面查詢顯示常用模式)以及當前頁碼、總記錄條數、當前記錄數等信息, 並且可以生成簡單的HTML分頁代碼。
PagedStatement 查詢的結果封裝成RowsetPage。
下面是簡單的使用示例:
//DAO查詢數據部分代碼:
…
public RowSetPage getEmployee(String gender, int pageNo) throws Exception{
String sql="select emp_id, emp_code, user_name, real_name from employee where gender =?";
//使用Oracle資料庫的分頁查詢實現,每頁顯示5條
PagedStatement pst =new PagedStatementOracleImpl(sql, pageNo, 5);
pst.setString(1, gender);
return pst.executeQuery();
}
//Servlet處理查詢請求部分代碼:
…
int pageNo;
try{
//可以通過參數pageno獲得用戶選擇的頁碼
pageNo = Integer.parseInt(request.getParameter("pageno") );
}catch(Exception ex){
//默認為第一頁
pageNo=1;
}
String gender = request.getParameter("gender" );
request.setAttribute("empPage", myBean.getEmployee(gender, pageNo) );
…
//JSP顯示部分代碼
<%@ page import = "page.RowSetPage"%>
…
<script language="javascript">
function doQuery(){
form1.actionType.value="doQuery";
form1.submit();
}
</script>
…
<form name=form1 method=get>
<input type=hidden name=actionType>
性別:
<input type=text name=gender size=1 value="<%=request.getParameter("gender")%>">
<input type=button value=" 查詢 " onclick="doQuery()">
<%
RowSetPage empPage = (RowSetPage)request.getAttribute("empPage");
if (empPage == null ) empPage = RowSetPage.EMPTY_PAGE;
%>
…
<table cellspacing="0" width="90%">
<tr> <td>ID</td> <td>代碼</td> <td>用戶名</td> <td>姓名</td> </tr>
<%
javax.sql.RowSet empRS = (javax.sql.RowSet) empPage.getRowSet();
if (empRS!=null) while (empRS.next() ) {
%>
<tr>
<td><%= empRS.getString("EMP_ID")%></td>
<td><%= empRS.getString("EMP_CODE")%></td>
<td><%= empRS.getString("USER_NAME")%></td>
<td><%= empRS.getString("REAL_NAME")%></td>
</tr>
<%
}// end while
%>
<tr>
<%
//顯示總頁數和當前頁數(pageno)以及分頁代碼。
//此處doQuery為頁面上提交查詢動作的javascript函數名, pageno為標識當前頁碼的參數名
%>
<td colspan=4><%= empPage .getHTML("doQuery", "pageno")%></td>
</tr>
</table>
</form>
效果如圖:
因為分頁顯示一般都會伴有查詢條件和查詢動作,頁面應已經有校驗查詢條件和提交查詢的javascript方法(如上面的doQuery),所以RowSetPage.getHTML()生成的分頁代碼在用戶選擇新頁碼時直接回調前面的處理提交查詢的javascript方法。注意在顯示查詢結果的時候上次的查詢條件也需要保持,如<input type=text name=gender size=1 value="<%=request.getParameter("gender")%>">。同時由於頁碼的參數名可以指定,因此也支持在同一頁面中有多個分頁區。
另一種分頁代碼實現是生成每一頁的URL,將查詢參數和頁碼作為QueryString附在URL後面。這種方法的缺陷是在查詢條件比較復雜時難以處理,並且需要指定處理查詢動作的servlet,可能不適合某些定製的查詢操作。
如果對RowSetPage.getHTML()生成的默認分頁代碼不滿意可以編寫自己的分頁處理代碼,RowSetPage提供了很多getter方法用於獲取相關信息(如當前頁碼、總頁數、 總記錄數和當前記錄數等)。
在實際應用中可以將分頁查詢和顯示做成jsp taglib, 進一步簡化JSP代碼,屏蔽Java Code。
附:分頁工具類的源代碼, 有注釋,應該很容易理解。
1.Page.java
2.RowSetPage.java(RowSetPage繼承Page)
3.PagedStatement.java
4.PagedStatementOracleImpl.java(PagedStatementOracleImpl繼承PagedStatement)
您可以任意使用這些源代碼,但必須保留author [email protected]字樣
///////////////////////////////////
//
// Page.java
// author: [email protected]
//
///////////////////////////////////
package page;
import java.util.List;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
/**
* Title: 分頁對象<br>
* Description: 用於包含數據及分頁信息的對象<br>
* Page類實現了用於顯示分頁信息的基本方法,但未指定所含數據的類型,
* 可根據需要實現以特定方式組織數據的子類,<br>
* 如RowSetPage以RowSet封裝數據,ListPage以List封裝數據<br>
* Copyright: Copyright (c) 2002 <br>
* @author [email protected] <br>
* @version 1.0
*/
public class Page implements java.io.Serializable {
public static final Page EMPTY_PAGE = new Page();
public static final int DEFAULT_PAGE_SIZE = 20;
public static final int MAX_PAGE_SIZE = 9999;
private int myPageSize = DEFAULT_PAGE_SIZE;
private int start;
private int avaCount,totalSize;
private Object data;
private int currentPageno;
private int totalPageCount;
/**
* 默認構造方法,只構造空頁
*/
protected Page(){
this.init(0,0,0,DEFAULT_PAGE_SIZE,new Object());
}
/**
* 分頁數據初始方法,由子類調用
* @param start 本頁數據在資料庫中的起始位置
* @param avaCount 本頁包含的數據條數
* @param totalSize 資料庫中總記錄條數
* @param pageSize 本頁容量
* @param data 本頁包含的數據
*/
protected void init(int start, int avaCount, int totalSize, int pageSize, Object data){
this.avaCount =avaCount;
this.myPageSize = pageSize;
this.start = start;
this.totalSize = totalSize;
this.data=data;
//System.out.println("avaCount:"+avaCount);
//System.out.println("totalSize:"+totalSize);
if (avaCount>totalSize) {
//throw new RuntimeException("記錄條數大於總條數?!");
}
this.currentPageno = (start -1)/pageSize +1;
this.totalPageCount = (totalSize + pageSize -1) / pageSize;
if (totalSize==0 && avaCount==0){
this.currentPageno = 1;
this.totalPageCount = 1;
}
//System.out.println("Start Index to Page No: " + start + "-" + currentPageno);
}
public Object getData(){
return this.data;
}
/**
* 取本頁數據容量(本頁能包含的記錄數)
* @return 本頁能包含的記錄數
*/
public int getPageSize(){
return this.myPageSize;
}
/**
* 是否有下一頁
* @return 是否有下一頁
*/
public boolean hasNextPage() {
/*
if (avaCount==0 && totalSize==0){
return false;
}
return (start + avaCount -1) < totalSize;
*/
return (this.getCurrentPageNo()<this.getTotalPageCount());
}
/**
* 是否有上一頁
* @return 是否有上一頁
*/
public boolean hasPreviousPage() {
/*
return start > 1;
*/
return (this.getCurrentPageNo()>1);
}
/**
* 獲取當前頁第一條數據在資料庫中的位置
* @return
*/
public int getStart(){
return start;
}
/**
* 獲取當前頁最後一條數據在資料庫中的位置
* @return
*/
public int getEnd(){
int end = this.getStart() + this.getSize() -1;
if (end<0) {
end = 0;
}
return end;
}
/**
* 獲取上一頁第一條數據在資料庫中的位置
* @return 記錄對應的rownum
*/
public int getStartOfPreviousPage() {
return Math.max(start-myPageSize, 1);
}
/**
* 獲取下一頁第一條數據在資料庫中的位置
* @return 記錄對應的rownum
*/
public int getStartOfNextPage() {
return start + avaCount;
}
/**
* 獲取任一頁第一條數據在資料庫中的位置,每頁條數使用默認值
* @param pageNo 頁號
* @return 記錄對應的rownum
*/
public static int getStartOfAnyPage(int pageNo){
return getStartOfAnyPage(pageNo, DEFAULT_PAGE_SIZE);
}
/**
* 獲取任一頁第一條數據在資料庫中的位置
* @param pageNo 頁號
* @param pageSize 每頁包含的記錄數
* @return 記錄對應的rownum
*/
public static int getStartOfAnyPage(int pageNo, int pageSize){
int startIndex = (pageNo-1) * pageSize + 1;
if ( startIndex < 1) startIndex = 1;
//System.out.println("Page No to Start Index: " + pageNo + "-" + startIndex);
return startIndex;
}
/**
* 取本頁包含的記錄數
* @return 本頁包含的記錄數
*/
public int getSize() {
return avaCount;
}
/**
* 取資料庫中包含的總記錄數
* @return 資料庫中包含的總記錄數
*/
public int getTotalSize() {
return this.totalSize;
}
/**
* 取當前頁碼
* @return 當前頁碼
*/
public int getCurrentPageNo(){
return this.currentPageno;
}
/**
* 取總頁碼
* @return 總頁碼
*/
public int getTotalPageCount(){
return this.totalPageCount;
}
/**
*
* @param queryJSFunctionName 實現分頁的JS腳本名字,頁碼變動時會自動回調該方法
* @param pageNoParamName 頁碼參數名稱
* @return
*/
public String getHTML(String queryJSFunctionName, String pageNoParamName){
if (getTotalPageCount()<1){
return "<input type='hidden' name='"+pageNoParamName+"' value='1' >";
}
if (queryJSFunctionName == null || queryJSFunctionName.trim().length()<1) {
queryJSFunctionName = "gotoPage";
}
if (pageNoParamName == null || pageNoParamName.trim().length()<1){
pageNoParamName = "pageno";
}
String gotoPage = "_"+queryJSFunctionName;
StringBuffer html = new StringBuffer("\n");
html.append("<script language=\"Javascript1.2\">\n")
.append("function ").append(gotoPage).append("(pageNo){ \n")
.append( " var curPage=1; \n")
.append( " try{ curPage = document.all[\"")
.append(pageNoParamName).append("\"].value; \n")
.append( " document.all[\"").append(pageNoParamName)
.append("\"].value = pageNo; \n")
.append( " ").append(queryJSFunctionName).append("(pageNo); \n")
.append( " return true; \n")
.append( " }catch(e){ \n")
// .append( " try{ \n")
// .append( " document.forms[0].submit(); \n")
// .append( " }catch(e){ \n")
.append( " alert('尚未定義查詢方法:function ")
.append(queryJSFunctionName).append("()'); \n")
.append( " document.all[\"").append(pageNoParamName)
.append("\"].value = curPage; \n")
.append( " return false; \n")
// .append( " } \n")
.append( " } \n")
.append( "}")
.append( "</script> \n")
.append( "");
html.append( "<table border=0 cellspacing=0 cellpadding=0 align=center width=80%> \n")
.append( " <tr> \n")
.append( " <td align=left><br> \n");
html.append( " 共" ).append( getTotalPageCount() ).append( "頁")
.append( " [") .append(getStart()).append("..").append(getEnd())
.append("/").append(this.getTotalSize()).append("] \n")
.append( " </td> \n")
.append( " <td align=right> \n");
if (hasPreviousPage()){
html.append( "[<a href='javascript:").append(gotoPage)
.append("(") .append(getCurrentPageNo()-1)
.append( ")'>上一頁</a>] \n");
}
html.append( " 第")
.append( " <select name='")
.append(pageNoParamName).append("' onChange='javascript:")
.append(gotoPage).append("(this.value)'>\n");
String selected = "selected";
for(int i=1;i<=getTotalPageCount();i++){
if( i == getCurrentPageNo() )
selected = "selected";
else selected = "";
html.append( " <option value='").append(i).append("' ")
.append(selected).append(">").append(i).append("</option> \n");
}
if (getCurrentPageNo()>getTotalPageCount()){
html.append( " <option value='").append(getCurrentPageNo())
.append("' selected>").append(getCurrentPageNo())
.append("</option> \n");
}
html.append( " </select>頁 \n");
if (hasNextPage()){
html.append( " [<a href='javascript:").append(gotoPage)
.append("(").append((getCurrentPageNo()+1))
.append( ")'>下一頁</a>] \n");
}
html.append( "</td></tr></table> \n");
return html.toString();
}
}
///////////////////////////////////
//
// RowSetPage.java
// author: [email protected]
//
///////////////////////////////////
package page;
import javax.sql.RowSet;
/**
* <p>Title: RowSetPage</p>
* <p>Description: 使用RowSet封裝數據的分頁對象</p>
* <p>Copyright: Copyright (c) 2003</p>
* @author [email protected]
* @version 1.0
*/
public class RowSetPage extends Page {
private javax.sql.RowSet rs;
/**
*空頁
*/
public static final RowSetPage EMPTY_PAGE = new RowSetPage();
/**
*默認構造方法,創建空頁
*/
public RowSetPage(){
this(null, 0,0);
}
/**
*構造分頁對象
*@param crs 包含一頁數據的OracleCachedRowSet
*@param start 該頁數據在資料庫中的起始位置
*@param totalSize 資料庫中包含的記錄總數
*/
public RowSetPage(RowSet crs, int start, int totalSize) {
this(crs,start,totalSize,Page.DEFAULT_PAGE_SIZE);
}
/**
*構造分頁對象
*@param crs 包含一頁數據的OracleCachedRowSet
*@param start 該頁數據在資料庫中的起始位置
*@param totalSize 資料庫中包含的記錄總數
*@pageSize 本頁能容納的記錄數
*/
public RowSetPage(RowSet crs, int start, int totalSize, int pageSize) {
try{
int avaCount=0;
if (crs!=null) {
crs.beforeFirst();
if (crs.next()){
crs.last();
avaCount = crs.getRow();
}
crs.beforeFirst();
}
rs = crs;
super.init(start,avaCount,totalSize,pageSize,rs);
}catch(java.sql.SQLException sqle){
throw new RuntimeException(sqle.toString());
}
}
/**
*取分頁對象中的記錄數據
*/
public javax.sql.RowSet getRowSet(){
return rs;
}
}
///////////////////////////////////
//
// PagedStatement.java
// author: [email protected]
//
///////////////////////////////////
package page;
import foo.DBUtil;
import java.math.BigDecimal;
import java.util.List;
import java.util.Iterator;
import java.util.Collections;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.PreparedStatement;
import java.sql.Timestamp;
import javax.sql.RowSet;
/**
* <p>Title: 分頁查詢</p>
* <p>Description: 根據查詢語句和頁碼查詢出當頁數據</p>
* <p>Copyright: Copyright (c) 2002</p>
* @author [email protected]
* @version 1.0
*/
public abstract class PagedStatement {
public final static int MAX_PAGE_SIZE = Page.MAX_PAGE_SIZE;
protected String countSQL, querySQL;
protected int pageNo,pageSize,startIndex,totalCount;
protected javax.sql.RowSet rowSet;
protected RowSetPage rowSetPage;
private List boundParams;
/**
* 構造一查詢出所有數據的PageStatement
* @param sql query sql
*/
public PagedStatement(String sql){
this(sql,1,MAX_PAGE_SIZE);
}
/**
* 構造一查詢出當頁數據的PageStatement
* @param sql query sql
* @param pageNo 頁碼
*/
public PagedStatement(String sql, int pageNo){
this(sql, pageNo, Page.DEFAULT_PAGE_SIZE);
}
/**
* 構造一查詢出當頁數據的PageStatement,並指定每頁顯示記錄條數
* @param sql query sql
* @param pageNo 頁碼
* @param pageSize 每頁容量
*/
public PagedStatement(String sql, int pageNo, int pageSize){
this.pageNo = pageNo;
this.pageSize = pageSize;
this.startIndex = Page.getStartOfAnyPage(pageNo, pageSize);
this.boundParams = Collections.synchronizedList(new java.util.LinkedList());
this.countSQL = "select count(*) from ( " + sql +") ";
this.querySQL = intiQuerySQL(sql, this.startIndex, pageSize);
}
/**
*生成查詢一頁數據的sql語句
*@param sql 原查詢語句
*@startIndex 開始記錄位置
*@size 需要獲取的記錄數
*/
protected abstract String intiQuerySQL(String sql, int startIndex, int size);
/**
*使用給出的對象設置指定參數的值
*@param index 第一個參數為1,第二個為2
『捌』 如何將當前的頁碼變成紅色在JSP文件中通過JAVA代碼做了分頁處理,但是頁數點擊過後沒變化不容易
定義一個string數組,將要的顏色放進去,比如有兩種顏色,頁面顏色設置為 數組名【頁碼%2】就可以了
『玖』 jsp分頁顯示問題
Statement stmt = con.createStatement(); 打開的只是只讀記錄集,舉個例子,執行sql語句select id,name from 表名,如果你打開記錄集後先引用
rs.getString("name"), 後引用rs.getInt("id")就出錯了,解決辦法:
將上句Statement stmt = con.createStatement();替換成
Statement stmt =con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
就可以了
『拾』 請教JSP網頁分頁代碼。
jsp頁面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="java.util.*,system.VO.*,system.DAO.*,system.Util.*"%>
<%
Utils user=null;
if(request.getSession().getAttribute("user")!=null){
user=(Utils)request.getSession().getAttribute("user");
}
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
WishPagin wpagin = new WishPagin();
String sql = "select * from wishes order by wish_time desc;";
System.out.println(sql);
wpagin.setSql(sql);
ArrayList<Wish> wishes = wpagin.getWishes(request
.getParameter("page"));
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>許願牆</title>
<div id="Content">
<center>
<div style="width: 900px; height: 15px; clear: left"></div>
<%
int intPage = wpagin.getIntPage();
int pageCount = wpagin.getPageCount();
int rowCount = wpagin.getRowCount();
%><span>本網站共有<%=rowCount%>條留言 共<%=pageCount%>頁 第<%=intPage%>頁 </span>
<%
if (intPage < pageCount) {
%>
<form action="<%=request.getContextPath()%>/pages/wish.jsp"
method="post"><a
href="<%=request.getContextPath()%>/pages/wish.jsp?page=<%=intPage + 1%>">下一頁</a> <%
}
%> <%
if (intPage > 1) {
%><a
href="<%=request.getContextPath()%>/pages/wish.jsp?page=<%=intPage - 1%>">上一頁</a> <%
}
%>
</form>
<div style="width: 900px; height: 10px; clear: left"></div>
<div id="neirong">
<table class="TABLEI" border="1" cellpadding="5" cellspacing="5">
<tr>
<th>祝願人</th>
<th>接受人</th>
<th>祝願內容</th>
<th>祝願時間</th>
</tr>
<%
if (wishes.size() != 0) {
for (Wish wish : wishes) {
%>
<tr>
<td class="ListSender"><a
href="<%=request.getContextPath()%>/Read_wishServlet?id=<%=wish.getId()%>"><%=new UserDAO().findById(wish.getWisher_id())
.getUserName()%></a></td>
<td class="ListAccpeter"><a
href="<%=request.getContextPath()%>/Read_wishServlet?id=<%=wish.getId()%>"><%=wish.getReceiver_name()%></a></td>
<td class="ListInfo"><a
href="<%=request.getContextPath()%>/Read_wishServlet?id=<%=wish.getId()%>">
<%
if (wish.getWishContent().length() > 20) {
wish.setWishContent(wish.getWishContent().substring(0, 20));
out.print(wish.getWishContent() + "...");
} else {
out.print(wish.getWishContent());
}
%> </a></td>
<td class="ListDate"><a
href="<%=request.getContextPath()%>/Read_wishServlet?id=<%=wish.getId()%>">
<%
String time = wish.getWishTime();
out.print(time.substring(0, time.length() - 10));
%> </a></td>
</tr>
<%
}
}
%>
</table>
</div>
</center>
</div>
</body>
</html>
java類:
package system.Util;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import system.VO.Wish;
/**
* 祝願分頁顯示
*
* @author jyuanqi
*
*/
public class WishPagin {
private int pageSize = 10; // 一頁顯示的記錄數
private int rowCount; // 記錄總數
private int pageCount; // 總頁數
private int intPage; // 待顯示頁碼
private String sql = "";
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getRowCount() {
return rowCount;
}
public void setRowCount(int rowCount) {
this.rowCount = rowCount;
}
public int getPageCount() {
return pageCount;
}
public void setPageCount(int pageCount) {
this.pageCount = pageCount;
}
public int getIntPage() {
return intPage;
}
public void setIntPage(int intPage) {
this.intPage = intPage;
}
public String getSql() {
return sql;
}
public void setSql(String sql) {
this.sql = sql;
}
public ArrayList<Wish> getWishes(String strPage) {
ArrayList<Wish> wishes = new ArrayList<Wish>();
Connection Conn = null;
Statement stmt = null;
ResultSet rs = null;
String url;
if (strPage == null) {// 表明在QueryString中沒有page這一個參數,此時顯示第一頁數據
intPage = 1;
} else {// 將字元串轉換成整型
intPage = java.lang.Integer.parseInt(strPage);
if (intPage < 1)
intPage = 1;
}
// 裝載JDBC驅動程序
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
// 設置資料庫連接字元串
url = "jdbc:mysql://localhost:3306/piaobozz";
// 連接資料庫
try {
Conn = java.sql.DriverManager.getConnection(url, "root", "123");
} catch (SQLException e) {
e.printStackTrace();
}
// 創建一個可以滾動的只讀的SQL語句對象
try {
stmt = Conn.createStatement(
java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE,
java.sql.ResultSet.CONCUR_READ_ONLY);
} catch (SQLException e) {
e.printStackTrace();
}// 准備SQL語句
// 執行SQL語句並獲取結果集
try {
rs = stmt.executeQuery(sql);
} catch (SQLException e) {
e.printStackTrace();
}
// 獲取記錄總數
try {
rs.last();
} catch (SQLException e) {
e.printStackTrace();
}// ??游標在最後一行
try {
rowCount = rs.getRow();
} catch (SQLException e) {
e.printStackTrace();
}// 獲得當前行號
// 記算總頁數
pageCount = (rowCount + pageSize - 1) / pageSize;
// 調整待顯示的頁碼
if (intPage > pageCount) {
intPage = pageCount;
}
if (pageCount > 0) {
// 將記錄指針定位到待顯示頁的第一條記錄上
try {
rs.absolute((intPage - 1) * pageSize + 1);
} catch (SQLException e) {
e.printStackTrace();
}
// 顯示數據
int i = 0;
try {
while (i < pageSize && !rs.isAfterLast()) {
Wish wish = new Wish(rs.getInt("id"), rs
.getInt("wisher_id"),
rs.getString("receiver_name"), rs
.getString("wish_content"), rs
.getString("wish_time"));
wishes.add(wish);
i++;
rs.next();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
// 關閉結果集
try {
rs.close();
// 關閉SQL語句對象
stmt.close();
// 關閉資料庫
Conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
return wishes;
}
}