ASP教程之VisualInterDev6.0七种完成分页显现的方...
专业性的服务。有的ASP商提供垂直型的应用服务,针对某一特定行业提供应用服务。MSVisualInterDev6.0中七种完成分页显现的办法我们在体例与数据库有关的Web网页时,因为要显现的数据量伟大,经常面对一个数据纪录分页显现的成绩。
在微软的ASP编程系统中,ADO工具的创建,使得从网页会见数据库成为一件易事,出格是ADO的Recordset工具使得把持数据的输入显现更加便利、自在。而在VisualInterDev6.0(以下简称VI6.0)中,因为ScriptObjectModel(以下简称SOM)、Design-TimeControl(以下简称DTC)和DataEnvironmentObjectModel(以下简称DEOM)等工具模子的引进,使网页对数据库的会见计划显得更加便利。
由于主题方面的缘故原由,关于数据库的毗连,下文只给出代码和扼要正文,而把重点放在怎样使用Recordset工具(或控件)完成数据纪录的分页显现方面。依据我的了解,分页显现的关头就在于对ADO的Recordset工具或DTC(计划时控件)的Recordset控件的属性和办法的纯熟掌控上。
这七种分页显现的办法归纳综合起来讲分四类:
第1、二种我暂取名叫“纯ASP法”,这也是国际的ASP网站上用得最多的办法,它们的区分仅在完成技能的分歧。这两种办法的完成最易了解,用到的工具观点也起码,对开辟情况的请求也最低(只需记事本就行)。能够说,这两种办法的本色仍是CGI的编程头脑,只是在程序中引进了ADO工具罢了。
第4、五种暂取名叫“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
IfPage1Then
Response.Write"<AHREF=emp1.asp?Page=1>第一页</A>@"
Response.Write"<AHREF=emp1.asp?Page="&(Page-1)&">上一页</A>@"
EndIf
IfPagers.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控件与第1、二种办法中先容的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=recordPtrCounter
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
FunctionbtnLast_onclick()翻到末页
empList.setCurrentPageNumber(empList.getMaxPageNumber())
EndFunction
为包管初次进进该页时,显现的是第一页,我们还得编写该网页工具的onEnter事务。
FunctionempList_onEnter()
IfempList.firstEnteredThen
empList.setCurrentPageNumber(1)
EndIf
EndFunction
第五步:编写显现每页的剧本。
<HR><TABLEBORDER=0><TR>//显现表头
<THALIGN="left"WIDTH=35></TH>
<THALIGN="left"WIDTH=150>EmpID</TH>
<THALIGN="left"WIDTH=200>LastName</TH>
<THALIGN="left"WIDTH=200>FirstName</TH></TR>
<%
pageNumber=empList.getCurrentPageNumber()//盘算翻页所需的各类参数,同DHTML法二
recordsPerPage=empList.getRecordsPerPage()
startRecord=((pageNumber-1)*recordsPerPage)+1
lastRecord=Recordset1.getCount()
ForrecordPtr=startRecordTo(startRecord+recordsPerPage-1)%>
<%IfRecordset1.EOF=TrueThen%>
<TR>
<TD></TD>
<TD></TD>
<TD></TD>
<TD></TD>
</TR>
<%Else%>
<%Recordset1.moveAbsolute(recordPtr)%>
<TR>
<%IfrecordPtr<=lastRecordThen%>
<TD><%=recordptr%></TD>
<%Else%>
<TD></TD>
<%EndIf%>
<TD><%=Recordset1.fields.getValue("empID")%></TD>
<TD><%=Recordset1.fields.getValue("lastname")%></TD>
<TD><%=Recordset1.fields.getValue("firstname")%></TD>
</TR>
<%EndIf%>
<%Next%>
</TABLE><HR>
第七种:DataEnvironmentObjectModel(数据情况工具模子)法。
DataEnvironment工具模子把ADO工具模子及它的工具----“Connection”,“Command”,“Recordset”,“Field”和“Parameter”工具----笼统到一个加倍简单的表单中。DataEnvironmentObjectModel把命令显现为办法。用户能够挪用这些办法,这些办法会实行这些命令并前往所失掉的纪录集。关于DEOM工具模子具体材料请参考相干书本。我们来看上面网页emp7.asp的例子:
第一步:在VI6.0的“projectExplorer”窗口中的工程项目上右击鼠标并从弹出式菜单选择“AddDataConnection”。依据VI给出的导航提醒创建一个到数据库的毗连以后,用户就增加了一个完成从ASP使用程序会见数据库的数据命令。同时,你将会在“ProjectExplorer”窗口中的global.asa文件下方看到一个“DataEnvironment”工具。
第二步:右击“DataEnvironment”工具然后从弹出式菜单当选择“AddDataCommand”选项,增加一个数据命令Command1。依据VI6.0的导航提醒,你能够在Command1Properties弹出窗口的Genetal页当选SQLStatement,输出:select*fromemp。按OK前往。
第三步:你创立了这个数据命令后,就已为该DataEnvironment工具创立了一个办法,然后就能够从剧本中挪用这个办法,并且该办法将会给用户前往一个纪录集。
thisPage.createDE()//在SOM形式下,thisPage暗示以后网页工具,createDE()办法创立了DE工具。
DE.Command1//实行DE工具的命令,前面可代参数,做有前提查询时很有效。
Setrs=DE.rsCommand1//DE.rscommand1使得rs工具完整同等于一个ADO的Recordset工具。
第四步:由于rs为ADO工具,以是,以下的完成翻页代码完整参照以上先容的几种办法,此处略过。
别的另有如FrontPage2000的数据库导航中完成的办法等,因与本主题有关,此处略。
综上所述,后面先容的每种办法都包括了良多新的手艺,因为篇幅的干系,没法深切。本文只是想经由过程完成翻页这一详细的例子来先容ASP网页编程的多种办法;让人人亲自体验一下VI6.0在体例网页中的壮大功效;懂得和熟习微软在网页编程中提出的ADO、DHTML、DTC控件、SOM工具模子和DEOM工具模子的利用办法;但愿能给人人在体例网页时供应更多的选择和参考。
参考文献:
1.《轻松把握VisualInterDev6》[美]L.MichaelVanHoozer,Jr.著电子产业出书社
以下三篇文章来自微软网站:http://www.mircosoft.com/vinterdev/
2.“TheVisualInterDev6DataEnvironmentObject”byIanBlackburn
3.“DisplayingInformationinSequentialPageswithVisualInterDev”byMikePope
4.“TheVisualInterDev6_0ScriptingObjectModelEventSequence”bySteveMillet
优点:简单易学、开发速度快、有很多年“历史”,能找到非常多别人做好的程序来用、配合activeX功能强大,很多php做不到的asp+activeX能做到,例如银行安全控件 从事这个行业,那么你可以学ASP语言,简单快速上手,熟练dreamweav排版,写asp代码,熟练photoshop处理图片,打好基础就行了 代码的可重用性差:由于是面向结构的编程方式,并且混合html,所以可能页面原型修改一点,整个程序都需要修改,更别提代码重用了。 Application:这个存储服务端的数据,如果不清除,会直到web应用程序结束才清除(例如重启站点) 不是很难但是英文要有一点基础网上的教程很少有系统的详细的去买书吧,另不用专门学习vb关于vbscript脚本在asp教材都有介绍 Session:这个存储跟客户端会话过程的数据,默认20分钟失效 我们必须明确一个大方向,不要只是停留在因为学而去学,我们应有方向应有目标. 如何更好的使自己的东西看上去很不错等等。其实这些都不是问题的实质,我们可以在实践中不断提升自己,不断充实自己。 接下来就不能纸上谈兵了,最好的方法其实是实践。实践,只能算是让你掌握语言特性用的。而提倡做实际的Project也不是太好,因为你还没有熟练的能力去综合各种技术,这样只能使你自己越来越迷糊。 Application:这个存储服务端的数据,如果不清除,会直到web应用程序结束才清除(例如重启站点)
页:
[1]