摘要控件能實現各種各樣的功能,文章圍繞解決網站控件技術主要存在的兩個問題:(1)如何讓控件與服務器端腳本進行交互;(2)如何發布控件,讓控件能在客戶端的瀏覽器上正常使用?通過教授學生開發“ftp文件上傳” 控件實例探討網站控件技術。
關鍵詞 控件 服務器端腳本 客戶端 ACCESS數據 打包
中圖分類號:TP311 文獻標志碼:A
Analysis of Website Control Technology
CHEN Rui
(Guangzhou Huangpu Vocational and Technical School, Guangzhou, Guangdong 510725)
AbstractControl can achieve a variety of functions, the article is around solving the two major problems of web control technology: (1) How to make the control to interact with server-side scripting; (2) How to release control, and allow control narmally used in the client's browser? This paper discusses site control technology through the example of teaching students to develop \"ftp file upload\" control.
Key wordscontrol; server-side script; client; ACCESS data; packaging
在教授學生開發“ftp文件上傳” 控件實例中主要運用了VB、ASP、ACCESS等編程開發工具及IIs5.0搭建服務器平臺。由于VB自帶的程序打包工具,能夠輕松地打包控件、發布控件,所以我們在“ftp上傳工具” 控件實例開發中,選用了中職學生最為熟悉的VB作為開發工具;ASP與VB的語法極為相似,也是中職計算機專業最為常設的專業課程之一,所以我們選用中職學生較為熟悉的ASP作為服務器端腳本;由于ACCESS數據簡單、且方便測試,所以我們選用ACCESS數據庫文件;對中職生而言,Windows自帶的IIS信息服務器可以說是最為簡單和常用的服務器平臺搭建工具之一,因此這個實例也是選用IIs5.0(或以上版本)來搭建web和ftp服務器平臺。
“ftp文件上傳” 控件實例主要功能有:從web服務器的數據庫里取得指定ftp服務器的用戶名和密碼,然后把文件上傳到ftp服務器,最后把成功上傳文件的文件名保存回web服務器的數據庫。
圖1
圖2
下面從“ftp文件上傳”控件實例開發的六個步驟中詳細闡述解決“(1)如何讓控件與服務器端腳本進行交互”及“(2)如何發布控件,讓控件能在客戶端的瀏覽器上正常使用?”兩個問題的過程及控件技術剖析。
(1)用ACCESS建立一個db.mdb文件,文件包含兩個表:
表1為user :存儲ftp服務器的用戶和密碼
(表結構如圖1)(內容如圖2)
表2為files:(存儲成功上傳的文件名)
表2為files :用于保存已經上傳的文件的文件名(表結構如下圖3)
圖3
(2)用VB創建activex控件。
打開VB,點擊【文件】菜單下面的【新建】,選擇activex控件,建立activex控件工程。保存工程到【G:\\用VB開發文件上傳控件,用于網頁】
打開部件面板,添加兩個部件:
① Microsoft Common Dialog Control6.0(對話框控件,用來選擇要上傳的文件)
② Microsoft Internet Transfer Control6.0(用于上傳文件到ftp服務器)
●加一個文本框(Text1)到設計面板,屬性Text設置為空,屬性enable為1
●加一個標簽(label1)到設計面板, 屬性caption設置為“你選擇的文件”
●加兩個按鈕command1、command2到到設計面板,caption屬性分別設為“打開文件”、“上傳”
●加一個CommonDialog1控件到設計面板(Microsoft Common Dialog Control6.0)
●加一個inet1控件到設計面板(Microsoft Internet Transfer Control6.0)
雙擊設計面板,打開代碼(code)窗口:(以下程序后面【 】內的文字為程序代碼注釋)
Private user, pwd As String'【保存從asp文件中傳遞過來的ftp的用戶名和密碼】
'【以下定義兩個共有屬性username、password,用來做為從asp文件獲得ftp用戶名和密碼的接口,用Property Get、Property Let方法來定義屬性】
Public Property Get username() As String
username = user '【得到屬性】
End Property
Public Property Let username(ByVal userstr As String)
user = userstr '【設置屬性】
PropertyChanged \"username\"'【user和username是相關聯系,保存一樣的數據,一個改變了,另一個更著改變】
End Property
Public Property Get password() As String
password = pwd '【得到屬性】
End Property
Public Property Let password(ByVal pwdstr As String)
pwd = pwdstr '【設置屬性】
PropertyChanged \"password\" ' 【pwd和password是相關聯系,保存一樣的數據,一個改變了,另一個更著改變】
End Property
'【以下代碼很重要,是數據成功傳遞的關鍵】
'【從存貯器中加載屬性值】
Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
user = PropBag.ReadProperty(\"username\", \"\")
pwd = PropBag.ReadProperty(\"password\", \"\")
End Sub
'【將屬性值寫到存儲器】
Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
Call PropBag.WriteProperty(\"username\", user, \"\")
Call PropBag.WriteProperty(\"password\", pwd, \"\")
End Sub
'【以下是對text1的編程,text1用來顯示選中的要上傳文件的完整路徑】
Private Sub Text1_Change() '【當文本框內容改變時,觸發該事件】
If Text1.Text <> \"\" Then
Command1.Enabled = True '【當文本框內容改變時,有內容,上傳按鈕可用】
Else
Command1.Enabled = False '【當文本框內容改變時,無內容,上傳按鈕不可用】
End If
End Sub
'【command2為【打開文件】按鈕,用來選擇要上傳的文件】
Private Sub Command2_Click()
CommonDialog1.FileName = \"\"
CommonDialog1.ShowOpen
If CommonDialog1.FileName <> \"\" Then
Text1.Text = CommonDialog1.FileName'【把選中的文件賦給文本框】
End If
End Sub
'【command1為【上傳】按鈕,將選中的文件上傳到ftp服務器】
Private Sub Command1_Click()
IfText1.Text <> \"\"Then
IfDir(Text1.Text) <> \"\"Then'【如果文件存在】
Command1.Enabled = False'【上傳按鈕,要等到當前文件傳送完才可用】
fst = Split(Text1.Text, \"\\\")'【分隔路徑,獲得文件名】
Inet1.password = pwd '【設置ftp服務器密碼】
Inet1.username = user '【設置ftp用戶名】
Inet1.RemoteHost = \"192.168.1.1\"'【設置ftp服務器地址】
Inet1.Protocol = icFTP'【設置上傳文件用的協議】
Inet1.RemotePort = 21 '【設置ftp服務器的接收文件用的端口】
On Error GoTo errh: '【以下程序如果執行出錯就跳轉去提示出錯信息】
Inet1.Execute , \"put \" Text1.Text \" upfiledata/\" fst(UBound(fst)) '【inet1控件上傳文件到ftp服務器的 [upfiledata] 目錄下】
isbusy = True
Do While isbusy'【讓程序等待文件上傳結束】
isbusy = Inet1.StillExecuting
DoEvents
Loop
Text1.Text = \"\"
Command1.Enabled = True'【文件傳送完,恢復上傳按鈕按變成可用】
'【重新提交網頁,傳遞已傳送的文件名給asp文件,以保存文件名到數據庫】
Shell \"explorer.exe http://192.168.1.1/ upfile /u1.asp?fn=\" fst(UBound(fst))\"
Exit Sub
errh: '【提示出錯信息】
MsgBox Err.Description, , \"信息提示\"
Command1.Enabled = True'【出錯提示后,重新恢復上傳按鈕按變成可用】
End If
End If
End Sub
控件設計完成,點擊【文件】菜單下面的【生成工程1ocx】,在彈出的【生成工程】對話框中輸入a.ocx,生成控件。
(3)打包控件。
第一步:打開VB自帶的【package deployment 向導】程序。
第二步:選擇工程保存的位置,點擊【打包】。
第三步:選擇【Internet包1】點擊【下一步】按鈕。
第四步:在包類型對話框中選擇【Internet軟件包】,點擊【下一步】按鈕。
第五步:選擇包保存的位置,默認即可,點擊【下一步】按鈕。
第六步:【文件】列表框中的文件全部勾選,點擊【下一步】按鈕。
第七步:在【文件】列表框中分別選中每個文件,都在【文件源】框中設置為第一項:【包含在此壓縮文件中】,點擊【下一步】按鈕。
第八步:在安全設置中【設置腳本安全性】為【是】,【設置初次化安全性】為【是】,這個設置很關鍵,一定要設置為【是】,如果設置為【否】,控件將無法在客戶端正常顯示,點擊【下一步】按鈕。
第九步:點擊【完成】按鈕,控件打包完成,生成的包文件名為“ a.cab ”。
(4)編寫【u1.asp】文件,用來傳遞數據給控件,同時接收控件傳回的數據。
用記事本新建【u1.asp】文件,寫代碼如下:
<%@ language=VBscript %>
<%
dim conn
dim connectstr
set conn=server.createobject(\"adodb.connection\")
connectstr=\"provider=microsoft.jet.oledb.4.0;data source=\" server.mappath(\"db.mdb\")
conn.Open connectstr'【打開對數據庫db.mdb的連接】
Set rs =server.createobject(\"adodb.recordset\")
rs.Open \"user\",conn,3,3 '【打開user表獲得ftp的用戶名和密碼】
if not rs.eof then
session(\"us\")=rs(“username”) '【把數據保存到session變量中】
session(\"pd\")=rs(“password”)
end if
rs.close
%>
打開工程保存的文件夾【G:\\用VB開發文件上傳控件,用于網頁】,里面有個【包】文件夾,保存了剛才打包的控件,【a.cab文件】和【a.htm】文件。用記事本打開文件a.htm,找到如下這段代碼