作為一名純“碼農(nóng)”,我已經(jīng)在鍵盤上敲敲打打了10余年,使用的語(yǔ)言主要是Java,但是,我對(duì)ASP依然情有獨(dú)鐘。當(dāng)年在學(xué)習(xí)了HTML后,接觸的第一門編程語(yǔ)言就是ASP,可以說(shuō),它是我的入門語(yǔ)言,我相信,它也是很多人的入門語(yǔ)言。
憑借著自學(xué)的ASP基礎(chǔ),我找到了第一份編程工作,而我所學(xué)的專業(yè)卻是化學(xué)工藝。工作閑暇,我“泡”在經(jīng)典論壇的后臺(tái)編程區(qū)學(xué)習(xí),后來(lái)當(dāng)上了版主。那段時(shí)間,絕對(duì)是經(jīng)典論壇的鼎盛時(shí)期,帖子很多,回復(fù)也很多。大家都熱情高漲,共同研究、共同學(xué)習(xí)、共同進(jìn)步,很多人的名字至今我記憶猶新,如布魯斯狼、帥青蛙、幻想曲等。對(duì)了,我的網(wǎng)名是蕭蕭小雨,相信很多人看過(guò)我撰寫的“讓你知道codepage的重要”一文。
ASP入門簡(jiǎn)單,但要想成為高手很難。在實(shí)際開(kāi)發(fā)中,你會(huì)碰到各種各樣的問(wèn)題,有很多需要掌握的知識(shí)點(diǎn),如文件上傳、文件管理、生成驗(yàn)證碼、發(fā)郵件、抓天氣預(yù)報(bào)、抓新聞、XML文件處理、Ajax使用、編碼問(wèn)題、存儲(chǔ)過(guò)程調(diào)用、Excel文件處理等。
論壇的帖子五花八門,回復(fù)的多了,你就會(huì)覺(jué)得,真的需要一本進(jìn)階或者總結(jié)的書(shū)籍。市面上的書(shū)籍只能讓你入門,后續(xù)的學(xué)習(xí)如果完全憑借自己研究、網(wǎng)絡(luò)搜索和網(wǎng)絡(luò)求助,那么所能獲取的知識(shí)將是零零散散、支離破碎的,無(wú)法構(gòu)成完整的知識(shí)體系。
于是,我在論壇發(fā)帖說(shuō),我想寫本ASP的書(shū)。有些人說(shuō):“小雨,支持你,我第一個(gè)買。”也有些人說(shuō):“這方面的書(shū)太多了,并且寫得都不錯(cuò),建議你還是放棄吧。”不管三七二十一,我還是動(dòng)筆了。充滿激情地寫了幾章基礎(chǔ)知識(shí)后,我寫不動(dòng)了,因?yàn)樘珱](méi)意思,寫完之后,我覺(jué)得它和別人寫的書(shū)沒(méi)啥兩樣。經(jīng)過(guò)一陣?yán)Щ蠛退伎贾螅覜Q定去掉入門知識(shí)的章節(jié),寫點(diǎn)有難度的。所以作為本書(shū)的讀者,你應(yīng)該已經(jīng)掌握了ASP的基本知識(shí),能夠獨(dú)立搭建運(yùn)行環(huán)境,能夠編寫簡(jiǎn)單的應(yīng)用程序,能夠處理簡(jiǎn)單的常見(jiàn)問(wèn)題。
最終,本書(shū)的章節(jié)結(jié)構(gòu)是這樣的:
第1章講解FSO文件管理。FSO的使用其實(shí)比較簡(jiǎn)單,放在第1章作為過(guò)渡。學(xué)習(xí)該章后,你可以熟練地進(jìn)行文件管理的相關(guān)操作及文本流的操作。
第2章講解字符與字節(jié)流轉(zhuǎn)換及Adodb.Stream對(duì)象的使用,為編碼轉(zhuǎn)換打下基礎(chǔ)。
第3章講解各種常見(jiàn)編碼、亂碼的由來(lái)、CodePage的使用和問(wèn)題舉例。學(xué)習(xí)該章后,你可以解決大部分的亂碼問(wèn)題,達(dá)到隨心所欲的地步。
第4章講解XMLDOM的使用,學(xué)習(xí)本章后,讀者進(jìn)行XML處理再無(wú)壓力。
第5章講解XMLHTTP和ServerXMLHTTP的使用,前者是Ajax技術(shù)的核心,后者是抓取網(wǎng)頁(yè)的利器。
第6章講解正則表達(dá)式的基礎(chǔ)知識(shí)及正則對(duì)象的使用。本章講解的仍然是基礎(chǔ)知識(shí),正則說(shuō)簡(jiǎn)單也簡(jiǎn)單,說(shuō)難也難,多寫多練才是王道。
第7章講解文件上傳與下載。該章從基礎(chǔ)原理講起,包括無(wú)組件上傳、組件上傳和上傳漏洞等。最后講解文件下載,包括緩存處理、分段下載等略難一點(diǎn)的知識(shí),需要讀者對(duì)HTTP知識(shí)略有了解。
第8章講解常用的AspJpeg圖像處理組件,包括大部分的功能講解,還包括GIF動(dòng)畫(huà)的一些知識(shí)。
第9章講解Email發(fā)送的知識(shí),包括Email基礎(chǔ)結(jié)構(gòu)、常見(jiàn)的發(fā)信組件的使用、附件的處理等知識(shí)。
我相信,本書(shū)已經(jīng)包括ASP常用的重點(diǎn)內(nèi)容。很抱歉,本書(shū)并沒(méi)有講ADO的使用,雖然它是一個(gè)重點(diǎn),但是每本書(shū)都會(huì)講它,所以大家可能已經(jīng)很熟悉了。而且深入講解ADO的話,就夠?qū)懸槐緯?shū)了,這樣的書(shū)已經(jīng)有了。
寫作的過(guò)程是痛苦的,因?yàn)樗且槐炯夹g(shù)書(shū)籍,我唯恐因?yàn)槲业臒o(wú)知或一知半解誤導(dǎo)了各位讀者。對(duì)每個(gè)模糊的知識(shí)點(diǎn),我都盡力搞清楚,對(duì)每個(gè)疑難問(wèn)題,我都盡力找到解決方案。我參考了很多書(shū)籍、文章、API文檔,如《精通正則表達(dá)式》《正則表達(dá)式經(jīng)典實(shí)例》、《HTTP權(quán)威指南》、MSDN等。我相信,一個(gè)普通的ASP程序員做不到這些,我就是要用我10年的技術(shù)功力來(lái)寫一本關(guān)于ASP的書(shū)籍,只為這一份執(zhí)著,這一個(gè)約定,也為了給妻子一個(gè)小小的回報(bào)。這本書(shū)耗費(fèi)了我大量的時(shí)間和精力,感謝我的妻子為我們這個(gè)小家做出的一切。
其實(shí),我最應(yīng)該感謝的是機(jī)械工業(yè)出版社的編輯,沒(méi)有他們對(duì)我的鼓勵(lì),沒(méi)有他們的幫助,就沒(méi)有這本書(shū)的面世。感謝他們所做的一切。
雖然我很努力,但是書(shū)中依然可能存在錯(cuò)誤、疏漏之處,敬請(qǐng)各位讀者不吝賜教。
王洪影2016年3月15日
前言
第1章 FSO文件管理 1
1.1 FSO簡(jiǎn)介 1
1.1.1 FSO的對(duì)象組成 1
1.1.2 創(chuàng)建FSO對(duì)象 2
1.2 驅(qū)動(dòng)器集合 2
1.3 驅(qū)動(dòng)器信息 3
1.4 文件夾集合 5
1.5 文件夾管理 6
1.5.1 文件夾屬性 7
1.5.2 文件夾操作 9
1.6 文件集合 14
1.7 文件管理 15
1.7.1 文件屬性 15
1.7.2 文件操作 17
1.7.3 操作文本流 19
1.8 其他實(shí)用方法 23
第2章 文本與二進(jìn)制數(shù)據(jù)處理 27
2.1 基礎(chǔ)知識(shí) 27
2.1.1 二進(jìn)制與十六進(jìn)制 27
2.1.2 文本數(shù)據(jù)與二進(jìn)制數(shù)據(jù)的區(qū)別 28
2.1.3 數(shù)據(jù)類型與內(nèi)存存儲(chǔ)的關(guān)系 28
2.1.4 VBScript中的位運(yùn)算 30
2.1.5 常用的轉(zhuǎn)換函數(shù) 31
2.2 常用轉(zhuǎn)換舉例 34
2.2.1 取得字符串的內(nèi)存存儲(chǔ)形式 34
2.2.2 取得字符串的某種編碼形式 35
2.2.3 字符串轉(zhuǎn)換為BSTR 36
2.2.4 BSTR轉(zhuǎn)換為字符串 38
2.2.5 十六進(jìn)制字符串轉(zhuǎn)換為二進(jìn)制數(shù)據(jù) 39
2.2.6 字符串轉(zhuǎn)換為HTML實(shí)體形式 40
2.3 Stream對(duì)象的使用 41
2.3.1 簡(jiǎn)介 41
2.3.2 文本數(shù)據(jù) 42
2.3.3 二進(jìn)制數(shù)據(jù) 49
2.3.4 從文件讀取數(shù)據(jù) 51
2.3.5 操作Stream對(duì)象 52
2.3.6 保存到文件 56
2.3.7 Stream對(duì)象間的數(shù)據(jù)復(fù)制 57
2.3.8 Stream對(duì)象的用途 59
2.3.9 常見(jiàn)錯(cuò)誤 65
第3章 編碼與亂碼 66
3.1 常見(jiàn)編碼 66
3.1.1 ASCII 66
3.1.2 ISO 8859系列 67
3.1.3 GB2312 68
3.1.4 GBK 70
3.1.5 Big5 72
3.1.6 Shift_JIS 74
3.1.7 EUC_KR 76
3.1.8 Unicode 78
3.1.9 UTF-8和UTF-16 80
3.1.10 字體 82
3.2 產(chǎn)生亂碼的原因 84
3.2.1 打開(kāi)文件時(shí)的編碼 84
3.2.2 保存文件時(shí)的編碼 85
3.2.3 顯示網(wǎng)頁(yè)時(shí)的編碼 88
3.2.4 ASP程序中的編碼 89
3.3 CodePage簡(jiǎn)介 89
3.3.1 CodePage的形式 89
3.3.2 CodePage編號(hào) 90
3.4 ASP中的CodePage 91
3.4.1 @codepage 91
3.4.2 Session.Codepage 93
3.4.3 Response.Codepage 95
3.4.4 IIS設(shè)置 97
3.4.5 系統(tǒng)默認(rèn)CodePage 98
3.4.6 文件BOM的奇特作用 99
3.4.7 當(dāng)前CodePage 99
3.5 CodePage的具體影響 100
3.5.1 影響Request解碼 100
3.5.2 影響Server.URLEncode 102
3.5.3 影響字符函數(shù) 102
3.5.4 影響Response.Write 104
3.6 Charset的重要作用 104
3.6.1 影響網(wǎng)頁(yè)的顯示 104
3.6.2 影響提交數(shù)據(jù)的編碼 105
3.7 數(shù)據(jù)庫(kù)操作中的編碼轉(zhuǎn)換 107
3.7.1 排序規(guī)則 107
3.7.2 創(chuàng)建數(shù)據(jù)庫(kù)、表 108
3.7.3 插入數(shù)據(jù) 109
3.7.4 檢索數(shù)據(jù) 112
3.7.5 建議的做法 115
3.7.6 關(guān)于Access 115
3.8 編碼轉(zhuǎn)換整體流程圖 116
3.9 問(wèn)題舉例 117
3.9.1 如何編寫UTF-8編碼的程序 117
3.9.2 境外空間讀取數(shù)據(jù)庫(kù)亂碼 117
3.9.3 英文系統(tǒng)下Chr函數(shù)報(bào)錯(cuò) 117
3.9.4 Server.MapPath方法結(jié)果出現(xiàn)問(wèn)號(hào) 118
3.9.5 GBK與UTF-8程序切換時(shí)亂碼 119
3.9.6 如何在鏈接中正確地傳遞參數(shù) 119
3.9.7 Server.URLEncode方法的細(xì)節(jié) 120
3.9.8 如何編寫URLDecode函數(shù) 121
3.9.9 Ajax的Get方式返回值亂碼 126
3.9.10 Ajax的Post方式傳遞中文參數(shù)亂碼 126
3.9.11 使用JavaScript進(jìn)行URL編碼 127
3.9.12 JavaScript讀寫中文Cookie 130
3.9.13 為什么數(shù)據(jù)庫(kù)中是問(wèn)號(hào) 132
3.10 關(guān)于本地化 132
3.10.1 區(qū)域設(shè)置LCID 133
3.10.2 區(qū)域設(shè)置影響哪些函數(shù) 136
第4章 XMLDOM操作 137
4.1 MSXML簡(jiǎn)介 137
4.1.1 MSXML的版本 137
4.1.2 MSXML的實(shí)現(xiàn)機(jī)制 138
4.1.3 MSXML 的對(duì)象構(gòu)成 139
4.1.4 DOM樹(shù)的結(jié)構(gòu) 139
4.2 創(chuàng)建Document對(duì)象 141
4.3 載入XML數(shù)據(jù) 143
4.3.1 載入數(shù)據(jù) 143
4.3.2 同步和異步 143
4.3.3 當(dāng)前狀態(tài) 143
4.4 驗(yàn)證XML數(shù)據(jù) 143
4.4.1 ParseError對(duì)象 143
4.4.2 載入時(shí)驗(yàn)證 144
4.4.3 使用前驗(yàn)證 145
4.5 遍歷節(jié)點(diǎn) 147
4.5.1 節(jié)點(diǎn)常用屬性 147
4.5.2 NodeList和NamedNodeMap的使用 149
4.6 查找節(jié)點(diǎn) 149
4.6.1 根據(jù)ID查找 150
4.6.2 根據(jù)節(jié)點(diǎn)名查找元素 151
4.6.3 使用XPath查找 151
4.7 取得節(jié)點(diǎn)信息 153
4.7.1 判斷節(jié)點(diǎn)類型 153
4.7.2 取得節(jié)點(diǎn)的屬性 153
4.7.3 取得節(jié)點(diǎn)的值 154
4.8 追加節(jié)點(diǎn) 155
4.8.1 創(chuàng)建節(jié)點(diǎn) 156
4.8.2 插入節(jié)點(diǎn) 163
4.9 修改節(jié)點(diǎn) 163
4.10 刪除節(jié)點(diǎn) 164
4.11 保存XML 166
4.12 配合XSLT轉(zhuǎn)換數(shù)據(jù) 166
4.13 使用命名空間 167
4.14 XML中的空白字符 170
4.15 XPath的使用 172
4.15.1 使用舉例 172
4.15.2 查找上下文 173
4.15.3 單步表達(dá)式 174
4.15.4 內(nèi)置函數(shù) 177
4.15.5 合并查詢結(jié)果 179
4.15.6 操作符優(yōu)先級(jí) 179
第5章 XMLHTTP操作 181
5.1 XMLHTTP的使用 181
5.1.1 創(chuàng)建XMLHTTP對(duì)象 182
5.1.2 創(chuàng)建HTTP請(qǐng)求 183
5.1.3 設(shè)置Header 184
5.1.4 發(fā)送請(qǐng)求 184
5.1.5 狀態(tài)及異步方式 187
5.1.6 獲取返回的數(shù)據(jù) 189
5.1.7 中止請(qǐng)求 193
5.1.8 頁(yè)面緩存 194
5.1.9 小提醒 194
5.2 ServerXMLHTTP的使用 195
5.2.1 創(chuàng)建對(duì)象 195
5.2.2 讀取遠(yuǎn)程網(wǎng)頁(yè)內(nèi)容 195
5.2.3 讀取遠(yuǎn)程文件 196
5.2.4 登錄遠(yuǎn)程系統(tǒng) 198
5.2.5 發(fā)送與接收Cookie 201
5.2.6 超時(shí)設(shè)置 205
5.2.7 代理設(shè)置 205
5.2.8 異步請(qǐng)求 206
5.2.9 小提醒 206
第6章 正則表達(dá)式的使用 207
6.1 基本概念 207
6.1.1 原義字符 208
6.1.2 元字符 208
6.1.3 非打印字符 208
6.1.4 字符組 209
6.1.5 否定字符組 209
6.1.6 字符組與否定字符組的簡(jiǎn)寫 210
6.1.7 神奇的字符“.” 210
6.1.8 限定重復(fù)次數(shù)的量詞 210
6.1.9 匹配開(kāi)始位置和結(jié)束位置 211
6.1.10 匹配單詞邊界 212
6.1.11 選擇匹配 213
6.1.12 分組及向后引用 213
6.1.13 正向環(huán)視 214
6.1.14 貪婪與懶惰 215
6.1.15 VBScript不支持的特性 217
6.1.16 適度的使用正則表達(dá)式 217
6.2 正則對(duì)象的使用 218
6.2.1 基本語(yǔ)法 218
6.2.2 驗(yàn)證文本 219
6.2.3 替換文本 220
6.2.4 獲取匹配結(jié)果 224
6.2.5 循環(huán)匹配 227
6.2.6 多行模式 229
6.3 實(shí)例演示 231
6.3.1 UBB中Code標(biāo)簽的替換 231
6.3.2 嵌套標(biāo)簽的替換 233
6.3.3 給關(guān)鍵字增加鏈接 237
6.3.4 清除HTML標(biāo)簽 238
第7章 文件上傳與下載 242
7.1 上傳文件簡(jiǎn)介 242
7.1.1 對(duì)表單的要求 242
7.1.2 數(shù)據(jù)的提交格式 243
7.2 無(wú)組件上傳 246
7.2.1 純腳本拆分?jǐn)?shù)據(jù)的實(shí)現(xiàn) 246
7.2.2 化境上傳類簡(jiǎn)介 251
7.2.3 化境上傳類代碼注解 252
7.2.4 化境上傳類的使用方法 256
7.2.5 常見(jiàn)問(wèn)題 260
7.2.6 上傳進(jìn)度條的實(shí)現(xiàn) 262
7.3 AspUpload組件 269
7.3.1 對(duì)象組成 270
7.3.2 使用方法舉例 271
7.4 FileUp組件 287
7.4.1 對(duì)象組成 288
7.4.2 使用方法舉例 288
7.5 防范上傳漏洞 302
7.5.1 毫無(wú)防范 302
7.5.2 只在客戶端檢查 303
7.5.3 文件后綴名檢驗(yàn)不夠 304
7.5.4 危險(xiǎn)的原文件名 305
7.5.5 IIS解析漏洞 307
7.5.6 文件內(nèi)容并不可靠 309
7.5.7 其他注意事項(xiàng) 309
7.6 下載文件 309
7.6.1 文件下載簡(jiǎn)介 310
7.6.2 強(qiáng)制彈出保存對(duì)話框 312
7.6.3 文件名亂碼的問(wèn)題 313
7.6.4 支持大文件下載 315
7.6.5 支持文件緩存 316
7.6.6 支持分段下載 319
第8章 圖片處理 323
8.1 AspJpeg組件 323
8.1.1 組件簡(jiǎn)介 323
8.1.2 對(duì)象組成 323
8.1.3 基本操作 324
8.2 自由畫(huà)圖 325
8.2.1 畫(huà)圖的坐標(biāo)系 325
8.2.2 畫(huà)各種形狀 325
8.2.3 添加文字 330
8.2.4 添加圖片 340
8.3 圖片處理 343
8.3.1 圖片縮放 343
8.3.2 圖片裁剪 344
8.3.3 圖片銳化 345
8.3.4 鏡像與旋轉(zhuǎn) 346
8.3.5 圖片EXIF取得 348
8.4 GIF動(dòng)畫(huà) 349
8.4.1 GIF動(dòng)畫(huà) 349
8.4.2 GIF調(diào)色板 353
8.4.3 背景透明 358
8.4.4 幀的過(guò)渡方式 360
8.4.5 GIF圖片縮放 362
8.5 PNG格式 363
8.5.1 輸出為PNG圖片 363
8.5.2 設(shè)置Alpha通道 364
8.5.3 轉(zhuǎn)換Alpha通道 366
第9章 郵件發(fā)送 368
9.1 Email簡(jiǎn)介 368
9.1.1 Email收發(fā)流程 368
9.1.2 SMTP簡(jiǎn)介 369
9.1.3 POP與IMAP簡(jiǎn)介 371
9.1.4 MX記錄 371
9.1.5 郵件的入口與出口 372
9.1.6 郵件內(nèi)容的結(jié)構(gòu) 377
9.1.7 MIME簡(jiǎn)介 379
9.2 CDOSYS組件 383
9.2.1 SMTP虛擬服務(wù)器 383
9.2.2 發(fā)送文本郵件 384
9.2.3 發(fā)送HTML郵件 385
9.2.4 添加附件 385
9.2.5 使用遠(yuǎn)程服務(wù)器 385
9.2.6 設(shè)置字符集和傳輸編碼 388
9.2.7 構(gòu)造復(fù)雜結(jié)構(gòu)的郵件 389
9.2.8 批量發(fā)送 403
9.2.9 郵件收條 404
9.2.10 其他設(shè)置 405
9.3 JMail組件 407
9.3.1 發(fā)送文本郵件 407
9.3.2 發(fā)送HTML郵件 407
9.3.3 添加附件 408
9.3.4 設(shè)置傳輸編碼和附件編碼 409
9.3.5 發(fā)送網(wǎng)頁(yè)內(nèi)容 410
9.3.6 采集Email地址 412
9.3.7 嵌入另一封郵件 413
9.3.8 郵件收條 414
9.3.9 使用郵件隊(duì)列 415
9.3.10 錯(cuò)誤處理及發(fā)送日志 416
9.3.11 其他設(shè)置 418
9.4 AspEmail組件 418
9.4.1 發(fā)送文本郵件 419
9.4.2 發(fā)送HTML郵件 420
9.4.3 添加附件 421
9.4.4 設(shè)置傳輸編碼 422
9.4.5 郵件收條 422
9.4.6 使用郵件隊(duì)列 423
9.4.7 其他設(shè)置 425