假設。
你只需要顯示當前頁數的前3頁和後3頁。
吶么只有3種可能。
第一個可能,用戶當前點擊的頁數未超過前3頁。需要顯示前7頁(前三頁和後三頁以及當前點擊的頁)省略7頁後面的頁。
第二個可能,用戶點擊的頁數以超過前三頁可是未到尾三頁。那麼就要省略當前頁數的前三頁後三頁之外的所有頁碼。
第三個可能,用戶點擊的頁數以超過尾三頁。那麼就省略最後7頁外的所有頁碼。
這是我寫的分頁碼中算省略頁碼的代碼。
$fornum = 10; //先聲明你要顯示的是幾個頁。
if($totalpage > $fornum) //判斷當前的所有頁數是否超過你要顯示的頁。如果沒超過。那就不用費事直接顯示所有頁碼就行叻。 如果超過進入循環。
{
//第一種可能。我這個是只顯示10個頁碼。
if($page<=6) //如果當前的頁碼大於等於6.也就是前面的頁碼不用省略。直接省略10個頁碼之後的頁就OK叻。
{
for($i=1; $i <= $fornum; $i++)//這就是循環顯示數字頁碼
{
if($page == $i ){
echo '<a href="javascript:;" class="on">'.$i.'</a>';
}
else{
echo '<a href="'.$_SERVER['PHP_SELF'].'?page='.$i.'" class="num">'.$i.'</a>';
}
}
echo '<a href="'.$_SERVER['PHP_SELF'].'?page='.$totalpage.'" class="num">...'.$totalpage.'</a>';
}
//注意阿。這不是第二個可能。這是第三個可能。因為第一個和第三個好判斷。而兩個都不滿足吶就是第二個可能叻。所以第二個不用判斷。這個條件也很好解釋。總的頁數減去當前頁數小於等於5的話。那麼就省略最後10頁以外的頁碼。
elseif(($totalpage-$page) <= 5)
{
echo '<a href="'.$_SERVER['PHP_SELF'].'?page=1" class="num">1...</a>';
for($i=$totalpage - ($fornum -1); $i <= $totalpage; $i++)//依舊是循環顯示數字頁碼
{
if($page == $i ){
echo '<a href="javascript:;" class="on">'.$i.'</a>';
}
else{
echo '<a href="'.$_SERVER['PHP_SELF'].'?page='.$i.'" class="num">'.$i.'</a>';
}
}
}
//這就是第二個可能叻。第一和第三的條件都不滿足那麼只有前沒到頭後沒著尾的情況叻。所以不用判斷直接顯示當前頁數的前幾頁和後幾頁。頭尾都省略。
else
{
echo '<a href="'.$_SERVER['PHP_SELF'].'?page=1" class="num">1...</a>';
for($i=$page - 4; $i < $page + 5; $i++)//循環顯示數字頁碼
{
if($page == $i ){
echo '<a href="javascript:;" class="on">'.$i.'</a>';
}
else{
echo '<a href="'.$_SERVER['PHP_SELF'].'?page='.$i.'" class="num">'.$i.'</a>';
}
}
echo '<a href="'.$_SERVER['PHP_SELF'].'?page='.$totalpage.'" class="num">...'.$totalpage.'</a>';
}
}
//這是最上面的那個if的,如果總頁碼沒超過你要顯示的頁碼就直接顯示所有的頁碼~
else
{
for($i=1; $i <= $totalpage; $i++)//仍是循環顯示數字頁碼
{
if($page == $i ){
echo '<a href="javascript:;" class="on">'.$i.'</a>';
}
else{
echo '<a href="'.$_SERVER['PHP_SELF'].'?page='.$i.'" class="num">'.$i.'</a>';
}
}
}
然後就木有叻。首頁尾頁上頁下頁的代碼我就不粘叻。 關於顯示固定頁碼的代碼就是這些。希望你能看懂。打的我手都酸了。。。
2. java面試的時候問到如何實現分頁
分頁的實現可分為兩大類相信你也懂得這個,一、數據在Java代碼中進行分頁,然後取得當前頁數據;二、在資料庫中直接取得當前頁數據。
通常面試官都希望聽到後者,因為那才是高效的方法。你如果想讓面試官覺得你的能力高的話你就先否定他的問題,你可以回答說:「Java中根本不需要做分頁的實現代碼只管拿資料庫中的當前頁數據即可,數據分頁功能應該交由SQL處理,在分頁實現中Java最多隻實現總頁數的計算,除此以外幾乎不用管。」如果你這么答的話面試官通常會問你總頁數的演算法,至於這個你可以網上找個高效點的方法,我現在知道最高效的就是:(數據總行數+每頁數據行數-1)/每頁數據行數。
演算法可能有更高效的,你可以到網上找找。記住只在面試中才能這么答,筆試的話老老實實寫出實現方法。否定面試官的問題會讓他覺得你更professional,但不要太囂張不然適得其反的。
通常面試如果他狂問我代碼實現的話我都會要回簡歷走人,因為他們需要的只是一個Coder。
3. SQL的幾種分頁演算法
利用SQL語句分頁要看你用的什麼資料庫。
Oracle資料庫可以使用ROWNUM或row_number(),例如:Select * from (select ROWNUM rn, t.* from table t) where rn between 11 and 20;
Select * from (select row_number() over (ORDER BY col1) rn, t.* from table t) where rn between 11 and 20;
SQLServer資料庫可以用Top或者row_number()函數,道理同上。
利用SQL分頁有局限性,就是針對不同的資料庫有不同的寫法,所以通常會在應用程序裡面做分頁通用性比較強。但是對於數據量非常龐大的應用來說,還是用SQL分頁比較適合。
4. 關於Java的分頁演算法,急!
使用分頁類,直接調用就可以,代碼如下:
package com.godwin.news.util;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.ArrayList;
/**
* 分頁類,用於封閉分頁顯示信息
*
* @author javabs
*
*/
public class Pager {
// 當前頁
private int currentPage;
// 總頁數
private int totalPage;
// 總記錄數
private int totalRecord;
// 每頁條數
private int pageSize;
// 是否有下一頁
private int hasNext;
private ArrayList keys;
private ArrayList values;
// 查詢串
private String queryString;
// 首頁
private String firstLink;
// 上一頁
private String previousLink;
// 下一頁
private String nextLink;
// 尾頁
private String lastLink;
// 鏈接
private String forScriptLink;
public Pager(int pageSize, String queryString) {
keys = new ArrayList();
values = new ArrayList();
setQueryString(queryString);
setPageSize(pageSize);
}
public String getForScriptLink() {
if (keys.contains("toPage"))
removeKey("toPage");
String tmp = getQueryString();
if (tmp.length() == 0)
return "?";
else
return "?" + tmp + "&";
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(String toPage) {
int tmpage = 1;
try {
tmpage = Integer.parseInt(toPage);
} catch (NumberFormatException e) {
tmpage = 1;
}
if (tmpage < 1)
tmpage = 1;
else if (tmpage > getTotalPage())
tmpage = getTotalPage();
currentPage = tmpage;
}
public String getFirstLink() {
return getQueryStr(1);
}
public int getHasNext() {
int i = 1;
if (getCurrentPage() >= getTotalPage())
i = 0;
return i;
}
public String getLastLink() {
return getQueryStr(getTotalPage());
}
public String getNextLink() {
return getQueryStr(currentPage == totalPage ? currentPage : (currentPage + 1));
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public String getPreviousLink() {
return getQueryStr(currentPage == 1 ? currentPage : currentPage - 1);
}
public void setPreviousLink(String previousLink) {
this.previousLink = previousLink;
}
public String getQueryString() {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < keys.size(); i++) {
String key = (String) keys.get(i);
String value = (String) values.get(i);
sb.append("&");
sb.append(key);
sb.append("=");
sb.append(value);
}
return sb.delete(0, 1).toString();
}
public void setQueryString(String queryString) {
if (queryString != null) {
String s[] = queryString.split("&");
for (int i = 0; i < s.length; i++) {
String s1[] = s[i].split("=");
if (s1.length == 2) {
keys.add(s1[0]);
values.add(s1[1]);
} else {
keys.add(s1[0]);
values.add("");
}
}
}
}
public int getTotalPage() {
return totalPage;
}
public void setTotalPage() {
if (totalRecord % pageSize == 0) {
totalPage = totalRecord / pageSize;
totalPage = totalPage == 0 ? 1 : totalPage;
}
else
totalPage = totalRecord / pageSize + 1;
}
public int getTotalRecord() {
return totalRecord;
}
public void setTotalRecord(int totalRecord) {
this.totalRecord = totalRecord;
setTotalPage();
}
public String[] getQueryParameterValues(String key) {
return getQueryParameterValues(key, "UTF-8");
}
public String[] getQueryParameterValues(String key, String decode) {
ArrayList ret = new ArrayList();
for (int i = 0; i < keys.size(); i++)
if (((String) keys.get(i)).equals(key))
try {
ret.add(URLDecoder.decode((String) values.get(i), decode));
} catch (UnsupportedEncodingException e) {
ret.add((String) values.get(i));
}
if (ret.size() == 0)
return null;
String strArr[] = new String[ret.size()];
for (int i = 0; i < ret.size(); i++)
strArr[i] = (String) ret.get(i);
return strArr;
}
public String getQueryParameter(String key) {
return getQueryParameter(key, "UTF-8");
}
public String getQueryParameter(String key, String decode) {
String value = "";
if (key != "toPage") {
try {
value = URLDecoder.decode(getValue(key), decode);
} catch (UnsupportedEncodingException e) {
value = getValue(key);
}
} else {
int tmpage = 1;
try {
value = getValue(key);
tmpage = Integer.parseInt(value);
} catch (NumberFormatException e) {
tmpage = 1;
} catch (NullPointerException e1) {
tmpage = 1;
}
if (tmpage < 1)
tmpage = 1;
else if (tmpage > getTotalPage())
tmpage = getTotalPage();
value = (new StringBuffer(String.valueOf(tmpage))).toString();
}
return value;
}
public void setQueryParameter(String key, String value) {
if (key.equals("toPage"))
removeKey(key);
keys.add(key);
values.add(value);
}
public String getQueryStr(int toPage) {
setQueryParameter("toPage", (new StringBuffer(String.valueOf(toPage))).toString());
return "?" + getQueryString();
}
private String getValue(String key) {
String ret = "";
for (int i = 0; i < keys.size(); i++) {
if (!((String) keys.get(i)).equals(key))
continue;
ret = (String) values.get(i);
break;
}
return ret;
}
private void removeKey(String key) {
for (int i = 0; i < keys.size(); i++) {
if (!((String) keys.get(i)).equals(key))
continue;
keys.remove(i);
values.remove(i);
break;
}
}
public static void main(String args[]) {
String str = "a=中文aa&b=2&c=3&c=4&c=5";
Pager page = new Pager(2, str);
page.setTotalRecord(10);
page.setCurrentPage("1");
System.out.println(page.getFirstLink());
System.out.println(page.getPreviousLink());
System.out.println(page.getNextLink());
System.out.println(page.getLastLink());
String s = page.getQueryParameter("a");
System.out.println("s: " + s);
}
}