對(duì)于Web開(kāi)發(fā)人員來(lái)說(shuō),生成靜態(tài)文件這個(gè)概念并不陌生。
對(duì)于Web開(kāi)發(fā)來(lái)說(shuō),如何能避免客戶端訪問(wèn)時(shí)不停的查詢數(shù)據(jù)庫(kù)?現(xiàn)在比較常用的有兩種方法,一種是使用緩存技術(shù),將查詢出來(lái)的結(jié)果緩存至緩存框架中,以后當(dāng)有用戶訪問(wèn)時(shí),直接通過(guò)緩存框架讀取數(shù)據(jù),這樣就避免了大量用戶同時(shí)訪問(wèn)數(shù)據(jù)庫(kù)。另一種方法就是使用靜態(tài)生成技術(shù),靜態(tài)生成技術(shù)常見(jiàn)的做法有兩種,一種是通過(guò)模板文件(模板文件中保存好前期定義好的變量,后臺(tái)通過(guò)數(shù)據(jù)加載對(duì)相應(yīng)變量進(jìn)行替換,然后再對(duì)替換完的數(shù)據(jù)進(jìn)行生成靜態(tài)文件);一種是直接訪問(wèn)Web地址,通過(guò)Http協(xié)議讀取網(wǎng)頁(yè)內(nèi)容,然后再將內(nèi)容生成相應(yīng)的靜態(tài)文件。
對(duì)于像Java、.NET這些語(yǔ)言來(lái)說(shuō),外界都會(huì)給出相應(yīng)的緩存框架,Java的緩存框架就更多了。但對(duì)Asp這樣的低端語(yǔ)言來(lái)說(shuō)呢,只能通過(guò)用靜態(tài)生成技術(shù)來(lái)實(shí)現(xiàn)減少用戶大量的數(shù)據(jù)訪問(wèn),本文就結(jié)合自己準(zhǔn)備要做的項(xiàng)目來(lái)談?wù)凙sp如何實(shí)現(xiàn)靜態(tài)生成。
Asp靜態(tài)生成技術(shù)的原理上面我已經(jīng)講過(guò)了,兩種做法最終都會(huì)通過(guò)讀取HTML文件(或動(dòng)態(tài)或模板文件)來(lái)生成相應(yīng)的靜態(tài)頁(yè)面。
方法一:通過(guò)模板文件來(lái)實(shí)現(xiàn)靜態(tài)化:
如題所示,通過(guò)模板文件實(shí)現(xiàn)靜態(tài)化,當(dāng)然首先要?jiǎng)?chuàng)建相應(yīng)的模板文件,我的模板文件如下template.htm:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "
<html xmlns="
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title><#PageTitle#></title>
</head>
<body>
<#article:title#>
<#article:content#>
</body>
</html>
請(qǐng)注意:我使用<#article:title#>做為變量,這樣的話,在進(jìn)行文件替換的時(shí)候我就會(huì)查詢包含此變量的內(nèi)容進(jìn)行替換。
模板文件創(chuàng)建后,就是靜態(tài)化處理的核心部分,代碼如下:
<%
filename="Template.htm"
'tt.txt是模板文件
Dim objFSO,objCountFile,FiletempData
' 創(chuàng)建FSO文件對(duì)象
Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
Set objCountFile = objFSO.OpenTextFile(Server.MapPath(filename),1,True)
FSOFileRead = objCountFile.ReadAll
'response.write FSOFileRead&"<br>"
FSOFileRead = replace(FSOFileRead,"<#PageTitle#>","杰之藍(lán)")
FSOFileRead = replace(FSOFileRead,"<#article:title#>","杰之藍(lán)Asp靜態(tài)生成技術(shù)")
FSOFileRead = replace(FSOFileRead,"<#article:content#>","杰之藍(lán)Asp靜態(tài)生成技術(shù)詳細(xì)內(nèi)容。")
Response.write FSOFileRead
objCountFile.Close
Set fso = Server.CreateObject("Scripting.FileSystemObject")
'fso.CreateFolder(Server.MapPath(folder)) 創(chuàng)建文件夾
Set fout = fso.CreateTextFile(Server.MapPath("aaa.html"))
fout.WriteLine FSOFileRead
fout.close
%>
請(qǐng)注意:<#PageTitle#>,<#article:title#>,<#article:content#>這三個(gè)變量為我在模板頁(yè)面中使用,此處將這些變量變成真實(shí)的值;對(duì)文件替換完成后,就對(duì)進(jìn)行文件的創(chuàng)建,此處要求您的服務(wù)器可以使用FSO對(duì)象,我將文件生成后放在于模板文件同級(jí)的目錄下,當(dāng)然如果你要?jiǎng)?chuàng)建在別的目錄下的時(shí)候你就要將創(chuàng)建文件夾那個(gè)注釋放開(kāi),然后添加上你自己的目錄;文件創(chuàng)建完成后一定記得關(guān)閉FSO對(duì)象。
方法二:讀取Url地址生成靜態(tài)文件
這種方法就像上面所說(shuō)的是通過(guò)讀取URL地址,然后提取URL地址中的內(nèi)容,最后再生成相應(yīng)的靜態(tài)文件。
下面來(lái)看具體代碼:
<%
'///////////////////////////////////////////////////////////////////////////////
'// ASP生成靜態(tài)
'// 作 者: 杰之藍(lán)
'// 版權(quán)所有: www.52cfml.com
'// 技術(shù)支持: www.52cfml.com
'// 開(kāi)始時(shí)間: 2010-07-16
'// 最后修改:
'// 備 注:
'///////////////////////////////////////////////////////////////////////////////
response.write "<textarea cols=""79"" rows=""30"">"&GetHttpPage(("
'函數(shù)名:GetHttpPage
'作 用:獲取網(wǎng)頁(yè)源碼
'參 數(shù):HttpUrl ------網(wǎng)頁(yè)地址,Cset 編碼
'===============================================
Function GetHttpPage(ByVal URL, ByVal Cset)
Dim BlockStartTime
On Error Resume Next
Dim Http
If IsNull(URL)=True Or Len(URL)<18 Or URL="$False$" Then
GetHttpPage="$False$"
Exit Function
End If
BlockStartTime = Timer()
Set Http=server.createobject("MSXML2.XMLHTTP")
Http.open "GET",URL,False
Http.Send()
'循環(huán)等待數(shù)據(jù)接收
Dim temp,BlockTimeout
BlockTimeout = 64
While (http.ReadyState <> 4)
' 判斷是否塊超時(shí)
temp = Timer() - BlockStartTime
Response.Write(Timer())
If (temp > BlockTimeout) Then
http.abort
Set Http=Nothing
GetHttpPage="$False$"
Exit function
Response.End
End If
http.waitForResponse 10000'等待1000毫秒
Wend
If Http.Readystate<>4 then
Set Http=Nothing
GetHttpPage="$False$"
Exit function
End If
GetHTTPPage=BytesToBstr(Http.responseBody,Cset)
Set Http=Nothing
If Err.number<>0 then
If IsNull(URL)=True Or Len(URL)<18 Or URL="$False$" Then
GetHttpPage="$False$"
Exit Function
End If
Set Http=Nothing
Err.Clear
End If
End Function
Function BytesToBstr(body,Cset)
dim objstream
set objstream = Server.CreateObject("adodb.stream")
objstream.Type = 1
objstream.Mode =3
objstream.Open
objstream.Write body
objstream.Position = 0
objstream.Type = 2
objstream.Charset = Cset
BytesToBstr = objstream.ReadText
objstream.Close
set objstream = nothing
End Function
%>
上述兩種方法都可以生成靜態(tài)文件,只不過(guò)每種方法的側(cè)重點(diǎn)不同,有需要的朋友可以根據(jù)自己的需要選擇相應(yīng)的方法,當(dāng)然真實(shí)環(huán)境下必須有數(shù)據(jù)庫(kù)的支持,由于本文只是例子,就沒(méi)有結(jié)合數(shù)據(jù)庫(kù)實(shí)現(xiàn),有需要的朋友可以根據(jù)自己的需要建立相應(yīng)的數(shù)據(jù)庫(kù),對(duì)于方法一來(lái)說(shuō),模板變量的命名必須是前期定義好的。
希望對(duì)朋友們有所幫助。
作者博客:www.52cfml.com