Asp組件中級入門與精通系列之一
初級教程寫了七篇了,肯定還有一些初級的東西需要寫,我會慢慢的進行補充
中級教程的內容:
這可能也是大家最關心的:如:數據庫的操作與封裝。 Asp內建物件的使用。這些部分我會花費較長的篇幅來說明,這一部分內容需要你能夠比較熟練的使用ADO操作資料庫並且對asp的5大物件比較熟悉。
我們來看看網路上比較流傳的一些資料:
眾所周知,ASP內建了Response、Request、Server、Session、Application五個對象,其實這五個內建對象正是IIS控制台初始化的五個ActiveX DLL元件,既然IIS可以初始化這五個元件用於ASP中,我們當然也可以直接在我們的ActiveX DLL中引用這些元件來實現我們的編程,也就是說我們可以在VB應用程式中透過引用這些元件來實現存取ASP內建物件的功能。
只要你安裝了PWS4或IIS4以上的WEB伺服器,你就擁有了一個名稱叫做「Microsoft Active Server Pages Object」的物件庫,我們可以在VB的ActiveX DLL應用程式中引用這個物件庫,透過引用這個物件庫,我們就獲得了一個物件(類別):ScriptingContext,而這個物件也正是我們整個文章探討的核心物件。物件庫內的關係如下:
物件庫類別成員
ASPTypeLibrary ScriptingContext Application
Request
Response
Session
Server
透過上面的關係圖,我們就可以很容易理解類別ScriptingContent。
下面我們來看一個具體的例子:
開啟vb6,新建Activex Dll工程。工程名修改為fCom,類別名稱修改為fZ1
引用“Microsoft Active Server Pages Object”物件庫。
建立兩個組件事件:OnStartPage以及OnEndPage
在事件OnStartPage中建立類別ScriptingContent的一個引用。
實例化類別ScriptingContent。
程式碼如下:
程式碼
Option Explicit
'對象的聲明
Dim myResponse As Response
Dim myRequest As Request
Dim myApplication As Application
Dim myServer As Server
Dim mySession As Session
'當組件被創建的時候會觸發這個事件
Public Sub OnStartPage(myScriptingContent As ScriptingContext)
'進行物件的實例化
Set myResponse = myScriptingContent.Response
Set myRequest = myScriptingContent.Request
Set myServer = myScriptingContent.Server
Set myApplication = myScriptingContent.Application
Set mySession = myScriptingContent.Session
myResponse.Write "ActiveX DLL元件已經被建立了!"
End Sub
'當元件被銷毀的時候觸發這個事件
Public Sub OnEndPage()
myResponse.Write "ActiveX DLL元件已經被銷毀!"
'銷毀對象
Set myResponse = Nothing
Set myRequest = Nothing
Set myServer = Nothing
Set myApplication = Nothing
Set mySession = Nothing
End Sub
'定義我們自己的一個元件方法
Public Sub HelloWorld()
myResponse.Write "這是用asp內建物件寫的"
End Sub
測試開啟visual interdev6.0,產生一個asp文件
程式碼
<%@ Language=VBScript %>
<HTML>
<BODY>
<%
set obj=server.CreateObject("fCom.fZ1")
call obj.HelloWorld()
%>
</BODY>
</HTML>
配置虛擬目錄,在ie中執行此asp文件,得到結果如下:
ActiveX DLL組件已經被創建了!這是用asp內置對象寫的ActiveX DLL組件已經被銷毀!
Asp組件中級入門與精通系列之二
我們先來看看Application對像以前使用Application對象常常用於計數器和數據庫的連接串我們以計數器為例:
先看global.asa文件,這個比較簡單
程式碼
<script language =vbscript runat=server>
sub Application_onstart
Application("Counter")=0
end sub
</script>
然後
打開vb6,新建Activex Dll工程。工程名修改為fCom,類別名稱修改為fZ2
引用“Microsoft Active Server Pages Object”物件庫。
建立兩個組件事件:OnStartPage以及OnEndPage
在事件OnStartPage中建立類別ScriptingContent的一個引用。
實例化類別ScriptingContent。
程式碼如下:
程式碼
Option Explicit
'對象的聲明
Dim myResponse As Response
Dim myRequest As Request
Dim myApplication As Application
Dim myServer As Server
Dim mySession As Session
'當組件被創建的時候會觸發這個事件
Public Sub OnStartPage(myScriptingContent As ScriptingContext)
'進行物件的實例化
Set myResponse = myScriptingContent.Response
Set myRequest = myScriptingContent.Request
Set myServer = myScriptingContent.Server
Set myApplication = myScriptingContent.Application
Set mySession = myScriptingContent.Session
End Sub
'當元件被銷毀的時候觸發這個事件
Public Sub OnEndPage()
'銷毀對象
Set myResponse = Nothing
Set myRequest = Nothing
Set myServer = Nothing
Set myApplication = Nothing
Set mySession = Nothing
End Sub
'可以看到,把以前asp中寫的搬到了vb中,寫法是一樣的
Public Sub ShowCounter()
Dim intcounter As Long
myApplication.Lock
intcounter = myApplication("counter")
intcounter = intcounter + 1
myApplication("counter") = intcounter
myApplication.UnLock
myResponse.Write CStr(intcounter)
End Sub
測試
開啟visual interdev6.0,產生一個asp文件
程式碼
<%@ Language=VBScript %>
<HTML>
<BODY>
<%
dim obj
set obj=server.CreateObject("fCom.fZ2")
obj.ShowCounter()
%>
</BODY>
</HTML>
設定好虛擬目錄,需要將global.asa檔案放到根目錄下,在ie中執行此asp文件,刷新頁面,就可以看到一個不斷變化的數字。
Application的用法就講到這裡。
Asp組件中級入門與精通系列之三
Session相比較就簡單多了
打開vb6,新建Activex Dll工程。工程名修改為fCom,類別名稱修改為fZ3
引用“Microsoft Active Server Pages Object”物件庫。
建立兩個組件事件:OnStartPage以及OnEndPage
在事件OnStartPage中建立類別ScriptingContent的一個引用。
實例化類別ScriptingContent。
程式碼如下:
程式碼
Option Explicit
'對象的聲明
Dim myResponse As Response
Dim myRequest As Request
Dim myApplication As Application
Dim myServer As Server
Dim mySession As Session
'當組件被創建的時候會觸發這個事件
Public Sub OnStartPage(myScriptingContent As ScriptingContext)
'進行物件的實例化
Set myResponse = myScriptingContent.Response
Set myRequest = myScriptingContent.Request
Set myServer = myScriptingContent.Server
Set myApplication = myScriptingContent.Application
Set mySession = myScriptingContent.Session
End Sub
'當元件被銷毀的時候觸發這個事件
Public Sub OnEndPage()
'銷毀對象
Set myResponse = Nothing
Set myRequest = Nothing
Set myServer = Nothing
Set myApplication = Nothing
Set mySession = Nothing
End Sub
'可以看到,把以前asp中寫的搬到了vb中,寫法是一樣的
'得到所有的session的變數和值
Public Sub ShowSession()
'可設定超時20分鐘
mySession.Timeout = 20
Dim myitem
'得到所有的session
為 Each myitem In mySession.Contents
myResponse.Write myitem & ": " & mySession.Contents(myitem)
myResponse.Write "<br>"
Next
End Sub
測試
開啟visual interdev6.0,產生一個asp檔配置好虛擬目錄,在ie中執行此asp文件,可以看到
name: 龍捲風
age: 26
特長: 組件
Session的用法就講到這裡。 Session其他的用法類似。
Asp組件中級入門與精通系列之四
我們學習來Request
看如何在元件中得到頁面提交的內容
開啟vb6,新建Activex Dll工程。工程名修改為fCom,類別名稱修改為fZ4
引用“Microsoft Active Server Pages Object”物件庫。
建立兩個組件事件:OnStartPage以及OnEndPage
在事件OnStartPage中建立類別ScriptingContent的一個引用。
實例化類別ScriptingContent。
程式碼如下:
程式碼
Option Explicit
'對象的聲明
Dim myResponse As Response
Dim myRequest As Request
Dim myApplication As Application
Dim myServer As Server
Dim mySession As Session
'當組件被創建的時候會觸發這個事件
Public Sub OnStartPage(myScriptingContent As ScriptingContext)
'進行物件的實例化
Set myResponse = myScriptingContent.Response
Set myRequest = myScriptingContent.Request
Set myServer = myScriptingContent.Server
Set myApplication = myScriptingContent.Application
Set mySession = myScriptingContent.Session
End Sub
'當元件被銷毀的時候觸發這個事件
Public Sub OnEndPage()
'銷毀對象
Set myResponse = Nothing
Set myRequest = Nothing
Set myServer = Nothing
Set myApplication = Nothing
Set mySession = Nothing
End Sub
'可以看到,把以前asp中寫的搬到了vb中,寫法是一樣的
Public Sub ShowRequest()
Dim myitem
'Post方式的
為 Each myitem In myRequest.Form
myResponse.Write myitem & ": " & myRequest.Form(myitem)
myResponse.Write "<br>"
Next
'Get方式的
For Each myitem In myRequest.QueryString
myResponse.Write myitem & ": " & myRequest.QueryString(myitem)
myResponse.Write "<br>"
Next
'單一訊息
myResponse.Write "其中一個訊息是" & ": " & myRequest("username")
myResponse.Write "<br>"
End Sub
測試
開啟visual interdev6.0,產生一個fz41.asp檔
程式碼
<%@ Language=VBScript %>
<HTML>
<BODY>
<form action="fz4_result.asp" method="post">
<INPUT id=text1 name=username>
<INPUT id=text2 name=age>
<INPUT id=submit1 type=submit value=Submit name=提交>
</form>
</BODY>
</HTML>
還需要產生一個提交後的fz4_result.asp檔案
程式碼
<%@ Language=VBScript %>
<HTML>
<BODY>
<%
dim obj
set obj=server.CreateObject("fCom.fZ4")
call obj.ShowRequest
%>
</BODY>
</HTML>
另外我們還要看Get方式提交的,所以需要一個fz42.asp檔
程式碼
<%@ Language=VBScript %>
<HTML>
<BODY>
<form action="fz4_result.asp?username='"& username &"'& age='"& age &"'" method="get" id=form1 name=form1>
<INPUT id=text1 name=username>
<INPUT id=text2 name=age>
<INPUT id=submit1 type=submit value=Submit name=提交>
</form>
</BODY>
</HTML>
配置虛擬目錄,在ie中執行fc41.asp文件,輸入內容後,點選按鈕,可以看到
username: 龍捲風
age: 26
提交: Submit
其中一個訊息是: 龍捲風
我們再來執行在ie中執行fc42.asp文件,輸入內容後,點擊按鈕,可以看到
username: 龍捲風
age: 26
提交: Submit
其中一個訊息是: 龍捲風
同時網址列變成了
http://yang/xml/fz4_result.asp?username=%C1%FA%BE%ED%B7%E7&age=26&%CC%E1%BD%BB=Submit
未完待續
Asp組件中級入門與精通系列之五
我們學習來看一下Response物件。其實我們前面的教學一直都在使用這個物件的Write方法。
這裡我們用Response物件來設定cookie。
開啟vb6,新建Activex Dll工程。工程名修改為fCom,類別名稱修改為fZ5
引用“Microsoft Active Server Pages Object”物件庫。
建立兩個組件事件:OnStartPage以及OnEndPage
在事件OnStartPage中建立類別ScriptingContent的一個引用。
實例化類別ScriptingContent。
程式碼如下:
程式碼
Option Explicit
'對象的聲明
Dim myResponse As Response
Dim myRequest As Request
Dim myApplication As Application
Dim myServer As Server
Dim mySession As Session
'當元件被創建的時候會觸發這個事件
Public Sub OnStartPage(myScriptingContent As ScriptingContext)
'進行物件的實例化
Set myResponse = myScriptingContent.Response
Set myRequest = myScriptingContent.Request
Set myServer = myScriptingContent.Server
Set myApplication = myScriptingContent.Application
Set mySession = myScriptingContent.Session
End Sub
'當元件被銷毀的時候觸發這個事件
Public Sub OnEndPage()
'銷毀對象
Set myResponse = Nothing
Set myRequest = Nothing
Set myServer = Nothing
Set myApplication = Nothing
Set mySession = Nothing
End Sub
'從頁面設定Cookie,元件中取得
Public Sub GetCookie()
Dim myitem
'全部訊息
For Each myitem In myRequest.Cookies
myResponse.Write myitem & ": " & myRequest.Cookies.Item(myitem)
myResponse.Write "<br>"
Next
'單一訊息
myResponse.Write "其中使用者姓名是" & ": " & myRequest.Cookies("username")
myResponse.Write "<br>"
myResponse.Write "其中使用者年齡是" & ": " & myRequest.Cookies("age")
myResponse.Write "<br>"
End Sub
'元件中設定cookie,頁面中得到
Public Sub SetCookie()
myResponse.Cookies("com_username") = "龍捲風"
myResponse.Cookies("com_age") = 26
myResponse.Expires = #9/13/2004#
End Sub
編譯成Dll檔,系統自動會註冊。
否則就手工註冊Regsvr32 f:testfcom.dll
測試
打開visual interdev6.0,生成一個fz5.asp文件
配置好虛擬目錄,在ie中執行fc5.asp文件,可以看到
龍捲風
26
age: 26
username: 龍捲風
com_age: 26
com_username: 龍捲風其中用戶姓名是: 龍捲風其中用戶年齡是: 26
未完待續
Asp組件中級入門與精通系列之六
作為Asp的內置對象,我們最後來學習Server對象
Server對像用的比較多的就是Html編碼, Url編碼和網頁的重定向,傳送。
開啟vb6,新建Activex Dll工程。工程名修改為fCom,類別名稱修改為fZ6
引用“Microsoft Active Server Pages Object”物件庫。
建立兩個組件事件:OnStartPage以及OnEndPage
在事件OnStartPage中建立類別ScriptingContent的一個引用。
實例化類別ScriptingContent。
程式碼如下:
程式碼
Option Explicit
'對象的聲明
Dim myResponse As Response
Dim myRequest As Request
Dim myApplication As Application
Dim myServer As Server
Dim mySession As Session
'當元件被創建的時候會觸發這個事件
Public Sub OnStartPage(myScriptingContent As ScriptingContext)
'進行物件的實例化
Set myResponse = myScriptingContent.Response
Set myRequest = myScriptingContent.Request
Set myServer = myScriptingContent.Server
Set myApplication = myScriptingContent.Application
Set mySession = myScriptingContent.Session
End Sub
'當元件被銷毀的時候觸發這個事件
Public Sub OnEndPage()
'銷毀對象
Set myResponse = Nothing
Set myRequest = Nothing
Set myServer = Nothing
Set myApplication = Nothing
Set mySession = Nothing
End Sub
Public Sub ShowHtml(ByVal strHtml As String)
myResponse.Write myServer.HTMLEncode(strHtml)
End Sub
Public Sub ShowUrl(ByVal strUrl As String)
myResponse.Write myServer.URLEncode(strUrl)
End Sub
Public Sub ExecuteUrl()
myServer.Transfer "fz5.asp"
End Sub
編譯成Dll檔,系統自動會註冊。
否則就手動註冊Regsvr32 f:testfcom.dll
測試
打開visual interdev6.0,生成一個fz6.asp檔
配置好虛擬目錄,在ie中執行fc6.asp檔可以看到
呵呵測試一下
name=Mrs+%C1 %FA%BE%ED%B7%E7&age=26
可以使用IE的檢視原始檔來看HTML編碼
ASP的內建物件就暫時介紹到這裡,後面我們還會陸續的學習。
大家也可以舉一反三,學習沒有介紹的屬性和方法。
Asp組件中級入門與精通系列之七
開始資料庫操作。
常見的組件封裝
1.把資料庫的連接資訊封裝起來。
1> 直接傳回資料庫連接串,如,元件中
程式碼
Public Function datasource() As Variant
datasource = "driver={sql server};server=yang;uid=sa;pwd=; database=northwind"
End Function
asp
呼叫程式碼
set obj=server.CreateObject("webdb.getinfo")
oconn=obj.datasource()
這樣的缺點是很明顯的,在asp檔中,直接response.write oconn即可顯示出資料庫連接串,並沒有起到預期的作用。
2> 傳回adodb.connection物件
程式碼
Public Function GetConn() As ADODB.Connection
Set conn = New ADODB.Connection
conn.ConnectionString = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;password=;Initial Catalog=Northwind;Data Source=yang"
conn.Open
Set GetConn = conn
End Function
Asp
呼叫程式碼
Dim DataQuery
Set DataQuery=Server.CreateObject("WebDbtest.GetInfomation")
set rs=server.createobject("adodb.recordset")
sql="select * from employees"
Rs.open sql,DataQuery.getconn,1,3
response.Write Rs("LastName")
Response.write DataQuery.getconn.ConnectionString
set Rs=nothing
看起來不錯,只是Response.write DataQuery.getconn.ConnectionString還是會顯示出資料庫連接串,大家可以測試。
2.將元件封裝到記錄集可以看一下前段時間寫的http://blog.csdn.net/online/archive/2003/12/11/7764.aspx
這段程式碼不好的一點就是資料庫的連接放到了頁面中判斷,連接成功後,才開始存取數據,個人認為,最好的做法是:
封裝到記錄集,組件方法中連接資料庫,操作完後,及時關閉
盡量在元件中產生HTML程式碼,做到全部封裝。如下面的這種方式
而不是部分的封裝。
Asp組件中級入門與精通系列之八
這段時間一直比較忙,呵呵,今天我們來看一下一個完整的數據封裝的、帶分頁的例子
打開vb6,新建Activex Dll工程。工程名修改為fCom,類別名稱修改為fZ8
引用“Microsoft Active Server Pages Object”,”Microsoft Activex Data Object 2.7 Library”物件庫。
建立兩個組件事件:OnStartPage以及OnEndPage
在事件OnStartPage中建立類別ScriptingContent的一個引用。
實例化類別ScriptingContent。
程式碼如下:
程式碼
Option Explicit
'************************************************* *
'作者:龍捲風
'功能:簡單的可以自訂的,完全封裝的組件
'時間:2005-01-01
'************************************************* *
'物件的聲明
Dim MyResponse As Response
Dim MyRequest As Request
Dim myApplication As Application
Dim myServer As Server
Dim mySession As Session
'私有變數
Private mPageSize As Long
Private mstrSql As String
'當組件被創建的時候會觸發這個事件
Public Sub OnStartPage(myScriptingContent As ScriptingContext)
'進行物件的實例化
Set MyResponse = myScriptingContent.Response
Set MyRequest = myScriptingContent.Request
Set myServer = myScriptingContent.Server
Set myApplication = myScriptingContent.Application
Set mySession = myScriptingContent.Session
End Sub
'當元件被銷毀的時候觸發這個事件
Public Sub OnEndPage()
'銷毀對象
Set MyResponse = Nothing
Set MyRequest = Nothing
Set myServer = Nothing
Set myApplication = Nothing
Set mySession = Nothing
End Sub
'顯示Table
Public Function ShowTable()
Dim conn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim i As Integer
Dim j As Integer
Dim intPage As Integer
Dim intPageCount As Integer
Dim strScriptName As String
Dim intPos As Integer
Dim intFieldCount As Integer
'得到路徑
strScriptName = MyRequest.ServerVariables("Script_Name")
intPos = InStrRev(strScriptName, "/")
If intPos <> 0 Then
strScriptName = Mid(strScriptName, intPos + 1)
End If
If IsEmpty(MyRequest("page")) Then
intPage = 1
Else
intPage = CInt(MyRequest("page"))
End If
On Error GoTo err
conn.Open "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=Northwind;Data Source=localhost"
rs.Open mstrSql, conn, adOpenStatic, adLockReadOnly
'得到記錄數
intFieldCount = rs.Fields.Count
'輸出表格
MyResponse.Write "<table border=1 cellspacing=0 cellpadding=2>"
If Not rs.EOF Then
rs.PageSize = mPageSize
rs.AbsolutePage = intPage
'得到頁數
intPageCount = rs.PageCount
'處理分頁
If intPage < 1 Then intPage = 1
If intPage > intPageCount Then intPage = intPageCount
'輸出表頭
MyResponse.Write "<tr>"
For i = 0 To intFieldCount - 1
MyResponse.Write "<th>" & rs(i).Name & "</th>"
Next
MyResponse.Write "</tr>"
'輸出內容
For i = 1 To mPageSize
If rs.EOF Then
Exit For
End If
MyResponse.Write "<tr>"
For j = 0 To intFieldCount - 1
MyResponse.Write "<td>" & rs.Fields(j).Value & "</td>"
Next
MyResponse.Write "</tr>"
rs.MoveNext
Next
'輸出分頁
MyResponse.Write "<tr>"
If intPage <> 1 Then
MyResponse.Write "<a href=" & strScriptName & "?page=1>[第一頁]</a>"
MyResponse.Write "<a href=" & strScriptName & "?page=" & intPage - 1 & " >[上一頁]</a>"
End If
If intPage <> intPageCount Then
MyResponse.Write "<a href=" & strScriptName & "?page=" & intPage + 1 & ">[下一頁]</a>"
MyResponse.Write "<a href=" & strScriptName & "?page=" & intPageCount & ">[最後一頁]</a>"
End If
MyResponse.Write "頁次:<FONT COLOR='Red'>" & intPage & "/ " & intPageCount & "</FONT>"
MyResponse.Write "</tr>"
End If
MyResponse.Write "</table>"
'釋放資源
If Not rs Is Nothing Then
If rs.State = 1 Then
rs.Close
End If
Set rs = Nothing
End If
If Not conn Is Nothing Then
If conn.State = 1 Then
conn.Close
End If
Set conn = Nothing
End If
Exit Function
err:
MyResponse.Write err.Number & err.Description
If Not rs Is Nothing Then
If rs.State = 1 Then
rs.Close
End If
Set rs = Nothing
End If
If Not conn Is Nothing Then
If conn.State = 1 Then
conn.Close
End If
Set conn = Nothing
End If
End Function
'定義屬性
Public Property Get ShowPageSize() As Variant
ShowPageSize = mPageSize
End Property
Public Property Let ShowPageSize(ByVal vNewValue As Variant)
mPageSize = vNewValue
End Property
Public Property Get strSQL() As Variant
strSQL = mstrSql
End Property
Public Property Let strSQL(ByVal vNewValue As Variant)
mstrSql = vNewValue
End Property
編譯成Dll檔,系統自動會註冊。
否則就手動註冊Regsvr32 f:testfcom.dll
測試
打開visual interdev6.0,產生一個fz8.asp文件
程式碼
<%@ Language=VBScript %>
<HTML>
<BODY>
<%
dim obj
set obj=server.CreateObject("fcom.fz8")
'每頁顯示的記錄數
obj.ShowPageSize=10
'顯示的sql語句
obj.strSQL="select customerid,companyname,contactname,contacttitle,address from customers"
obj.ShowTable()
%>
</BODY>
</HTML>