详谈asp生成静态页方法
生成靜態頁的好處不用說,當今大型網站,為緩解服務器端的壓力許的的頁面都改用了靜態的頁面,并利用AJAX技術動態地更新其中的部分內容,如廣告等。
一個簡單的不用模板可以直接生成HTML靜態頁的方法.
如一個正常的index.asp動態頁面,
新建一個文件 makeasp2html.asp
<form method="post" action="">
<textarea name="asp2html" style="display:none"><!--#include file="index.asp"--></textarea>
<input type="submit" value="生成html頁"/>
</form>
<%
If request.Form("asp2html")<>"" then
filename="index.html"
set fso = Server.CreateObject("Scripting.FileSystemObject")
set fout = fso.CreateTextFile(server.mappath(""&filename&""))
fout.write request.form("asp2html")
fout.close
set fout=nothing
set fso=nothing
end if
%>
這樣index.html文件就生成了,連模板都用不著,只要服務器要支持FSO,將正常情況下使用的ASP文件讀取到textarea里就可以了。
------------------------------------------------------------------------------------------------------
細說一下常用的幾種生成HTML的方法:
生成HTML方法主要步驟只有兩個:
一、獲取要生成的html文件的內容
二、將獲取的html文件內容保存為html文件
我在這里主要說明的只是第一步:如何獲取要生成的html文件的內容:
目前常用獲取html文件的內容的方法有幾下幾種:
1、
CODE: [Copy to clipboard] str=" 內容 "
str=str&" 內容 數據庫讀取內容.... ....."這種方法與是在腳本內寫要生成的html內容,不太方便預覽生成頁面的內容,無法可視化布局頁面,更改html模板時會更加復雜。
用這種方法的人很多,但我感覺這種方法是最不方便的。
2、
制作單獨的HTML模板頁,動態的內容用特定的字符作為標記(如:有人用$title$標記為網頁標題),用ADODB.Stream或者Scripting.FileSystemObject將其模板內容載入,然后再用替換方法把原先定好的標記替換為動態內容(如:Replace(載入的模板內容,"$title$",rs("title" ) ) )。
3、
用XMLHTTP或serverXMLHTTP獲取動態頁所顯示的HTML內容,
CODE: [Copy to clipboard] 我常用的生成html文件的實例:
'weburl是要獲取的動態頁地址
'getHTTPPage(weburl)是獲取動態頁內容的函數
weburl="http://"&Request.ServerVariables("SERVER_NAME")&"/contact.asp?id="&rs("id")&""‘指定動態頁地址
body=getHTTPPage(weburl)'用函數取到動態頁地址的內容此方法最大的好處就是不用費力氣專門去寫靜態的模板頁面,只是將原來就有的動態頁面轉換為HTML靜態頁面,但生成速度不是太快。
我常用的生成HTML的方法就是第3種:用XMLHTTP獲取動態頁生成的HTML內容,再用ADODB.Stream或者Scripting.FileSystemObject保存成html文件。
第二步是生成文件的方法:
ASP里常用的有用ADODB.Stream生成文件和Scripting.FileSystemObject生成文件兩種
1、
Scripting.FileSystemObject生成文件方法:
CODE: [Copy to clipboard] Set fso = CreateObject("Scripting.FileSystemObject")
File=Server.MapPath("要生成文件路徑和文件名.htm")
Set txt=fso.OpenTextFile(File,8,True)
data1="文件內容"用WriteLine方法生成文件
txt.WriteLine data1
data2="文件內容"'用Write方法生成文件
txt.Write data2
txt.Close
txt.fso2、
ADODB.Stream生成文件方法:
CODE: [Copy to clipboard] Dim objAdoStream
set objAdoStream = Server.createObject("ADODB.Stream")
objAdoStream.Type = 1
objAdoStream.Open()
objAdoStream.Write("文件內容")
objAdoStream.SaveToFile 要生成文件路徑和文件名.htm,2
[next]
objAdoStream.Close()再說一下我對HTML防采集卻不防搜索引擎蜘蛛的一些經驗:
我開發過幾個采集程序,也研究過很多采集程序代碼,所以對采集程序的原理還算是稍微有些了解。
先說一下采集原理:
采集程序的主要步驟如下:
一、獲取被采集的頁面的內容
二、從獲取代碼中提取所有用的數據
一、獲取被采集的頁面的內容
我目前所掌握的ASP常用獲取被采集的頁面的內容方法:
1、用serverXMLHTTP組件獲取數據
CODE: [Copy to clipboard] Function GetBody(weburl)
'創建對象
Dim ObjXMLHTTP
Set ObjXMLHTTP=Server.CreateObject("MSXML2.serverXMLHTTP")
'請求文件,以異步形式
ObjXMLHTTP.Open "GET",weburl,False
ObjXMLHTTP.send
While ObjXMLHTTP.readyState <> 4
ObjXMLHTTP.waitForResponse 1000
Wend
'得到結果
GetBody=ObjXMLHTTP.responseBody
'釋放對象
Set ObjXMLHTTP=Nothing
End Function
調用方法:
GetBody(文件的URLf地址) 2、或XMLHTTP組件獲取數據
CODE: [Copy to clipboard] Function GetBody(weburl)
'創建對象
Set Retrieval = CreateObject("Microsoft.XMLHTTP")
With Retrieval
.Open "Get", weburl, False, "", ""
.Send
GetBody = .ResponseBody
End With
'釋放對象
Set Retrieval = Nothing
End Function
調用方法:
GetBody(文件的URLf地址) 這樣獲取的數據內容還需要進行編碼轉換才可以使用
CODE: [Copy to clipboard] 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
調用方法:BytesToBstr(要轉換的數據,編碼)'編碼常用為GB2312和UTF-8二、從獲取代碼中提取所有用的數據
目前我掌握的方法有:
1、用ASP內置的MID函數截取需要的數據
CODE: [Copy to clipboard] Function body(wstr,start,over)
start=Newstring(wstr,start)
'設置需要處理的數據的唯一的開始標記
over=Newstring(wstr,over)
'和start相對應的就是需要處理的數據的唯一的結束標記
body=mid(wstr,start,over-start)
'設置顯示頁面的范圍
End Function
調用方法:body(被采集的頁面的內容,開始標記,結束標記)2、用正則獲取需要的數據
CODE: [Copy to clipboard] Function body(wstr,start,over)
Set xiaoqi = New Regexp'設置配置對象
xiaoqi.IgnoreCase = True'忽略大小寫
xiaoqi.Global = True'設置為全文搜索
xiaoqi.Pattern = "”&start&“.+?”&over&“"'正則表達式
Set Matches =xiaoqi.Execute(wstr)'開始執行配置
[next]
set xiaoqi=nothing
body=""
For Each Match in Matches
body=body&Match.Value '循環匹配
Next
End Function
調用方法:body(被采集的頁面的內容,開始標記,結束標記)采集程序祥細思路:
1、取得網站的分頁列表頁的每頁地址
目前絕大部分動態網站的分頁地址都有規則,如:
動態頁
第一頁:index.asp?page=1
第二頁:index.asp?page=2
第三頁:index.asp?page=3
.....
靜態頁
第一頁:page_1.htm
第二頁:page_2.htm
第三頁:page_3.htm
.....
取得網站的分頁列表頁的每頁地址,只需要用變量替代每頁地址的變化的字符即可如:page_<%="&page&"%>.htm
2、獲取被采集網站的分頁列表頁內容
3、從分頁列表代碼中提取被采集的內容頁面的URL連接地址
絕大部分分頁頁面里的內容頁連接也有固定規則,如:
連接1
連接2
連接3
用以下代碼就可以獲得一個URL連接集合
CODE: [Copy to clipboard] Set xiaoqi = New Regexp
xiaoqi.IgnoreCase = True
xiaoqi.Global = True
xiaoqi.Pattern = ””“.+?”““
Set Matches =xiaoqi.Execute(頁面列表內容)
set xiaoqi=nothing
url=""
For Each Match in Matches
url=url&Match.Value
Next4、取得被采集的內容頁面內容,根據”提取標記“從被采集的內容頁面分別截取要取得的數據
因為是動態生成的頁面,大多數內容頁面內都有相同的html標記,我們可以根據這些有規則的標記提取需要的各個部分的內容。
如:
每個頁面都有網頁標題,用我上面寫的MID截取函數就可以獲得之間的值,也可以用正則表達式來獲得。
例:body("","")
介紹完采集器的祥細原理后,就開始說一下防采集的策略。
目前防采集的方法有很多種,先介紹一下常見防采集策略方法和它的弊端及采集對策:
一、判斷一個IP在一定時間內對本站頁面的訪問次數,如果明顯超過了正常人瀏覽速度,就拒絕此IP訪問
弊端:
1、此方法只適用于動態頁面,如:asp"jsp"php等...靜態頁面無法判斷某個IP一定時間訪問本站頁面的次數
2、此方法會嚴重影響搜索引擎蜘蛛對其收錄,因為搜索引擎蜘蛛收錄時,瀏覽速度都會比較快而且是多線程。此方法也會拒絕搜索引擎蜘蛛收錄站內文件
采集對策:只能放慢采集速度,或者不采
建議:做個搜索引擎蜘蛛的IP庫,只允許搜索引擎蜘蛛快速瀏覽站內內容。搜索引擎蜘蛛的IP庫的收集,也不太容易,一個搜索引擎蜘蛛,也不一定只有一個固定的IP地址。
評論:此方法對防采集比較有效,但卻會影響搜索引擎對其收錄。
二、用javascript加密內容頁面
弊端:此方法適用于靜態頁面,但會嚴重影響搜索引擎對其收錄情況,搜索引擎收到到的內容,也都是加密后的內容
采集對策:建議不采,如非要采,就把解密碼的JS腳本也采下來。
建議:目前沒有好的改良建議
評論:建議指望搜索引擎帶流量的站長不要使用此方法。
三、把內容頁面里的特定標記替換為”特定標記+隱藏版權文字“
弊端:此方法弊端不大,僅僅會增加一點點的頁面文件大小,但容易反采集
采集對策:把采集來的含有隱藏版權文字內容的版權文字替掉,或替換成自己的版權。
建議:目前沒有好的改良建議
評論:自己感覺實用價值不大,就算是加上隨機的隱藏文字,也等于畫蛇添足。
四、只允許用戶登陸后才可以瀏覽
弊端:此方法會嚴重影響搜索引擎蜘蛛對其收錄
采集對策:目前落伍已經有人發了對策文章 ,具體對策就看這個吧《ASP小偷程序如何利用XMLHTTP實現表單的提交以及cookies或session的發送》
建議:目前沒有好的改良建議
評論:建議指望搜索引擎帶流量的站長不要使用此方法。不過此方法防一般的采集程序,還是有點效果的。
五、用javascript、vbscript腳本做分頁
弊端:影響搜索引擎對其收錄
采集對策:分析javascript、vbscript腳本,找出其分頁規則,自己做個對應此站的分頁集合頁即可。
[next]
建議:目前沒有好的改良建議
評論:感覺懂點腳本語言的人都能找出其分頁規則
六、只允許通過本站頁面連接查看,如:Request.ServerVariables("HTTP_REFERER")
弊端:影響搜索引擎對其收錄
采集對策:不知道能不能模擬網頁來源。。。。目前我沒有對應此方法的采集對策
建議:目前沒有好的改良建議
評論:建議指望搜索引擎帶流量的站長不要使用此方法。不過此方法防一般的采集程序,還是有點效果的。
從以上可以看出,目前常用的防采集方法,要么會對搜索引擎收錄有較大影響,要么防采集效果不好,起不到防采集的效果。那么,還有沒有一種有效防采集,而又不影響搜索引擎收錄的方法呢?那就請繼續往下看吧,精彩的地方馬上呈獻給大家。
下面就是我的防采集策略,防采集而又不防搜索引擎
從前面的我講的采集原理大家可以看出,絕大多數采集程序都是靠分析規則來進行采集的,如分析分頁文件名規則、分析頁面代碼規則。
一、分頁文件名規則防采集對策
大部分采集器都是靠分析分頁文件名規則,進行批量、多頁采集的。如果別人找不出你的分頁文件的文件名規則,那么別人就無法對你的網站進行批量多頁采集。
實現方法:
我認為用MD5加密分頁文件名是一個比較好的方法,說到這里,有人會說,你用MD5加密分頁文件名,別人根據此規則也可以模擬你的加密規則得到你的分頁文件名。
我要指出的是我們加密分頁文件名時,不要只加密文件名變化的部分
如果I代表分頁的頁碼,那么我們不要這樣加密
page_name=Md5(I,16)&".htm"
最好給要加密的頁碼上再跟進一個或多個字符,如:page_name=Md5(I&"任意一個或幾個字母",16)&".htm"
因為MD5是無法反解密的,別人看到的會頁字母是MD5加密后的結果,所以加人也無法知道你在 I 后面跟進的字母是什么,除非他用暴力破解MD5,不過不太現實。
二、頁面代碼規則防采集對策
如果說我們的內容頁面無代碼規則,那么別人就無法從你的代碼中提取他們所需要的一條條內容。
所以我們要的這一步做到防采集,就要使代碼無規則。
實現方法:
使對方需要提取的標記隨機化
1、定制多個網頁模板,每個網頁模板里的重要HTML標記不同,呈現頁面內容時,隨機選取網頁模板,有的頁面用CSS+DIV布局,有的頁面用table布局,此方法是麻煩了點,一個內容頁面,要多做幾個模板頁面,不過防采集本身就是一件很煩瑣的事情,多做一個模板,能起到防采集的作用,對很多人來說,都是值得的。
2、如果嫌上面的方法太麻煩,把網頁里的重要HTML標記隨機化,也可以。
做的網頁模板越多,html代碼越是隨機化,對方分析起內容代碼時,就越麻煩,對方針對你的網站專門寫采集策略時,難度就更大,在這個時候,絕大部分人,都會知難而退,因為這此人就是因為懶,才會采集別人網站數據嘛~~~再說一下,目前大部分人都是拿別人開發的采集程序去采集數據,自己開發采集程序去采集數據的人畢竟是少數。
還有些簡單的思路提供給大家:
1、把對數據采集者重要,而對搜索引擎不重要的內容用客戶端腳本顯示
2、把一頁數據,分為N個頁面顯示,也是加大采集難度的方法
3、用更深層的連接,因為目前大部分采集程序只能采集到網站內容的前3層,如果內容所在的連接層更深,也可以避免被采集。不過這樣可能會給客戶造成瀏覽上的不便。
如:
大多網站都是 首頁----內容索引分頁----內容頁
如果改成:
首頁----內容索引分頁----內容頁入口----內容頁
注:內容頁入口最好能加上自動轉入內容頁的代碼
CODE: [Copy to clipboard] <meta&NBSP;HTTP-EQUIV="REFRESH"&NBSP;CONTENT="6;URL=內容頁">其實,只要做好防采集的第一步(加密分頁文件名規則),防采集的效果就已經不錯了,還是建議兩條反采集方法同時使用,給采集者增加采集難度,使得他們知難頁退。
關于Adodb.Stream 的使用說明
組件:"Adodb.Stream"
有下列方法:
Cancel 方法
使用方法如下
Object.Cancel
說明:取消執行掛起的異步 Execute 或 Open 方法的調用。
Close 方法
使用方法如下
Object.Close
:關閉對像
CopyTo 方法
使用方法如下
Object.CopyTo(destStream,[CharNumber])
說明:將對像的數據復制,destStream指向要復制的對像,CharNumber為可選參數,指要復制的字節數,不選為全部復制。
Flush 方法
使用方法如下
Object.Flush
說明:
LoadFromFile 方法
使用方法如下
Object.LoadFromFile(FileName)
說明:將FileName指定的文件裝入對像中,參數FileName為指定的用戶名。
Open 方法
使用方法如下
Object.Open(Source,[Mode],[Options],[UserName],[Password])
說明:打開對像,
參數說明:Sourece 對像源,可不指定
Mode 指定打開模式,可不指定,可選參數如下:
adModeRead =1
adModeReadWrite =3
adModeRecursive =4194304
adModeShareDenyNone =16
adModeShareDenyRead =4
adModeShareDenyWrite =8
adModeShareExclusive =12
adModeUnknown =0
adModeWrite =2
Options 指定打開的選項,可不指定,可選參數如下:
adOpenStreamAsync =1
adOpenStreamFromRecord =4
adOpenStreamUnspecified=-1
UserName 指定用戶名,可不指定。
Password 指定用戶名的密碼
Read 方法
使用方法如下:
Object.Read(Numbytes)
說明:讀取指定長度的二進制內容。
參數說明:Numbytes指定的要讀取的找度,不指定則讀取全部。
ReadText 方法
使用方法如下:
Object.ReadText(NumChars)
說明:讀取指定長度的文本
參數說明:NumChars指定的要讀取的找度,不指定則讀取全部。
SaveToFile 方法
使用方法如下:
Object.SaveToFile(FileName,[Options])
說明:將對像的內容寫到FileName指定的文件中
參數說明:FileName指定的文件
Options 存取的選項,可不指定,可選參數如下:
adSaveCreateNotExist =1
adSaveCreateOverWrite =2
SetEOS 方法
使用方法如下:
Object.setEOS()
說明:
SkipLine 方法
使用方法如下:
Object.SkipLine()
說明:
Write 方法
使用方法如下:
Object.Write(Buffer)
說明:將指定的數據裝入對像中。
參數說明:Buffer 為指定的要寫入的內容。
WriteText 方法
使用方法如下:
Object.Write(Data,[Options])
說明:將指定的文本數據裝入對像中。
參數說明:Data 為指定的要寫入的內容。
Options 寫入的選項,可不指定,可選參數如下:
adWriteChar =0
adWriteLine =1
有下列屬性:
Charset
EOS 返回對像內數據是否為空。
LineSeparator 指定換行格式,可選參數有
adCR =13
adCRLF =-1
adLF =10
Mode 指定或返加模式。
Position 指定或返加對像內數據的當前指針。
Size 返回對像內數據的大小。
State 返加對像狀態是否打開。
Type 指定或返回的數據類型,可選參數為:
adTypeBinary =1
adTypeText =2
ASP+FSO+框架實現ASP批量生成HTML并分頁的方法
<!--#include file="conn.asp"-->'數據連接文件
<%
On Error Resume Next'容錯處理
Dim City'定義取得要生成頁面的城市
City=Request.Querystring("City")'獲取生成的城市酒店值從框架傳過來的在后面將介紹
HtmlStartName=Request.Querystring("HtmlStartName")'獲得生成htm文件名前綴
Dim sql'搜索字符串,這里我就直接打開表不用搜索變量了,搜索條件按自己寫就可以
sql="select * from Hotel where [City] = '" & City & "' "
Dim oRs'數據操作對象
Dim PageCounts'實現分頁生成必須得知呀有多少頁
Set oRs = Server.CreateObject("ADODB.Recordset")
oRs.Open Sql,oConn,1,1'找開酒店等于City變量的表
oRs.pagesize=10'十個記錄為一頁
PageCounts=oRs.pagecount'得出要生成多少個頁面,循環生成使用
Dim fs'定義fso文件對象
Dim folders'存放生成靜態頁的文件夾名稱
Dim Filestart'定義生成htm文件前綴
Set fs=Server.CreateObject("Scripting.FileSystemObject")
Dim i
for i=1 to PageCounts'開始循環生成頁面,也就是分頁生成了
page=i
oRs.absolutepage=i'頁碼
rowcount=oRs.pagesize'當頁記錄數
folders=server.mappath("CityHtml")
if (fs.FolderExists(folders)) then'判斷文件夾是否存在
else
fs.CreateFolder(folders)'不存在則創建CityHtml文件夾
end if
if i=1 then
Filestart=HtmlStartName'如果為第一頁則定義文件名為傳值名.例如beijing則為beijing.htm
else
Filestart=HtmlStartName&i'如果第二頁則為beijing+1例如有兩頁也就是i等于2則為 beijing2.htm如此類推...(.htm后綴就在后面加上)
end if
Dim files'定義生成文本文件名稱變量
Dim filez'定義文件路徑名稱變量
files=Filestart&".txt"'本文件名稱
filez=folders&"""&"files'文本文件路徑
'冊除文件
Dim checkfile'檢查文本文件是否已經存在,是則刪除
checkfile=server.mappath("CityHtml""&Filestart&".htm")'檢查htm文件是否已經存在,是則刪除
if (fs.FileExists(checkfile)) then'檢查htm文件是否已經存在,是則刪除
Dim df'定義文件對象*刪除文件使用*
Set df=fs.GetFile(checkfile)'定義要冊除的文件
df.delete'冊除文件
end if'判斷結束
Dim ts'定義寫入文件對象
set ts = fs.createtextfile(filez,true) '開啟寫入文件內容**我在正文只簡單寫入酒店名稱和靜態數字分頁顯示**
ts.write("<Html><Head><Title>生成"&City&"城市酒店</Title>"&vbcrlf)'之后就是要生成的正文件內容了跟使用Response.write
ts.write("<META http-equiv=Content-Type content=text/html; charset=gb2312>"&vbcrlf)
ts.write("<meta name=keywords content="&city&"酒店>"&vbcrlf)
ts.write("<link href='/Style/style.css' rel='stylesheet' type='text/css'></head><body topmargin=0>"&vbcrlf)
ts.Write("<TABLE WIDTH=760 cellspacing=0 cellpadding=0 align=center>"&vbcrlf&_
"<TR><TD width='100%'>"&vbcrlf)
'分頁輸出開始
'數字分頁程序原理在這我就不多說了,不懂的朋友可在網上搜索一下
Dim page'當前頁
Dim Page2'數字分頁變量
Dim s'數字分頁變量
if page=1 then
ts.write (" [首 頁] [前一頁] ")
else
ts.write (" <a href="&HtmlStartName&".htm"&" class=blue>[首 頁]</a> <a href="&HtmlStartName&Replace(page-1,1,"")&".htm"&" class=blue>前一頁</a> ")
end if
page2=(page-(page mod 10))/10
if page2<1 then page2=0
for s=page2*10-1 to page2*10+10
if s>0 then
if s=cint(page) then
ts.write (" <font color='#000000'>["& s & "]</font>")
else
if s=1 then
ts.write (" <a href="&HtmlStartName&replace(s,1,"")&".htm"&" class=blue>["& s &"]</a>")
else
ts.write (" <a href="&HtmlStartName&s&".htm"&" class=blue>["& s &"]</a>")
end if
end if
if s=ors.pagecount then
exit for
end if
end if
next
if cint(page)=ors.pagecount then
ts.write (" [后一頁] [尾 頁]")
else
ts.write (" <a href="&HtmlStartName&page+1&".htm"&" class=blue>[后一頁]</a> <a href="&HtmlStartName&ors.pagecount&".htm"&" class=blue>[尾 頁]</a>")
end if
ts.write("</TD></TR>")
'分頁輸出結束
do while not ors.eof and rowcount>0 '輸出酒店名稱
ts.write("<TR><TD width='100%'>"&oRs.Fields("Chinese_Name")&"</TD></TR>"&vbcrlf)
oRs.movenext
rowcount=rowcount-1'當頁記錄數-1 loop
ts.write("</Table></body></html>"&vbcrlf)
ts.close
set ts=nothing '釋放對象
Dim EditFile'定義改寫文件變量
Set EditFile = fs.GetFile(filez)'設置改寫文件對象
EditFile.name= left(EditFile.name,len(EditFile.name)-4)&".htm" '改寫文本文件成htm
next'循環生成結束(分頁生成)
set EditFile=nothing '釋放對象
set fs=nothing'釋放對象
if err.number<>0 then '處理生成錯誤
Response.write (City&"更新時發生未知錯誤<A href=ToHtml.asp?City="&City&"&HtmlName="&HtmlStartName& ">重新更新</A>")
else
Response.Write(City&"酒店更新已完成 "&Now())
end if
%>
超長文章內容進行分頁并生成HTML文件
以下是程序源代碼:
<%
dim fname,fso,fout,htmlcode
dim htmlbody,htmlbody1,page_n
htmlbody=request.form("body")
page_n=len(htmlbody)-len(replace(htmlbody,"$",""))
’生成文件名的函數
function makefilename(fname)
fname = fname
fname = replace(fname,"-","")
fname = replace(fname," ","")
fname = replace(fname,":","")
fname = replace(fname,"PM","")
fname = replace(fname,"AM","")
fname = replace(fname,"上午","")
fname = replace(fname,"下午","")
makefilename=fname
end function
if request.querystring("action")="add" then
for i=0 to page_n
fname=makefilename(now())
if i=0 then
ppage=0
else
ppage=i-1
end if
if i=0 and page_n>i then
npage=i+1
else
npage=page_n
end if
shtml=split(htmlbody,"$")(i) & vbcrlf
shtml=shtml&"<br><a href="""&fname&"_"&ppage&".html"">上一頁</a> <a href="""&fname&"_"&npage&".html"">下一頁</a>"
Set fso = Server.CreateObject("Scripting.FileSystemObject")
Set fout = fso.CreateTextFile(Server.MapPath(fname&"_"&i&".html"))
fout.WriteLine shtml
fout.close
next
response.write"<SCRIPT language=JavaScript>alert(’成功生成"&page_n+1&"個HTML頁’);this.location.href=’javascript:history.back();’</SCRIPT>"
end if
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>阿里西西_超長文件分頁并生成HTML文件簡單示例</title>
</head>
<body>
<form name="form1" method="post" action="?action=add">
文章內容:
<br>
<textarea name="body" cols="60" rows="8">
第一頁內容
$
第二頁內容
$
第三頁內容</textarea>
<br>
<input type="submit" name="Submit" value="提交">
</form>
</body>
</html>
SHTML和HTML的區別,如果用一句話來解釋就是:SHTML 不是HTML而是一種服務器 API,shtml是服務器動態產成的html. 雖然兩者都是超文本格式,但shtml是一種用于SSI技術的文件。 也就是Server Side Include--SSI 服務器端包含指令。 如果Web Server有SSI功能的話(大多數(尤其是基于Unix平臺)的WEB服務器如Netscape Enterprise Server等均支持SSI命令)。 會對shtml文件特殊招待。 先掃一次shtml文件看沒有特殊的SSI指令現在。 有就按Web Server設定規則解釋SSI指令。 解釋完后跟一般html一起掉去客戶端。shtml
使用SSI(Server Side Include)的html文件擴展名,SSI(Server Side Include),通常稱為"服務器端嵌入"或者叫"服務器端包含",是一種類似于ASP的基于服務器的網頁制作技術。SSI工作原理: 將內容發送到瀏覽器之前,可以使用“服務器端包含 (SSI)”指令將文本、圖形或應用程序信息包含到網頁中。例如,可以使用 SSI 包含時間/日期戳、版權聲明或供客戶填寫并返回的表單。對于在多個文件中重復出現的文本或圖形,使用包含文件是一種簡便的方法。將內容存入一個包含文件中即可,而不必將內容輸入所有文件。通過一個非常簡單的語句即可調用包含文件,此語句指示 Web 服務器將內容插入適當網頁。而且,使用包含文件時,對內容的所有更改只需在一個地方就能完成。因為包含 SSI 指令的文件要求特殊處理,所以必須為所有 SSI 文件賦予 SSI 文件擴展名。默認擴展名是 .stm、.shtm 和 .shtmlWeb 服務器在處理網頁的同時處理 SSI 指令。當 Web 服務器遇到 SSI 指令時,直接將包含文件的內容插入 HTML 網頁。如果“包含文件”中包含 SSI 指令,則同時插入此文件。除了用于包含文件的基本指令之外,還可以使用 SSI 指令插入文件的相關信息(如文件的大小)或者運行應用程序或 shell 命令。
網站維護常常碰到的一個問題是,網站的結構已經固定,卻為了更新一點內容而不得不重做一大批網頁。SSI提供了一種簡單、有效的方法來解決這一問題,它將一個網站的基本結構放在幾個簡單的HTML文件中(模板),以后我們要做的只是將文本傳到服務器,讓程序按照模板自動生成網頁,從而使管理大型網站變得容易。所以,利用SHTML格式的頁面目的和 ASP 差不多,但是因為是 API 所以運轉速度更快,效率更高,比ASP快,比HTML慢,但由于可以使用服務器端包含,因此使頁面更新容易(特別是批量更新banner,版權等),想象一下吧,你有一段 HTML,要在中間穿插一些特殊的服務端腳本,比如插入其他 HTML 段落,你選擇 ASP 來完成這個任務,但是如果任務更繁重,需要更多的時間,比如 5 s,這個時候你不用 ASP 而用 SHTML,或許處理時間就只用 4 s 了.
其實說了這么多,對駝而言,用shtml最直接的就是可以用include~~
轉載于:https://www.cnblogs.com/y0umer/archive/2011/03/08/3839348.html
總結
以上是生活随笔為你收集整理的详谈asp生成静态页方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 北京环球影城让带食物吗
- 下一篇: 机油多少钱一升啊?