Asp基礎教程(下) - 中國WEB開發者網絡 (http://www.webasp.net) -- 技術教程 (http://www.webasp.net/article/) --- Asp基礎教程(下) (http://www.webasp.net/article/15/14350.htm) |
| -- 作者:未知 -- 發佈日期: 2004-10-29 |
| 四、Asp組件的開發與使用:
1. 組件的特點? l 優點: n 調用方便,節省代碼 n 安全性高 n 支持事務處理,多組件聯合 n 運行速度快 n 升級、修改組件不需修改頁面,因此擴展性好 l 缺點: n 開發及調試困難 2. 如何使用VB開發? 1.打開VB>>New Project>>ActiveX DLL 2.修改項目名稱為course 3.修改類模塊的名字為conn_db 4.Project>> References,引用COM+ Service Type Library和Microsoft Active Server Pages Object Library。 5.修改類代碼如下: '建立數據庫連接並輸出數據庫字段 Dim Response As Response Dim Request As Request Dim Server As Server Dim Application As Application Dim Session As Session Private Sub Class_Initialize() Dim objContext As ObjectContext Set objContext = GetObjectContext() Set Response = objContext("Response") Set Request = objContext("Request") Set Server = objContext("Server") Set Application = objContext("Application") Set Session = objContext("Session") End Sub Sub conn_db() Set conn = CreateObject("adodb.connection") conn.open "course_dsn", "course_user", "course_password" Set rs = CreateObject("adodb.recordset") rs.open "select * from user_info", conn, 1, 1 If rs.recordcount > 0 Then For i = 1 To rs.recordcount Response.write "<br>" & rs("user_name") & "<br>" If rs.EOF Then Exit For rs.movenext Next End If rs.Close Set rs = Nothing conn.Close Set conn = Nothing End Sub 6.添加一新類cutstr 7.修改類代碼如下: '截取字符串 Function cutstr(str, length) If Len(str) > length Then cutstr = Left(str, length) & "..." Else cutstr = str End If End Function 8.File>>Save 9.File>>make course.dll 3. 註冊組件:MTS和regsvr32.exe 有兩種方式註冊組件:MTS和使用regsvr32.exe。MTS是值得推薦的,因為它具有下列優點: n 動態卸載平衡,提高組件和基於組件的應用程序的升級性。 n 包含公佈和提交事件和隊列組件的能力,使得更容易與多個組件聯合。 要想使組件具有MTS的特性,必須對組件做少許改動。在NT和98下開發時,必須在項目中引用Microsoft Transaction Server Type Library,在Windows 2000下開發,必須引用COM+ Service Type Library。 1.regsvr32註冊: regsvr32.exe是system32下面的一個可執行文件,它將組件信息讀入註冊表,以便Asp調用。 使用命令行進入組件dll文件所在的目錄,執行「regsvr32 dll_file_name」即可。 運行regedit,在HKEY_CLASSES_ROOT下就會找到course.conn_db項和course.cutstr項,表明組件註冊成功。 2.使用MTS註冊: 1.開始>>程序>>管理工具>>組件服務 2.展開目錄至如下狀態: 3.按照嚮導,下一步,直到如下對話框,點擊「創建一個空的應用程序」: 4.在接下來的對話框中,為應用程序起名為「course」,其他默認,直至完成 5.展開course應用程序,右鍵,新建一個組件 6.按照提示,繼續,出現如下對話框時,選擇「導入已被註冊的組件」 7.選擇我們開發的組件,下一步,直至完成 8.這時候,可以發現course應用程序下已經多了兩個組件: 4. 在Asp中調用組件 asp_use_com.asp <% 'asp調用com組件 set cutstr_obj=server.createobject("course.cutstr") response.write cutstr_obj.cutstr("abcdefghijk",3)&"<br>" set cutstr_obj=nothing set conn_obj=server.createobject("course.conn_db") conn_obj.conn_db() set conn_obj=nothing %> 效果: abc... ahyi tuth 說明調用成功。 5. 卸載組件 1.使用regsvr32註冊的組件,使用-u開關卸載: 注意:先進入組件dll所在的目錄,然後使用「regsvr32 –u dll_file_name」卸載;卸載後重啟IIS即可。 2.使用MTS註冊的組件,先在「組件服務」中刪除對應的應用程序,然後再執行步驟 1 以徹底卸載組件。 6. Dll組件存放位置和權限設定 1.我們只需要把編譯生成的Dll文件拷貝出來即可,其他的文件不用做處理 2.要把Dll放到Web站點之外,如system32目錄裡,防止被下載 3.Dll的文件權設置為System讀取,Internet用戶遍歷文件夾/運行文件 4.Dll在IIS中去掉所有的權限,如讀取,腳本自願訪問等 經過上述處理,可以確保Dll文件的安全。 7. 其他 如何在組件中使用Asp的對象以方便的將Asp代碼移植為COM組件? 五、IIS最優化配置 1.Web站點選項卡:IP、端口、虛擬主機、連接、日誌 2.ISAPI篩選器:加入PHP和JSP支持 3.主目錄配置選項卡:I IS權限設定(結合文件權)、執行許可、應用程序保護、映射、緩衝、父路徑、出錯信息 4.其他選項卡:自定義錯誤、Http頭、目錄安全性、文檔 5.文件壓縮帶來的好處和壞處 六、其他 1. 發送郵件(JMail;Ms smtp) 使用Microsoft Smtp發送電子郵件 1.安裝Microsoft SMTP Service 2.設置Microsoft SMTP Service 3.代碼部分: mail_smtp.asp <% sub sendmail(fromwho,towho,subject,body) dim mymail set mymail = server.createobject("cdonts.newmail") mymail.from = fromwho mymail.to = towho mymail.subject = subject mymail.body = body mymail.send set mymail = nothing end sub %> 該子程序接受4個與下列各條對應的參數。 l 郵件發送者的email地址 l 郵件接收者的email地址 l 郵件主題 l 郵件內容 使用方法: <% fromWho=… toWho=… Subject=… Body=… IF toWho <> "" THEN sendMail fromWho, toWho, Subject, Body END IF %> 使用Jmail發送Email 略,有興趣可以和我探討,Jmail這個軟件我也有。 2. 解壓Zip文件(Wscript.Shell和Winzip command line;Java組件) 1.安裝Winzip 8.1以上 2.安裝Winzip command line 3.將工作目錄的文件權設置為Internet用戶可以讀取、寫入和修改 4.代碼部分: unzip_a_zipfile.asp <% '用shell對像啟動程序 'zip_path是具體zip文件的路徑,如c:\test.zip 'path是存放解壓後文件的路徑 'ond是命令行參數 set wshshell = server.createobject("wscript.shell") issuccess = wshshell.run ("wzunzip -ond "&zip_path&" "&path,1,true) '刪除zip文件 set myfileobject=server.createobject("scripting.filesystemobject") myfileobject.deletefile zip_path '判斷是否成功以繼續操作 if issuccess = 0 then '成功 ... else '失敗 ... end if %> 3. 操作XML文件 本次交流時間有限,有時間再做詳細探討 4.文件上傳 1.安裝文件上傳組件Asp fileup(支持多文件上傳,文件類型及大小判斷,文件上傳後改名等) 2.重起IIS以使上傳組件生效 3.設置上傳目錄的文件權為Internet用戶可以讀取、寫入和修改 4.代碼部分 upload_file.htm <style type="text/css"> <!-- .input {background-color: #FFFFFF; border-bottom: black 1px solid;border-left: black 1px solid; border-right: black 1px solid;border-top: black 1px solid; color: #000000;font-family: Georgia; font-size: 9pt;color: midnightblue;} a:link {color: #1B629C; text-decoration: none} a:hover {color: #FF6600; text-decoration: underline} a:visited {text-decoration: none} --> </style> <center> <form enctype="multipart/form-data" method="post" action="upload_file.asp" name="Upload"> <input type="hidden" name="CopyrightInfo" value="http://www.chinaasp.com"> 請選擇文件:<input type="file" name="file1" class="input"><br><br> 請選擇文件:<input type="file" name="file2" class="input"><br><br> </form> <br><br> <a href="javascript:document.Upload.submit();"> 提 交 </a> </center> upload_file.asp <% on error resume next '定義獲得文件後綴的函數 function getfileextname(filename) pos=instrrev(filename,".") if pos>0 then getfileextname=mid(filename,pos+1) else getfileextname="" end if end function '定義獲取文件正名的函數 function getfilename(filename) lens=len(filename)-len(getfileextname(filename))-1 getfilename=left(filename,lens) end function '創建文件上傳組件的對象 set fileup=server.createobject("chinaasp.upload") '循環讀取用戶上傳的文件,並保存在服務器上 for each f in fileup.files '當用戶沒有選擇文件或文件大小超過10m時返回到選擇上傳文件的頁面 if f.filename="" or f.filesize>10485500 then response.redirect "upload_file.htm" '獲取保存的路徑 path=server.mappath("upload_file.asp") path=left(path,len(path)-15) '保存文件 f.saveas path&getfilename(f.filename)&"."&getfileextname(f.filename) next response.redirect "upload_file.htm" %> 5.驅動器/目錄/文件操作 本次交流時間有限,有時間再做詳細探討 6. Asp編寫與調試經驗:cookies和session如何選擇、cookies數量陷阱、頁面過期和緩衝設定、移植性如何保證、如何應付內部服務器500錯誤…… 1.Cookies和Session的選擇: 1.共同特點 2.不同之處: 1.工作方式 2.過期條件 3.對服務器的性能影響 2.Cookies數量陷阱: IIS可以保存一般的cookies不超過20個,再定義新的Cookies以前的Cookies的值就丟失了,這樣對大型應用顯然局限性非常大,如何解決這個問題呢? 答案是使用二維Cookies。 例子: 測試一維Cookies數量極限: test_cookies_1.asp <% for i=1 to 50 response.cookies("cookies_"&i)=i next %> test_cookies_2.asp <% for i=1 to 50 response.write request.cookies("cookies_"&i)&"<br>" next %> 效果: 先訪問test_cookies_1.asp,再訪問test_cookies_2.asp,,發現了什麼? test_cookies_3.asp <% for i=1 to 50 response.cookies("cookies_"&i)=i next for i=1 to 50 response.write request.cookies("cookies_"&i)&"<br>" next %> 效果: 沒有Cookies丟失!!!! 測試二維Cookies數量極限: test_cookies_4.asp <% for i=1 to 301 response.cookies("tuht")("cookies_"&i)=i next %> test_cookies_5.asp <% for i=1 to 301 response.write request.cookies("tuht")("cookies_"&i)&"<br>" next %> 效果: 使用這種方式可以使用201*20=4020個Cookies!!!! 3.頁面過期和緩衝設定 <% '過期和緩衝處理 response.buffer=true response.cachecontrol="no-chache" response.expiresabsolute=now()-1 response.expires=0 %> html中還可以做設定: <meta content="no-cache" http-equiv="Pragma"> <meta HTTP-EQUIV="Expires" CONTENT="0"> 4.移植性的保證 1.包含文件 <!--#include file="top.asp" --> 2.使用server.mappath尋找文件路徑,避免在頁面中直接使用絕對路徑 3.盡量使用組件封裝業務邏輯 5.調試內部服務器500的錯誤 1.設置IIS顯示具體的錯誤信息 2.分步調試,由上而下 3.打印某些重要的變量的值,檢查是否為我們預期 4.根據經驗來判斷錯誤 7. 操作Word文檔 1.安裝Office 2000,其中Word 2000必選 2.設置IE中Internet的安全性:ActiveX控件和插件全部啟用 3.設置工作目錄的文件權為Internet及System讀取/修改/寫入 4.編寫模版course.dot 5.具體代碼: opr_doc_inc.asp <% Response.write "Dim Var_Num" & chr(13) Response.write " Var_Num = 2 " & chr(13) Response.write "Dim varstrings(2)" & chr(13) Response.write "varstrings(0)=" & chr(34) & "起草人:" & chr(34) & chr(13) Response.write "varstrings(1)=" & chr(34) & "日期:" & chr(34) & chr(13) Response.write "Dim varValues(2)" & chr(13) Response.write "varValues(0)=" & chr(34) &"起草人:塗海濤"& chr(34) & chr(13) Response.write "varValues(1)=" & chr(34) & "日期:"&date()& chr(34) & chr(13) %> Sub instead(word) Set myRange = word.ActiveDocument.Content for i=0 to Var_Num - 1 call myRange.Find.Execute(varStrings(i),false,false,false,false,false,false,false,false,varValues(i),2) Next End Sub opr_doc.asp <% '獲取保存的路徑 path=server.mappath("opr_doc.asp") path=left(path,len(path)-11) filenames=path&"test.doc" w1="word.activedocument.saveAs"&chr(32)&chr(34)&filenames&chr(34) w2="wApp.Documents.open"&chr(32)&chr(34)&filenames&chr(34) %> <script language="vbscript"> On Error Resume Next '生成指定文件名的Word文檔 Dim word set word = CreateObject("Word.Application") if Err.number > 0 Then Alert "發生錯誤,請確認文件是否存在" else word.visible = False word.documents.open "<%response.write path%>course.dot" <%Response.write w1%> word.documents.close set word=nothing end if <!--#include file="opr_doc_inc.asp"--> Dim wApp Set wApp = CreateObject("Word.Application") If Err.number > 0 Then Alert "發生錯誤,請確認文件是否正確創建" else wApp.visible = True <%Response.write w2%> call instead(wApp) set wApp=nothing end if </script> 效果:看看生成了doc文件嗎?這個新建的doc文件和模版文件有什麼區別?起草人和日期發生了變化了嗎?保存一下,看看新生成的doc文件的內容。 附: 1.以上全部代碼在Windows 2000 Server SP2+IIS 5.0+MS SQL Server 2000+Office 2000下測試通過 2.配置數據庫:數據庫名course,用戶course_user,密碼course_password,ODBC驅動為course_dsn,端口為2433,描述表結構的腳本在共享目錄下。 3.Asp fileup、Jmail、Winzip 8.1、Winzip command line這幾個軟件請自行下載。 4.數據庫腳本文件: if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[output_1]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) drop procedure [dbo].[output_1] GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[return_1]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) drop procedure [dbo].[return_1] GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[user_info_1]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) drop procedure [dbo].[user_info_1] GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[user_info_2]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) drop procedure [dbo].[user_info_2] GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[user_info_3]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) drop procedure [dbo].[user_info_3] GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[user_info]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[user_info] GO CREATE TABLE [dbo].[user_info] ( [id] [int] IDENTITY (1, 1) NOT NULL , [user_name] [varchar] (40) COLLATE Chinese_PRC_CI_AS NOT NULL , [password] [varchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ) ON [PRIMARY] GO ALTER TABLE [dbo].[user_info] WITH NOCHECK ADD CONSTRAINT [PK_user_info] PRIMARY KEY CLUSTERED ( [user_name] ) ON [PRIMARY] GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS OFF GO CREATE PROCEDURE [output_1] @sid int output AS set @sid=2 GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS OFF GO CREATE PROCEDURE [return_1] (@user_name varchar(40),@password varchar(20)) AS if exists(select id from user_info where user_name=@user_name and password=@password) return 1 else return 0 GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_NULLS OFF GO CREATE PROCEDURE [user_info_1] (@user_name varchar(40),@password varchar(20)) AS select id from user_info where user_name=@user_name and password=@password GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS OFF GO CREATE PROCEDURE [user_info_2] (@user_name varchar(40),@password varchar(20)) AS SET XACT_ABORT ON BEGIN TRANSACTION delete from user_info where user_name=@user_name and password=@password COMMIT TRANSACTION SET XACT_ABORT OFF GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS OFF GO CREATE PROCEDURE [user_info_3] AS select * from user_info GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO |
| webasp.net |