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