|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
asp可以使用微软的activeX使得网页功能无比强大,不过安全性也较差,而且是基于的windows服务器,所以性能稳定性也一般分页|客户端|数据|数据库|显现|实行
绪论
在ASP程序使用中常常有一个义务就是在一个分页格局中显现数据库的查询了局。好比,当处置大批的纪录内容时,应当一次只显现10个项目,如许就会使会见者利用这些信息更简单些。收集上已有很多文章树模了多种对数据库查询了局举行分页的办法,个中较好的文章包含:
利用存储历程对数据库纪录举行分页
数据库分页样本代码
利用GetRows对纪录举行分页
可是一切这些文章先容的办法都是在服务器端举行分页处置的。举例来讲,假设有30条数据库纪录,我们但愿一次显现10笔记录。当用户哀求第一页数据时,ASP页面就提取前10笔记录并将它们发送给客户。当用户已作好筹办能够阅览上面10笔记录时,他就点击一个链接,这时候ASP页面就被从头装载,经由过程查询字符串传送出去一个新的页面值,ASP页面将掏出第11条到20笔记录,并将它们发给用户。
本文中我们将把这全部处置历程移植到客户端。当用户联机检察数据时,这30个纪录将全体以客户端JavaScript数组的情势发送到客户机上。别的,附加的客户端JavaScript代码卖力显现第1到第10笔记录,而且链接到前面大概后面的纪录集。当点击这些链接时,将实行客户端JavaScript代码,新的数据会显现出来。因为这些都是在客户端产生的,因而只要在页面第一次被装载时才必要与Web服务器接洽,从而省却服务器与客户端间的数据传送损耗,无疑年夜年夜地进步了使用程序的功能。
所必要的客户端剧本
要完成在客户端显现分页的数据库纪录,ASP页面应当天生甚么样的客户端剧本呢?好像后面所述,我们必要创立一个客户端数组。由于我们筹办在一个HTML表格中显现数据库纪录,那末就要创立一个HTML数组,大概用它来显现一个HTMLTABLE行(<tr><td>DatabaseValue</td></tr>)。这个数组中将包括一切我们但愿同意用户翻阅的数据库元素。
我们还必要一个客户真个JavaScript函数以显现这些数组值的子集。利用这个函数,我们能够显现前N个纪录;当用户点击一个链接时,就能够显现前面(或后面)N个纪录。也就是说,这个函数卖力客户端分页。
最初,我们还必要一些办法在不更新页面的情形上去静态改动一个HTML页面的显现。这能够经由过程DHTML(静态HTML)来完成。要完成这个目标,我们必要在聚积一切输入的中央创立一个HTMLDIV标志,然后利用客户端JavaScript代码在这个DIV标志中静态修正内容。关于利用DHTML的更多信息,请浏览静态HTML进门及跨扫瞄器DHTML教程.
创立一个分页类
要记着,这里举例的全部使用程序只包含一个ASP页面。当这个ASP页面被会见时,它将创立实行纪录分页必要的一切客户端JavaScript代码。为简化这个历程,我创立了一个VBScript类来处置这个功效。利用这个类的时分,开辟职员只需将他但愿在会见者的Web扫瞄器长进行分页的纪录集传送出去便可。关于类的利用,请浏览在VBScript中利用类。
我将这个类定名为dhtmlGetRows,它包括两个属性和一个办法。两个属性是:
1、RecsPerPage:断定每页显现几个纪录。
2、THString:经由过程一个HTML表格显现这个举行了分页的了局;这个属性同意你为表格的题目指定一个字串。
单一的办法是GenerateHTML(RecordsetObject),它为分页使用程序前往完全的HTML:客户端JavaScript代码和必要的DIV标志。这个办法只必要一个参数RecordsetObject,它应当是一个纪录集工具,个中添补了你但愿在一个分页格局中显现的数据库数据。
这个类的代码相称长,而且年夜部分代码都只是前往客户真个JavaScript代码。上面是类的代码:
<%
ClassdhtmlGetRows
*******PRIVATEMEMBERVARIABLES**********
PrivateiRecsPerPage
PrivatestrTHString
*******************************************
************InitializeEvent*************
PrivateSubClass_Initialize()
iRecsPerPage=10assignadefaultvalue
EndSub
*******************************************
************PROPERTYLET/GET*************
PublicPropertyLetTHString(strValue)
Replaceallapostropheswith
strTHString=Replace(strValue,"","")
EndProperty
PublicPropertyGetTHString()
THString=strTHString
EndProperty
PublicPropertyLetRecsPerPage(iValue)
IfiValue>0andIsNumeric(iValue)then
iRecsPerPage=CInt(iValue)
EndIf
EndProperty
PublicPropertyGetRecsPerPage()
RecsPerPage=iRecsPerPage
EndProperty
*******************************************
****************METHODS******************
PublicFunctionGenerateHTML(objRS)
Beginbygettinganarrayofthedata
DimaValues
aValues=objRS.GetRows()
Findthevalueofrowsandcolumns
DimiCols,iRows
iCols=UBound(aValues,1)
iRows=UBound(aValues,2)
DimstrOutput
Displaytheinitialscriptblock
strOutput="<scriptlanguage=""javascript"">"&vbCrLf&_
"vartableRow=newArray("&iRows&");"&vbCrLf&vbCrLf
DimiLoop,iColLoop,strTmp
ForiLoop=0toiRows
strOutput=strOutput&"tableRow["&iLoop&"]=<tr>"
ForiColLoop=0toiCols
Fixapostrophes
strTmp=Replace(aValues(iColLoop,iLoop),"","")
Removecarraigereturns
strTmp=Replace(strTmp,vbCrLf,"")
strOutput=strOutput&"<td>"&strTmp&"</td>"
NextiColLoop
strOutput=strOutput&"</tr>;"&vbCrLf
NextiLoop
Initglobalvaraiblesandfindoutwhatbrowsertheuserisusing
strOutput=strOutput&vbCrLf&vbCrLf&"varfirst=0;"&vbCrLf&_
"varlast="&iRecsPerPage&";"&vbCrLf&_
"varmynav;"&vbCrLf&"if(navigator.appName==""Netscape"")"&_
vbCrLf&vbTab&"mynav=""NS"";"&vbCrLf&_
"if(navigator.appName==""MicrosoftInternetExplorer"")"&_
vbCrLf&vbTab&"mynav=""IE"";"&vbCrLf&_
vbCrLf&"</script>"&vbCrLf&vbCrLf
NowdisplaytheHTMLtable
strOutput=strOutput&vbCrLf&"<divid=""grid""></div>"&vbCrLf&_
vbCrLf&vbCrLf&"<scriptlanguage=""javascript"">"&vbCrLf
Writethenavfunction
strOutput=strOutput&"functionnav(iVal){"&vbCrLf&_
"//dowewanttomoveforwardorbackwards?"&vbCrLf&_
"if(iVal==1){"&vbCrLf&vbTab&"first+="&_
iRecsPerPage&";"&vbCrLf&"last+="&iRecsPerPage&_
vbCrLf&"}"&vbCrLf&"elseif(iVal==-1){"&vbCrLf&vbTab&_
"first-="&iRecsPerPage&";"&vbCrLf&vbTab&"last-="&_
iRecsPerPage&";"&vbCrLf&"}"&vbCrLf&_
vbCrLf&vbCrLf&"vartxt=;"&vbCrLf&_
"txt+=<tableborder=""1"">;"&vbCrLf
DoweneedtoaddaTHstring?
IfLen(strTHString)>0then
strOutput=strOutput&"txt+=<tr>"&strTHString&"</tr>;"&vbCrLf
EndIf
strOutput=strOutput&"for(variLoop=first;iLoop<last;iLoop++)"&vbCrLf&_
vbTab&"if(iLoop<="&iRows&")txt+=tableRow[iLoop];"&vbCrLf&_
"txt+=</table>;"&vbCrLf&vbCrLf
Now,shownext/prevlinksifapplicable
strOutput=strOutput&"if(first>0)//showprevlink"&vbCrLf&_
vbTab&"txt+=<ahref=""javascript:nav(-1);"">Prev"&_
iRecsPerPage&"</a>;"&vbCrLf&vbCrLf&_
"if(last<="&iRows&")//shownextlink"&vbCrLf&vbTab&_
"txt+=<ahref=""javascript:nav(1);"">Next"&_
iRecsPerPage&"</a>;"&vbCrLf&vbCrLf
WriteoutthenewHTMLcontenttotheDIVtag
strOutput=strOutput&"//writeoutthetheDIVtagdependingonbrowser..."&vbCrLf&_
"if(mynav==""NS""){"&vbCrLf&vbTab&_
"document.layers[grid].document.write(txt);"&vbCrLf&vbTab&_
"document.close();"&vbCrLf&"}"&vbCrLf&vbCrLf&_
"if(mynav==""IE"")"&vbCrLf&vbTab&_
"document.all[grid].innerHTML=txt;"&vbCrLf&vbCrLf&_
"}"&vbCrLf&vbCrLf
strOutput=strOutput&"nav(0);"&vbCrLf&"</script>"
GenerateHTML=strOutput
EndFunction
*******************************************
EndClass
%>
在停止之前,我想要疾速地注释一下如何在一个ASP页面中利用这个类。因为这个类只包括一个办法,因而利用这个类相称复杂。你所必要做的就是创立并添补一个纪录集工具,然后创立一个类的例示,并利用Response.Write输入objClassInstance.GenerateHTML(objRS)的值。
<!--#includefile="dhtmlGetRows.class.asp"-->
<%
CreateandpopulateaRecordset
DimobjRS,objConn,strSQL
SetobjConn=Server.CreateObject("ADODB.Connection")
objConn.Open"DSN=MyDSN"
strSQL="SELECTTOP25ViewCount,Description"&_
"FROMtblFAQORDERBYViewCountDESC"
SetobjRS=objConn.Execute(strSQL)
CreateaninstanceofthedhtmlGetRowsclass
DimobjPagedResults
SetobjPagedResults=newdhtmlGetRows
objPagedResults.THString="<th>Views</th><th>FAQQuestion</th>"
Response.WriteobjPagedResults.GenerateHTML(objRS)
Cleanup...
SetobjPagedResults=Nothing
objRS.Close
SetobjRS=Nothing
objConn.Close
SetobjConn=Nothing
%>
以上的代码片断假定dhtmlGetRows类能够在一个服务器端包括文件dhtmlGetRows.class.asp中利用。
asp,你就只能等着微软给你解决,它不乐意你就只好悲催。而且asp跑在windows服务器上,windows服务器跟linux比起来简直弱爆了! |
|