第五种:DHTML法二
这种方法是对第四种方法的完善。采用手工编写脚本的方法,使我们能做“首页”,“末页”翻页导航按钮,并能确定每条记录的位置(记录号)。由于篇幅的关系,我在下面只介绍一个具体例子,并给出简要说明。其它关于DHTML和Recordset控件的一些属性和方法请读者自行参照相关书籍。这里需要提请注意的是,Recordset控件与第一、二种方法中介绍的ADO的Recordset对象有些不同:Recordset控件没有直接给出pagesize和pagecount等属性,需要用下面介绍的方法来计算。
第一步:拖Recordset控件到新建的网页emp5.htm中,名字为Recordset1,设置其属性,方法同第三种,此处略。
第二步:定义三个全局变量和编写Recordset1的ondatasetcomplete(数据设置完成时)脚本。
Dim gCurrentPageNumber //当前页号
Dim gMaxPageNumber //最大页数
Dim gRecordsPerPage //每页显示记录数
gRecordsPerPage = 5 // 设置每页显示记录数为5条记录。
Function Recordset1_ondatasetcomplete()
totalRecordCount = Recordset1.getCount() //总的记录条数
gMaxPageNumber = Int(totalRecordCount / gRecordsPerPage) //获得最大页数
If (totalRecordCount Mod gRecordsPerPage) > 0 then
gMaxPageNumber = gMaxPageNumber + 1
End If
End Function
第三步:创建翻页导航按钮。
Function btnFirst_onclick() ’ 翻到首页
gCurrentPageNumber = 1
DisplayData()
End Function
Function btnPrevious_onclick() ’ 翻到上一页
if gCurrentPageNumber > 1 Then
gCurrentPageNumber = gCurrentPageNumber - 1
DisplayData()
End If
End Function
Function btnNext_onclick() ’ 翻到下一页
if gCurrentPageNumber < gMaxPageNumber Then
gCurrentPageNumber = gCurrentPageNumber + 1
DisplayData()
End If
End Function
Function btnLast_onclick() ’翻到末页
gCurrentPageNumber = gMaxPageNumber
DisplayData()
End Function
第四步:编写显示每一页的函数。其中使用了许多DHTML的属性和方法,请读者自行参考相关书籍。
Sub DisplayData()
startRecord = ((gCurrentPageNumber - 1) * gRecordsPerPage) + 1 //计算每一页开始显示的记录号数(位置,第几条)
rowCtr = 1
lblPageNumber.innerHTML = gCurrentPageNumber & "/" & gMaxPageNumber
For recordPtr = startRecord To (startRecord + gRecordsPerPage - 1) //循环显示一页的各条记录
If recordPtr > 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("emp ID")
empLName = Recordset1.fields.getValue("first name")
empFName = Recordset1.fields.getValue("last name")
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
End If
rowCtr = rowCtr + 1
Next
End Sub
另外,我们还需要在window对象的onload事件中编写如下脚本:
For rowCtr = 1 to gRecordsPerPage
Table1.insertRow(rowCtr) ’ 插一新列
For cellCtr = 0 to 3
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事件。
Function Recordset1_ondatasetcomplete()
recordsPerPage = 5
empList.setRecordsPerPage(recordsPerPage)//设置网页对象每页记录条数属性为5
totalRecordCount = Recordset1.getCount()//获得记录集的总条数
mpn = Int(totalRecordCount / recordsPerPage) //计算出mpn为总页数
If (totalRecordCount Mod recordsPerPage) > 0 then
mpn = mpn + 1
End If
empList.setMaxPageNumber(mpn)
End Function
第四步:拖四个button控件到网页中,编写翻页控制脚本。我们主要是通过改变网页对象的CurrentPageNumber属性的值来实现翻页。
Function btnFirst_onclick()’ 翻到首页
empList.setCurrentPageNumber(1)
End Function
Function btnPrevious_onclick()’ 翻到上一页
cpn = empList.getCurrentPageNumber()
if cpn > 1 Then
empList.setCurrentPageNumber(cpn - 1)
End If
End Function
Function btnNext_onclick()’ 翻到下一页
cpn = empList.getCurrentPageNumber()
if cpn < empList.getMaxPageNumber() then
empList.setCurrentPageNumber(cpn + 1)
End If
End Function
Function btnLast_onclick() ’ 翻到末页
empList.setCurrentPageNumber( empList.getMaxPageNumber() )
End Function
为保证首次进入该页时,显示的是第一页,我们还得编写该网页对象的onEnter事件。
Function empList_onEnter()
If empList.firstEntered Then
empList.setCurrentPageNumber(1)
End If
End Function
第五步:编写显示每一页的脚本。
<HR><TABLE BORDER=0><TR>//显示表头
<TH ALIGN="left" WIDTH=35></TH>
<TH ALIGN="left" WIDTH=150>Emp ID</TH>
<TH ALIGN="left" WIDTH=200>Last Name</TH>
<TH ALIGN="left" WIDTH=200>First Name</TH></TR>
<%
pageNumber = empList.getCurrentPageNumber()//计算翻页所需的各种参数,同DHTML法二
recordsPerPage = empList.getRecordsPerPage()
startRecord = ((pageNumber - 1) * recordsPerPage) + 1
lastRecord = Recordset1.getCount()
For recordPtr = startRecord To (startRecord + recordsPerPage - 1)%>
<%If Recordset1.EOF = True Then%>
<TR>
<TD> </TD>
<TD> </TD>
<TD> </TD>
<TD> </TD>
</TR>
<%Else%>
<%Recordset1.moveAbsolute(recordPtr)%>
<TR>
<% If recordPtr <= lastRecord Then %>
<TD><%=recordptr%></TD>
<%Else%>
<TD> </TD>
<% End If %>
<TD><%=Recordset1.fields.getValue("emp ID")%></TD>
<TD><%=Recordset1.fields.getValue("last name")%></TD>
<TD><%=Recordset1.fields.getValue("first name")%></TD>
</TR>
<%End If%>
<%Next%>
</TABLE><HR>
第七种:Data Environment Object Model(数据环境对象模型)法
Data Environment对象模型把ADO对象模型及它的对象----“Connection”,“Command”,“Recordset”,“Field”以及“Parameter”对象----抽象到一个更加容易的表单中。Data Environment Object Model把命令显露为方法。用户可以调用这些方法,这些方法会执行这些命令并返回所得到的记录集。关于DEOM对象模型详细资料请参考相关书籍。我们来看下面网页emp7.asp的例子:
第一步:在VI6.0的“project Explorer”窗口中的工程项目上右击鼠标并从弹出式菜单选择“Add Data Connection”。根据VI给出的导航提示建立一个到数据库的连接之后,用户就添加了一个实现从ASP应用程序访问数据库的数据命令。同时,你将会在“Project Explorer”窗口中的global.asa文件下方看到一个“Data Environment”对象。
第二步:右击“Data Environment”对象然后从弹出式菜单中选择“Add Data Command”选项,添加一个数据命令Command1。根据VI6.0的导航提示,你可以在Command1 Properties弹出窗口的Genetal页中选SQL Statement,输入:select * from emp。按OK返回。
第三步:你创建了这个数据命令后,就已经为该Data Environment对象创建了一个方法,然后就可以从脚本中调用这个方法,而且该方法将会给用户返回一个记录集。
thisPage.createDE() //在SOM模式下,thisPage表示当前网页对象,createDE()方法创建了DE对象。
DE.Command1//执行DE对象的命令,后面可代参数,做有条件查询时很有用。
Set rs=DE.rsCommand1//DE.rscommand1使得rs对象完全等同于一个ADO的Recordset对象。
第四步:因为rs为ADO对象,所以,以下的实现翻页代码完全参照以上介绍的几种方法,此处略过。
其它还有如FrontPage2000的数据库导航中实现的方法等,因与本主题无关,此处略。
综上所述,前面介绍的每种方法都包含了很多新的技术,由于篇幅的关系,无法深入。本文只是想通过实现翻页这一具体的例子来介绍ASP网页编程的多种方法;让大家亲身体验一下VI6.0在编制网页中的强大功能;了解和熟悉微软在网页编程中提出的ADO、DHTML、DTC控件、SOM对象模型和DEOM对象模型的使用方法;希望能给大家在编制网页时提供更多的选择和参考