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
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: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>