jsp讀取數(shù)據(jù)庫(kù)實(shí)現(xiàn)分頁(yè)技術(shù)簡(jiǎn)析
更新時(shí)間:2012年11月23日 10:53:27 投稿:whsnow
這篇文章介紹的是用javabean和jsp頁(yè)面來(lái)實(shí)現(xiàn)數(shù)據(jù)的分頁(yè)顯示,例子中所使用的數(shù)據(jù)庫(kù)是Mysql,需要的朋友可以了解下
這篇文章介紹的是用javabean和jsp頁(yè)面來(lái)實(shí)現(xiàn)數(shù)據(jù)的分頁(yè)顯示,例子中所使用的數(shù)據(jù)庫(kù)是Mysql。
1、先看javabean
類(lèi)名:
databaseBean.java:
以下為databaseBean.java的代碼:
復(fù)制代碼 代碼如下:
package database_basic;
import java.sql.*;
import java.util.*;
public class databaseBean
{
//這是默認(rèn)的數(shù)據(jù)庫(kù)連接方式
private String DBLocation="jdbc:mysql://localhost/onestoptech?user=root&password=password&useUnicode=true&characterEncoding=GB2312";
private String DBDriver="org.gjt.mm.mysql.Driver";
private Connection conn=null;
public databaseBean(){}
//通過(guò)set方法可以靈活設(shè)置數(shù)據(jù)庫(kù)的連接
public void setDBLocation(String location){DBLocation=location;}
public void setDBDriver(String driver){DBDriver=driver;}
public void setconn(Connection conn){this.conn=conn;}
public String getDBLocation(){return(DBLocation);}
public String getDBDriver(){return(DBDriver);}
public Connection getconn(){return(conn);}
/*public String DBConnect(){}
public String DBDisconnect(){}
public ResultSet query(String sql){}
public int getTotalPage(String sql,int pageSize){}
public ResultSet getPagedRs(String sql,int pageSize,int pageNumber){}
public String execute_sql(String sql){}*/
//建立連接
public String DBConnect()
{
String strExc="Success!";//strExc默認(rèn)為Success,如果有例外拋出,即數(shù)據(jù)庫(kù)連接不成功,則下面幾個(gè)catch中被賦予其他拋出信息
try
{
Class.forName(DBDriver);
conn=DriverManager.getConnection(DBLocation);
}
catch(ClassNotFoundException e)
{
strExc="數(shù)據(jù)庫(kù)驅(qū)動(dòng)沒(méi)有找到,錯(cuò)誤提示:<br>" +e.toString();
}
catch(SQLException e)
{
strExc="sql語(yǔ)句錯(cuò)誤,錯(cuò)誤提示<br>" +e.toString();
}
catch(Exception e)
{
strExc="錯(cuò)誤提示:<br>" +e.toString();
}
return (strExc);
}//then end of DBConnect
//斷開(kāi)連接
public String DBDisconnect()
{
String strExc="Success!";//strExc默認(rèn)為Success,如果有例外拋出,即數(shù)據(jù)庫(kù)斷開(kāi)連接不成功,則下面幾個(gè)catch中被賦予其他拋出信息
try
{
if(conn!=null)conn.close();
}
catch(SQLException e)
{
strExc=e.toString();
}
return (strExc);
}
//通過(guò)傳入sql語(yǔ)句來(lái)返回一個(gè)結(jié)果集
public ResultSet query(String sql) throws SQLException,Exception
{
ResultSet rs=null;
if (conn==null)
{
DBConnect();
}
if (conn==null)
{
rs=null;
}
else
{
try
{
Statement s=conn.createStatement();
rs=s.executeQuery(sql);
}
catch(SQLException e){throw new SQLException("Cound not execute query.");}
catch(Exception e){throw new Exception("Cound not execute query.");}
}//then end of if
return(rs);
}//then end of the function executeQuery
//通過(guò)傳入sql語(yǔ)句和pageSize(每頁(yè)所顯示的結(jié)果數(shù)目)計(jì)算并返回總共的頁(yè)數(shù)
public int getTotalPage(String sql,int pageSize)
{
ResultSet rs=null;
int totalRows=0;
if (conn==null)
{
DBConnect();
}
if (conn==null)
{
rs=null;
}
else
try
{
Statement s=conn.createStatement();
rs=s.executeQuery(sql);//通過(guò)傳入的sql得到結(jié)果集
while(rs.next())
totalRows++;//讓rs一個(gè)個(gè)數(shù),數(shù)完一遍,通過(guò)totalRows++也就計(jì)算出了返回結(jié)果集中總的條目數(shù)
}
catch(SQLException e){}
rs=null;
//由這個(gè)算法得出總頁(yè)數(shù)(totalRows-1)/pageSize+1,并返回結(jié)果。totalRows是指返回結(jié)果集中的總的條目數(shù),pageSize是指每頁(yè)顯示的條目數(shù)
return((totalRows-1)/pageSize+1);
}
//通過(guò)傳入sql語(yǔ)句,每頁(yè)顯示的條目數(shù)(pageSize)和頁(yè)碼,得到一個(gè)結(jié)果集
public ResultSet getPagedRs(String sql,int pageSize,int pageNumber)
{
ResultSet rs=null;
int absoluteLocation;
if (conn==null)
{
DBConnect();
}
if (conn==null)
{
rs=null;
}
else
try
{
Statement s=conn.createStatement();
//pageSize*pageNumber每頁(yè)顯示的條目數(shù)乘以頁(yè)碼,計(jì)算出最后一行結(jié)果的編號(hào),任何編號(hào)大于這個(gè)maxrows的結(jié)果都會(huì)被drop
s.setMaxRows(pageSize*pageNumber);
rs=s.executeQuery(sql);
}
catch(SQLException e){}
//absoluteLocation=pageSize*(pageNumber-1)這個(gè)表達(dá)式計(jì)算出上一頁(yè)最后一個(gè)結(jié)果的編號(hào)(如果有本頁(yè)的話,上一頁(yè)的顯示的結(jié)果條目數(shù)肯定是pageSize)
absoluteLocation=pageSize*(pageNumber-1);
try
{
//這個(gè)for循環(huán)的作用是讓結(jié)果集rs定位到本頁(yè)之前的最后一個(gè)結(jié)果處
for(int i=0;i<absoluteLocation;i++)
{
rs.next();
}
}
catch(SQLException e) { }
//此時(shí)返回的結(jié)果集被兩頭一夾,就是該頁(yè)(pageNumber)要顯示的結(jié)果
return(rs);
}
public String execute_sql(String sql){
String strExc;
strExc="Success!";
if(conn!=null)
{
try{
PreparedStatement update;
update=conn.prepareStatement(sql);
update.execute();
}
catch(SQLException e)
{
strExc=e.toString();
}
catch(Exception e)
{
strExc=e.toString();
}
}
else
{
strExc="Connection Lost!";
}
return(strExc);
}//execute_sql
2、分析jsp頁(yè)面
頁(yè)面名稱(chēng):
admin_show.jsp
頁(yè)面代碼:
復(fù)制代碼 代碼如下:
<%@ page errorPage="error.jsp"%>
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.util.*"%>
<%@ page import="java.sql.*"%>
//導(dǎo)入database_basic包下面的databaseBean類(lèi),別名是basicDB
<jsp:useBean id="basicDB" class="database_basic.databaseBean" scope="page"/>
<%
String sql;
ResultSet rs;
int id;
String reply,Exc;
Exc=basicDB.DBConnect();//建立連接,若成功,則返回Success!若失敗,則返回相應(yīng)出錯(cuò)信息
if(!Exc.equals("Success!"))
{
//basicDB.DBDisconnect();
throw new Exception(Exc);
}
int pageSize=10; //定義每頁(yè)顯示的數(shù)據(jù)條數(shù)
int currentPage=1; //當(dāng)前頁(yè)(第一次顯示的肯定是第一頁(yè)啦!~),以后的“當(dāng)前頁(yè)”由下面出現(xiàn)的頁(yè)面中的pages參數(shù)傳入
int allPage=-1;
String pages=request.getParameter("pages");//取得頁(yè)面中pages參數(shù),此參數(shù)代表的頁(yè)面的就是要顯示的“當(dāng)前頁(yè)面”
if(pages!=null) currentPage=Integer.valueOf(pages).intValue();//這是一個(gè)Integer型轉(zhuǎn)int型的例子,第一次執(zhí)行這個(gè)頁(yè)面的時(shí)候,pages這個(gè)參數(shù)是null,currentPage=1;當(dāng)再次執(zhí)行這個(gè)頁(yè)面的時(shí)候,參數(shù)pages將被賦值,currentPage=pages的int值
sql="select * from gbook order by id desc";//這樣返回的結(jié)果會(huì)采用desc降序排列,好處是,顯示在前面的是最新的信息
allPage=basicDB.getTotalPage(sql,pageSize);//得到總頁(yè)碼數(shù)
rs=basicDB.getPagedRs(sql,pageSize,currentPage);//得到當(dāng)前頁(yè)面要顯示的結(jié)果集
%>
<table border="0" cellspacing="1" cellpadding="3" width="590" bgcolor="#ffffff">
<%
while(rs.next()){
id=rs.getInt("id");//得到數(shù)據(jù)庫(kù)(結(jié)果集)中id編號(hào)
%>
<tr bgcolor="#FF6600" style="color:white">
<td >Name:<%=rs.getString("leaver")%></td>
<td >Time:<%=rs.getString("leave_date")%></td>
<td >Email:<%=rs.getString("email")%></td>
<td ><div style="width:150;overflow:hidden;">Home:<%=rs.getString("homepage")%></div></td>
</tr>
<tr bgcolor="#FFE3B9">
<td colspan=4><FONT COLOR="#FF6600">Content:</FONT><BR><BR><%=rs.getString("content")%> </td>
</tr>
<%}%>
<tr><td height="1"></td></tr>
<tr>
<td colspan=4 align=right bgcolor="#FF6600" style="color:white;">
現(xiàn)在是第<%=currentPage%>頁(yè),
<%if(currentPage>1){%>
<!--如果不在第一頁(yè),則顯示出“首頁(yè)”鏈接-->
<A HREF="admin_show.jsp?pages=<%=(currentPage-1)%>">首頁(yè)</A>
<%}
for(int i=1;i<=allPage;i++)
{
//顯示出1、2、3、4……到最后一頁(yè)的鏈接
out.println("<a href=admin_show.jsp?pages="+i+">"+i+"</a>");
}
%>
<%if(currentPage<allPage){%>
<!--如果不在最后一頁(yè),則顯示出“末頁(yè)”鏈接-->
<A HREF="admin_show.jsp?pages=<%=(currentPage+1)%>">末頁(yè)</A>
<%}%></td>
</tr>
</table>
}//then end of the class
3、總結(jié)
這個(gè)實(shí)現(xiàn)分頁(yè)顯示的程序中,有幾個(gè)算法和實(shí)現(xiàn)方法是比較固定且經(jīng)典的,對(duì)沒(méi)寫(xiě)過(guò)分頁(yè)程序的人來(lái)說(shuō),應(yīng)該有所啟發(fā)。
相關(guān)文章
JSP 頁(yè)面中使用FCKeditor控件(js用法)
FCKeditor是一個(gè)專(zhuān)門(mén)使用在網(wǎng)頁(yè)上屬于開(kāi)放源代碼的所見(jiàn)即所得文字編輯器。它志于輕量化,不需要太復(fù)雜的安裝步驟即可使用。2009-04-04Java Web實(shí)現(xiàn)的基本MVC實(shí)例分析
這篇文章主要介紹了Java Web實(shí)現(xiàn)的基本MVC,以完整實(shí)例形式較為詳細(xì)的分析了JSP實(shí)現(xiàn)MVC架構(gòu)的具體步驟與相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09JSP連接SQL Server 2000系統(tǒng)配置
JSP連接SQL Server 2000系統(tǒng)配置...2006-10-10jsp導(dǎo)出身份證到excel時(shí)候格式不對(duì)但以X結(jié)尾的卻可以
excel導(dǎo)出身份證的時(shí)候顯示有的對(duì)有的不對(duì),身份證以X結(jié)尾的可以,其它都顯示不正確,關(guān)于這個(gè)問(wèn)題的解決方法如下,需要的朋友可以參考下2014-10-10