Asp组件中级入门与精通系列

5/6/2009来源:ASP教程人气:11186

asp组件中级入门与精通系列之一

初级教程写了七篇了,肯定还有一些初级的东西需要写,我会慢慢的进行补充

中级教程的内容:

这可能也是大家最关心的:如:数据库的操作与封装。Asp内置对象的使用。这些部分我会花费较长的篇幅来说明,这一部分内容需要你能够比较熟练的使用ADO操作数据库并且对asp的5大对象比较熟悉。

我们看一下网上比较流传的一些资料:
众所周知,ASP内置了Response、Request、Server、sessionapplication五个对象,其实这五个内置对象正是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
For 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方式的
    For 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:\test\fcom.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:\test\fcom.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:\test\fcom.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>