bababa Groupie
加入: 2004/5月/29
Online Status: Offline 回復: 46
|
Posted: 2004/5月/29 3:46下午 | IP記錄
|
|
|
四、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.修改類程式碼如下:
from www.knowsky.com
'建立資料庫連接並輸出資料庫字段 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.cuts tr項,表明元件註冊成功。
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如何選擇、coo kies數量陷阱、網頁過期和緩衝設定、移植性如何保證、如何應付內部服務器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.包含文件 <!--#incl ude file="top.asp" --> 2.使用server.m appath尋找文件路徑,避免在網頁中直接使用絕對路徑 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,f alse,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)&filenam es&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驅動為c ourse_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
|