ASP中实现分页显示的七种武器.docx
- 文档编号:23716371
- 上传时间:2023-05-20
- 格式:DOCX
- 页数:13
- 大小:23.01KB
ASP中实现分页显示的七种武器.docx
《ASP中实现分页显示的七种武器.docx》由会员分享,可在线阅读,更多相关《ASP中实现分页显示的七种武器.docx(13页珍藏版)》请在冰豆网上搜索。
ASP中实现分页显示的七种武器
在微软的ASP编程体系中,ADO对象的建立,使得从网页访问数据库成为一件易事,特别是ADO的Recordset对象使得控制数据的输出显示更为方便、自由。
而在VisualInterDev6.0(以下简称VI6.0)中,由于ScriptObjectModel(以下简称SOM)、Design-TimeControl(以下简称DTC)以及DataEnvironmentObjectModel(以下简称DEOM)等对象模型的引入,使网页对数据库的访问设计显得更为方便。
因为主题方面的原因,关于数据库的连接,下文只给出代码和简要注释,而把重点放在如何利用Recordset对象(或控件)实现数据记录的分页显示方面。
根据我的理解,分页显示的关键就在于对ADO的Recordset对象或DTC(设计时控件)的Recordset控件的属性和方法的熟练把握上。
这七种分页显示的武器概括起来说分四类:
第一、二种我暂取名叫“纯ASP法”,这也是国内的ASP网站上用得最多的方法,它们的区别仅在实现技巧的不同。
这两种方法的实现最易理解,用到的对象概念也最少,对开发环境的要求也最低(只要记事本就行)。
可以说,这两种方法的实质还是CGI的编程思想,只是在程序中引入了ADO对象而已。
第四、五种暂取名叫“SOM的DHTML法”。
这两种方法要求在VI6.0的环境下,利用微软提出的脚本对象模型(ScriptObjectModel)和DHTML中Table对象的与数据库绑定的新特性(许多书和文章只介绍了DHTML的CSS特性在样式设计中的运用而忽略介绍其数据绑定特性),实现在客户端控制翻页。
但它要求用户的浏览器必须是支持DHTML,如:
MicrosoftInternetExplorer4.0及以上的版本。
第六种暂取名叫“SOM服务器端法”。
要求在VI6.0的环境下开发,它利用微软提出的脚本对象模型(ScriptObjectModel)中的几个DTC控件:
Recordset、PageObject、Grid等在服务器端(客户端)实现翻页控制。
这是一种激动人心的、全新的编程方法,它把网页看成对象(这种对象模型和传统的DOM----documentobjectmodel是有区别的:
DOM只能控制客户端,而SOM可控制服务器端和客户端),它真正实现了网页的面向对象编程。
但遗憾的是,也许是我个人能力有限,这种技术我个人认为还不是很成熟,比如,与浏览器的结合还不是很好,这将在后文详细说明。
第七种暂取名叫“DEOM法”。
它也是利用了VI6.0中建立的数据环境对象模型(DataEnvironmentObjectModel)建立Recordset对象。
这也是在网页编程上比较少见的新方法,与SOM模型相比,自有它的优点,这将在后文详述。
在后面所举的所有例子源代码,都可以直接拷贝使用,你甚至可以不懂其原理,只要把其中的粗斜体字部分换成相应自己的数据库名或字段名就可以了。
在开始详细介绍各种分页方法前,让我们先创建一个数据库:
用Office97中的access自创一个Employee.mdb,其中建一个表emp,只设三个字段:
empID,lastname和firstname。
为什么这么简单,是因为我们关心的是怎样处理recordset的结果。
第一种:
参数直接代入法
这种方法是用手工建立Recordset对象,利用其pagesize(每页指定显示记录数),pagecount(总页码数)和absolutepage(当前页码数)属性来控制分页的输出。
分页采用<href>直接带页码参数的方法来控制翻页。
网页的名字为emp1.asp。
源代码如下:
<%//建立与employee.mdb数据库的连接。
Setconn=Server.CreateObject("ADODB.Connection")
conn.Open"driver={MicrosoftAccessDriver(*.mdb)};dbq=employee.mdb"
//建立emp表的Recordset对象实例rs。
Setrs=Server.CreateObject("ADODB.Recordset")
rs.Open"emp",conn,3
PageSize=10//pagesize属性指定了每页要显示的记录条数
Page=CLng(Request("Page"))’string型转化为long型
IfPage<1ThenPage=1
IfPage>rs.PageCountThenPage=rs.PageCount
IfPage<>1Then
Response.Write"<AHREF=emp1.asp?
Page=1>第一页</A>"
Response.Write"<AHREF=emp1.asp?
Page="&(Page-1)&">上一页</A>"
EndIf
IfPage<>rs.PageCountThen
Response.Write"<AHREF=emp1.asp?
Page="&(Page+1)&">下一页</A>"
Response.Write"<AHREF=emp1.asp?
Page="&rs.PageCount&">最后一页</A>"
EndIf
Response.write"页码:
"&Page&"/"&rs.PageCount&"</font>"
//每一页的显示
//显示表头
Response.Write"<CENTER><TABLEBORDER=1>"
Response.WRITE"<TR><TD>"&rs.Fields("empID").Name&"</TD>"
Response.WRITE"<TD>"&rs.Fields("lastname").Name&"</TD>"
Response.WRITE"<TD>"&rs.Fields("firstname").Name&"</TD></TR>"
//循环显示每条记录
rs.AbsolutePage=Page//把页码赋给absolutepage属性从而知当前页的首条记录号
ForiPage=1Tors.PageSize//
Response.WRITE"<TR><TD>"&rs.Fields("empID").Value&"</TD>"
Response.WRITE"<TD>"&rs.Fields("firstname").Value&"</TD>"
Response.WRITE"<TD>"&rs.Fields("lastname").Value&"</TD></TR>"
rs.MoveNext
Ifrs.EOFThenExitFor
Next
Response.Write"</TABLE></CENTER>"%>
第二种:
表单传送参数法
这种方法在创建Recordset对象时与第一种相同,只是在翻页控制时,采用<input>和case语句配合来实现翻页。
网页的名字为:
emp2.asp。
此方法在编程逻辑上有个缺点:
就是在按过“上页”或“下页”钮后,再在浏览器上按刷新按钮时,会自动翻页。
源代码如下:
ifPagenum=""ThenPagenum=1//从第一页开始显示
//建立数据库连接和Recordset对象实例rs。
与第一种方法相同,此处略过。
RS.Pagesize=10’设置一页中显示的记录条数为10条
//确定翻页的动作
SelectCaseRequest("NAV")
Case""
session("Pagenum")=1
case"First"’FirstRecord
session("Pagenum")=1
case"Prev"’PreviousRecord
ifsession("Pagenum")>1then
session("Pagenum")=session("Pagenum")-1
EndIf
case"Next"’NextRecord
ifsession("Pagenum")<RS.PageCountthen
session("Pagenum")=session("Pagenum")+1
Endif
case"Last"’LastRecord
session("Pagenum")=RS.PageCount
EndSelect
RS.Absolutepage=Clng(session("Pagenum"))//确定当前页的第一条记录号
//显示当前页
同第一种方法,此处略过。
//Nav翻页按钮设置
<formmethod="GET"action="emp2.asp">
<inputtype="submit"name="NAV"Value="首页">
<inputtype="submit"value="上页"name="NAV">
<inputtype="submit"value="下页"name="NAV">
<inputtype="submit"value="末页"name="NAV"></form>
第三种:
用Grid控件设计分页
所有的方法中,这种方法最容易。
你只需拖DTC中的Recordset控件和Grid控件到asp网页中就行了。
而且,你还能选择是在服务器平台还是在客户端平台控制翻页。
缺点就是你必须用它给定的格式显示,而不能自己自由控制表格的显示格式。
方法如下:
在VI6.0中建一个工程emp.vip。
再在工程中添加一个asp网页:
emp3.asp。
第一步:
选VI6.0菜单条上的“adddataconnect…”,按开发工具的导航提示,你就可以很容易地建立与Employee.mdb数据库的连接。
从DTC工具栏中拖一个Recordset控件到网页中,并设置其属性。
具体如图:
当你拖控件到网页中时,VI6.0会自动提示你“是否使用Scriptingobjectmodel”,按yes。
第三步:
从DTC工具栏中拖一个Grid控件到网页中,然后单击鼠标右键,设置其属性,如:
选在第二步中创建的Recordset控件名,选择emp表中的字段,每页显示多少条记录以及显示格式等。
非常简单方便,只要照着导航提示做就行了。
第四种:
DHTML法一。
数据记录显示在一个HTML表中。
它利用DHTML中表的数据绑定特性来控制记录的分页显示。
缺点就是你的翻页方法将被限制为一种特定的方式:
只能“上页”和“下页”而不能“首页”和“末页”。
由于是在客户端控制翻页,所以,这种和第五种方法是速度最快的,但遗憾的是它只能在支持DHTML的浏览器上使用。
在DHTML中,<TABLE>的DATASRC属性可使表格绑定到一个数据源,另一个属性DATAPAGESIZE可指定一页一次显示的记录数。
我们来看下面的例子:
第一步:
拖Recordset控件到新建的网页emp4.htm中,设置其属性,方法同第三种,此处略。
第二步:
输入下面的代码:
<TABLEID="Table1"DATASRC="#Recordset1_RDS"DATAPAGESIZE=5>//假定前面设定Recordset控件名为Recordset1。
每页显示5条记录。
<THEAD>
<THALIGN="left"WIDTH=150>EmpID</TH>//输出表头
<THALIGN="left"WIDTH=200>LastName</TH>
<THALIGN="left"WIDTH=200>FirstName</TH>
</THEAD>
<TR>
<TD><DIVDATAFLD="EmpID"></DIV></TD>//输出表内容
<TD><DIVDATAFLD="LastName"></DIV></TD>
<TD><DIVDATAFLD="FirstName"></DIV></TD>
</TR>
</TABLE>
第三步:
然后,增加一对DTCsButton按钮控件来做翻页导航,一个命名为“btnPrevious”(上一页),一个命名为“btnNext”(下一页)。
它们相应的脚本如下:
<SCRIPTLANGUAGE=VBScript>
FunctionbtnPrevious_onclick()
Table1.previousPage()
EndFunction
FunctionbtnNext_onclick()
Table1.nextPage()
EndFunction
</SCRIPT>
第五种:
DHTML法二
这种方法是对第四种方法的完善。
采用手工编写脚本的方法,使我们能做“首页”,“末页”翻页导航按钮,并能确定每条记录的位置(记录号)。
由于篇幅的关系,我在下面只介绍一个具体例子,并给出简要说明。
其它关于DHTML和Recordset控件的一些属性和方法请读者自行参照相关书籍。
这里需要提请注意的是,Recordset控件与第一、二种方法中介绍的ADO的Recordset对象有些不同:
Recordset控件没有直接给出pagesize和pagecount等属性,需要用下面介绍的方法来计算。
第一步:
拖Recordset控件到新建的网页emp5.htm中,名字为Recordset1,设置其属性,方法同第三种,此处略。
第二步:
定义三个全局变量和编写Recordset1的ondatasetcomplete(数据设置完成时)脚本。
DimgCurrentPageNumber//当前页号
DimgMaxPageNumber//最大页数
DimgRecordsPerPage//每页显示记录数
gRecordsPerPage=5//设置每页显示记录数为5条记录。
FunctionRecordset1_ondatasetcomplete()
totalRecordCount=Recordset1.getCount()//总的记录条数
gMaxPageNumber=Int(totalRecordCount/gRecordsPerPage)//获得最大页数
If(totalRecordCountModgRecordsPerPage)>0then
gMaxPageNumber=gMaxPageNumber+1
EndIf
EndFunction
第三步:
创建翻页导航按钮。
FunctionbtnFirst_onclick()’翻到首页
gCurrentPageNumber=1
DisplayData()
EndFunction
FunctionbtnPrevious_onclick()’翻到上一页
ifgCurrentPageNumber>1Then
gCurrentPageNumber=gCurrentPageNumber-1
DisplayData()
EndIf
EndFunction
FunctionbtnNext_onclick()’翻到下一页
ifgCurrentPageNumber<gMaxPageNumberThen
gCurrentPageNumber=gCurrentPageNumber+1
DisplayData()
EndIf
EndFunction
FunctionbtnLast_onclick()’翻到末页
gCurrentPageNumber=gMaxPageNumber
DisplayData()
EndFunction
第四步:
编写显示每一页的函数。
其中使用了许多DHTML的属性和方法,请读者自行参考相关书籍。
SubDisplayData()
startRecord=((gCurrentPageNumber-1)*gRecordsPerPage)+1//计算每一页开始显示的记录号数(位置,第几条)
rowCtr=1
lblPageNumber.innerHTML=gCurrentPageNumber&"/"&gMaxPageNumber
ForrecordPtr=startRecordTo(startRecord+gRecordsPerPage-1)//循环显示一页的各条记录
IfrecordPtr>Recordset1.getCount()Then//显示空表
Table1.rows(rowCtr).cells(0).innerHTML="<P></P>"
Table1.rows(rowCtr).cells
(1).innerHTML="<P></P>"
Table1.rows(rowCtr).cells
(2).innerHTML="<P></P>"
Table1.rows(rowCtr).cells(3).innerHTML="<P></P>"
Else//具体显示每一页
Recordset1.moveAbsolute(recordPtr)//移动记录指针。
empID=Recordset1.fields.getValue("empID")
empLName=Recordset1.fields.getValue("firstname")
empFName=Recordset1.fields.getValue("lastname")
Table1.rows(rowCtr).cells(0).innerText=recordPtr’Counter
Table1.rows(rowCtr).cells
(1).innerText=empID
Table1.rows(rowCtr).cells
(2).innerText=empLName
Table1.rows(rowCtr).cells(3).innerText=empFName
EndIf
rowCtr=rowCtr+1
Next
EndSub
另外,我们还需要在window对象的onload事件中编写如下脚本:
ForrowCtr=1togRecordsPerPage
Table1.insertRow(rowCtr)’插一新列
ForcellCtr=0to3
Table1.rows(rowCtr).insertCell()
Next
Next
第六种:
服务器端控制翻页方法。
如果我们在服务器端对数据进行分页形成HTML语句后再输出到客户端,就不会存在浏览器不支持DHTML的问题了。
可是用服务器端法使得我们每次翻页时,都得让Recordset控件重新产生一次,因此速度肯定要比用DHTML的方法慢。
但如果服务器足够快的话,这点慢客户是察觉不到的。
下面的例子中,我将介绍一个新的DTC控件:
PageObject。
这个控件使被指定的网页成为一个网页对象,用户在此网页的服务器脚本中组织的子程序和函数可被看作是该网页对象的方法。
它提供了管理状态信息的一种先进的方法:
网页对象有一些属性(变量),用户可以定义这些属性的生存期。
因为以上这些特性,使我们在编制翻页的脚本时非常方便。
但这种方法的缺点是:
当你按了“上页”或“下页”按钮后,再浏览器上的按刷新按钮,网页会自动翻页。
另外,如果按了浏览器上的“回退”按钮后,再按翻页按钮,可能会出现一次乱翻。
这都是因为网页对象属性(全局变量)造成的。
第一步:
拖Recordset控件到新建的网页emp6.asp中,名字为Recordset1,设置其属性,方法同第三种,此处略。
第二步:
拖PageObject控件到网页中,取名叫emplist。
然后右键单击此控件打开属性页并设置MaxPageNumber,RecordsPerPage,CurrrentPageNumber三个属性(全局变量)。
VI6.0可用get和set方法来读写它们的值,具体用法请查阅相关资料。
第三步:
编写Recordset1的ondatasetcomplete事件。
FunctionRecordset1_ondatasetcomplete()
recordsPerPage=5
empList.setRecordsPerPage(recordsPerPage)//设置网页对象每页记录条数属性为5
totalRecordCount=Recordset1.getCount()//获得记录集的总条数
mpn=Int(totalRecordCount/recordsPerPage)//计算出mpn为总页数
If(totalRecordCountModrecordsPerPage)>0then
mpn=mpn+1
EndIf
empList.setMaxPageNumber(mpn)
EndFunction
第四步:
拖四个button控件到网页中,编写翻页控制脚本。
我们主要是通过改变网页对象的CurrentPageNumber属性的值来实现翻页。
FunctionbtnFirst_onclick()’翻到首页
empList.setCurrentPageNumber
(1)
EndFunction
FunctionbtnPrevious_onclick()’翻到上一页
cpn=empList.getCurrentPageNumber()
ifcpn>1Then
empList.setCurrentPageNumber(cpn-1)
EndIf
EndFunction
FunctionbtnNext_onclick()’翻到下一页
cpn=empList.getCurrentPageNumber()
ifcpn<empList.getMaxPageNumber()then
empList.setCurrentPageNumber(cpn+1)
EndIf
EndFunction
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ASP 实现 分页 显示 武器