對于Web開發(fā)人員來說,生成靜態(tài)文件這個概念并不陌生。
對于Web開發(fā)來說,如何能避免客戶端訪問時不停的查詢數(shù)據(jù)庫?現(xiàn)在比較常用的有兩種方法,一種是使用緩存技術,將查詢出來的結果緩存至緩存框架中,以后當有用戶訪問時,直接通過緩存框架讀取數(shù)據(jù),這樣就避免了大量用戶同時訪問數(shù)據(jù)庫。另一種方法就是使用靜態(tài)生成技術,靜態(tài)生成技術常見的做法有兩種,一種是通過模板文件(模板文件中保存好前期定義好的變量,后臺通過數(shù)據(jù)加載對相應變量進行替換,然后再對替換完的數(shù)據(jù)進行生成靜態(tài)文件);一種是直接訪問Web地址,通過Http協(xié)議讀取網(wǎng)頁內容,然后再將內容生成相應的靜態(tài)文件。
對于像Java、.NET這些語言來說,外界都會給出相應的緩存框架,Java的緩存框架就更多了。但對Asp這樣的低端語言來說呢,只能通過用靜態(tài)生成技術來實現(xiàn)減少用戶大量的數(shù)據(jù)訪問,本文就結合自己準備要做的項目來談談Asp如何實現(xiàn)靜態(tài)生成。
Asp靜態(tài)生成技術的原理上面我已經(jīng)講過了,兩種做法最終都會通過讀取HTML文件(或動態(tài)或模板文件)來生成相應的靜態(tài)頁面。
方法一:通過模板文件來實現(xiàn)靜態(tài)化:
如題所示,通過模板文件實現(xiàn)靜態(tài)化,當然首先要創(chuà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>
請注意:我使用<#article:title#>做為變量,這樣的話,在進行文件替換的時候我就會查詢包含此變量的內容進行替換。
模板文件創(chuàng)建后,就是靜態(tài)化處理的核心部分,代碼如下:
<%
filename="Template.htm"
'tt.txt是模板文件
Dim objFSO,objCountFile,FiletempData
' 創(chuàng)建FSO文件對象
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#>","杰之藍")
FSOFileRead = replace(FSOFileRead,"<#article:title#>","杰之藍Asp靜態(tài)生成技術")
FSOFileRead = replace(FSOFileRead,"<#article:content#>","杰之藍Asp靜態(tà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
%>
請注意:<#PageTitle#>,<#article:title#>,<#article:content#>這三個變量為我在模板頁面中使用,此處將這些變量變成真實的值;對文件替換完成后,就對進行文件的創(chuàng)建,此處要求您的服務器可以使用FSO對象,我將文件生成后放在于模板文件同級的目錄下,當然如果你要創(chuàng)建在別的目錄下的時候你就要將創(chuàng)建文件夾那個注釋放開,然后添加上你自己的目錄;文件創(chuàng)建完成后一定記得關閉FSO對象。
方法二:讀取Url地址生成靜態(tài)文件
這種方法就像上面所說的是通過讀取URL地址,然后提取URL地址中的內容,最后再生成相應的靜態(tài)文件。
下面來看具體代碼:
<%
'///////////////////////////////////////////////////////////////////////////////
'// ASP生成靜態(tài)
'// 作 者: 杰之藍
'// 版權所有: www.52cfml.com
'// 技術支持: www.52cfml.com
'// 開始時間: 2010-07-16
'// 最后修改:
'// 備 注:
'///////////////////////////////////////////////////////////////////////////////
response.write "<textarea cols=""79"" rows=""30"">"&GetHttpPage(("
'函數(shù)名:GetHttpPage
'作 用:獲取網(wǎng)頁源碼
'參 數(shù):HttpUrl ------網(wǎng)頁地址,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)
' 判斷是否塊超時
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)文件,只不過每種方法的側重點不同,有需要的朋友可以根據(jù)自己的需要選擇相應的方法,當然真實環(huán)境下必須有數(shù)據(jù)庫的支持,由于本文只是例子,就沒有結合數(shù)據(jù)庫實現(xiàn),有需要的朋友可以根據(jù)自己的需要建立相應的數(shù)據(jù)庫,對于方法一來說,模板變量的命名必須是前期定義好的。
希望對朋友們有所幫助。
作者博客:www.52cfml.com