马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
ASP最大的缺点在于网络的安全性和可靠性,企业将经营数据放在开放的平台上,最大的担忧就是如何保证这些数据不被其他人破坏。application|session|工具
本章已会商了两个ASP工具:Application工具和Session工具,因而可以会见Application工具和Session工具供应的汇合、办法、属性和事务。本节将从程序计划的角度对这两个工具举行研讨。
・当载进ASPDLL并呼应对一个ASP网页的第一个哀求时,创立Application工具。该工具供应一个存储场合,用来存储关于一切会见者翻开的一切网页都可用的变量和工具。
・当会见者初次从站点哀求一个ASP页面时,为他创立一个Session工具,并坚持无效直到缺省的超时周期(或由剧本断定的超时周期)。该工具供应一个存储场合,用来存储仅仅对该会见者在会话的举动时代翻开的网页可用的变量和工具。
-12(即-20)给出了用户的哀求和服务器的呼应在会话中的散布情形。一切的会话都在ASP使用程序中。
3.3.1ASP的Application工具成员概述
本节申明Application工具的汇合、办法和事务(Application工具没有属性)。鄙人一节对Session工具(具有属性)举行一样的申明。然后将持续切磋利用这些工具所完成的义务,更具体地申明每一个工具的各成员怎样举行事情。
1.Application工具的汇合
Application工具供应了两个汇合,能够用来会见存储于全局使用程序空间中的变量和工具。汇合及申明如表3-3所示:
表3-3Application工具的汇合及申明
集合
说明
Contents
没有利用<OBJECT>元素界说的存储于Application工具中的一切变量(及它们的值)的一个汇合。包含Variant数组和Variant范例工具实例的援用
StaticObjects
利用<OBJECT>元素界说的存储于Application工具中的一切变量(及它们的值)的一个汇合
2.Application工具的办法
Application工具的办法同意删除全局使用程序空间中的值,把持在该空间内对变量的并发会见。办法及申明如表3-4所示:
表3-4Application工具的办法及申明
方法
说明
Contents.Remove(“variable_name”)
从Application.Content汇合中删除一个名为variable_name的变量
Contents.RemoveAll()
从Application.Content汇合中删除一切变量
Lock()
锁定Application工具,使得只要以后的ASP页面临内容可以举行会见。用于确保经由过程同意两个用户同时地读取和修正该值的办法而举行的并发操纵不会损坏内容
Unlock()
排除对在Application工具上的ASP网页的锁定
注重,在运转时代不克不及从Application.StaticObjects汇合中删除变量。
3.Application工具的事务
Application工具供应了在它启动和停止时触发的两个事务,如表3-5所示:
表3-5Application工具的事务及申明
事件
说明
OnStart
当ASP启动时触发,在用户哀求的网页实行之前和任何用户创立Session工具之前。用于初始化变量、创立工具或运转其他代码
OnEnd
当ASP使用程序停止时触发。在最初一个用户会话已停止而且该会话的OnEnd事务中的一切代码已实行以后产生。其停止时,使用程序中存在的一切变量被作废
3.3.2ASP的Session工具成员概述
本节概述Session工具的一切成员。
1.Session工具的汇合
Session工具供应了两个汇合,能够用来会见存储于用户的部分会话空间中的变量和工具。这些汇合及申明如表3-6所示:
表3-6Session工具的汇合及申明
集合
说明
Contents
存储于这个特定Session工具中的一切变量和其值的一个汇合,而且这些变量和值没有利用<OBJECT>元素举行界说。包含Variant数组和Variant范例工具实例的援用
StaticObjects
经由过程利用<OBJECT>元素界说的、存储于这个Session工具中的一切变量的一个汇合
2.Session工具的特征
Session工具供应了四个属性。这些属性及申明如表3-7所示:
表3-7Session工具的属性及申明
属性
说明
CodePage
读/写。整型。界说用于在扫瞄器中显现页内容的代码页(CodePage)。代码页是字符集的数字值,分歧的言语和场合大概利用分歧的代码页。比方,ANSI代码页1252用于美国英语和年夜多半欧洲言语。代码页932用于日笔墨
LCID
读/写。整型。界说发送给扫瞄器的页面区域标识(LCID)。LCID是独一地标识区域的一个国际尺度缩写,比方,2057界说以后区域的泉币标记是£。LCID也可用于FormatCurrency等语句中,只需个中有一个可选的LCID参数。LCID也可在ASP处置指令<%…%>中设置,并优先于会话的LCID属性中的设置。本章前面供应一个ASP处置指令的列表
SessionID
只读。长整型。前往这个会话的会话标识符,创立会话时,该标识符由服务器发生。只在父Application工具的保存期内是独一的,因而当一个新的使用程序启动时可从头利用
Timeout
读/写。整型。为这个会话界说以分钟为单元的超时周期。假如用户在超时周期内没有举行革新或哀求一个网页,该会话停止。在各网页中依据必要能够修正。缺省值是10min。在利用率高的站点上该工夫应更短
3.Session工具的办法
Session工具同意从用户级的会话空间删除指定值,并依据必要停止会话。Seesion工具的办法及申明如表3-8所示:
表3-8Session工具的办法及申明
方法
说明
Contents.Remove(“variable_name”)
从Session.Content汇合中删除一个名为variable_name的变量
Contents.RemoveAll()
从Session.Content汇合中删除一切变量
Abandon()
当网页的实行完成时,停止以后用户会话并取消以后Session工具。但即便在挪用该办法今后,仍可会见该页中确当前会话的变量。当用户哀求下一个页面时将启动一个新的会话,并创建一个新的Session工具(假如存在的话)
注重,在运转时代不克不及从Session.StaticObjects汇合中删除变量。
4.Session工具的事务
Session工具供应了在启动和停止时触发的两个事务,如表3-9所示:
表3-9Session工具的事务及申明
事件
说明
OnStart
当ASP用户会话启动时触发,在用户哀求的网页实行之前。用于初始化变量、创立工具或运转其他代码。
OnEnd
当ASP用户会话停止时触发。从用户对使用程序的最初一个页面哀求入手下手,假如已超越预定的会话超时周期则触发该事务。当会话停止时,作废该会话中的一切变量。在代码中利用Abandon办法停止ASP用户会话时,也触发该事务
3.3.3利用Application和Session的事务
ASP的Application和Session工具表现了其他ASP内置工具所没有的特性――事务。但是,正像在后面的工具成员表中看到的那样,这些都是ASP会话和使用程序的事情相接洽的事务。
1.Application和Session的事务处置器
每当一个使用程序或会话启动或停止时,ASP触发一个事务。能够经由过程在一个特别的文件中编写一般的剧本代码来检测和应对这些事务,这个文件名为global.asa,位于一个使用程序的根目次中(关于缺省的Web网站是InetPubWWWRoot目次,或是作为一个实践使用程序界说的一个文件夹)。这个文件能够包括一个或多个HTML的<OBJECT>元素,用于创立将在该使用程序或用户会话内利用的组件实例。
在第4章中将具体地先容怎样创立组件实例。上面的代码是global.asa文件的一个例子。我们只存眷<OBJECT>元素和以Set关头字入手下手的那些代码行:
<!--DeclareinstanceoftheASPCountercomponent
withapplication-levelscope//-->
<OBJECTID=”ASPCounter”RUNAT=”Server”SCOPE=”Application”
PROGID=”MSWC.Counters”>
</OBJECT>
<!--DeclareinstanceoftheASPContentLimkcomponent
withsession-levelscope//-->
<OBJECTID=”ASPContentLink”RUNAT=”Server”SCOPE=”Session”
PROGID=”MSWC.NextLink”>
</OBJECT>
<SCRIPTLANGUAGE=”VBScript”RUNAT=”Server”>
SubApplication_onStart()
‘CreateaninstanceofanADORecordsetwithapplication-levelscope
SetApplication(“ADOConnection”)_
=Server.CreateObject(“ADODB.Connection”)
DimvarArray(3)‘CreateaVariantarrayandfillit
VarArray(0)=“Thisisa”
VarArray(1)=“Variantarray”
VarArray(2)=“storedinthe”
VarArray(3)=“Applicationobject”
Application(“Variant_Array”)=varArray‘StoreitintheApplication
Application(“Start_Time”)=CStr(Now)‘Storethedate/timeasastring
Application(“Visit_Count”)=0‘SetCountervariabletozero
EndSub
SubApplication_onEnd()
SetApplication(“ADOConnection”)=Nothing
EndSub
SubSesson_onStart()
‘CreateaninstanceoftheAdRotatorcomponentwithsession-levelscope
SetSession(“ASPAdRotator”)=Server.CreateObject(“MSWC.AdRotator”)
DimvarArray(3)‘CreateaVariantarryandfillit
VarArray(0)=“Thisisa”
VarArray(1)=“Variantarray”
VarArray(2)=“storedinthe”
VarArray(3)=“Sessionobject”
Session(“Variant_Array”)=varArray‘StoreitintheSession
Session(“Start_Time”)=CStr(Now)‘Storethedate/timeasastring
‘WecanaccessthecontentsoftheRequestandResponseinaSession_onStart
‘eventhandlerforthepagethatinitiatedthesession.Thisisthe*only*
‘placethattheASPpagecontextisavailablelikethis.
‘asanexample,wecangettheIPaddressoftheuser:
Session(“Your_IP_Address”)=Request.ServerVariables(“REMOTE_ADDR”)
Application.Lock
intVisits=Application(“Visit_Count”)+1
Application(“Visit_Count”)=intVisits
Application.Unlock
EndSub
SubSession_onEnd()
SetSession(“ASPAdRotator”)=Nothing
EndSub
</SCRIPT>
由于这个global.asa文件用于本章中的示例页面,以是将必要将该文件放到Web网站的根目次中,大概放到已设置为一个假造使用程序的目次中,而且在该目次中包括有其他示例文件。
读取和存储值
注重下面的例子如何读取Application和Session的变量,与在Request和Response工具的汇合中所接纳的体例不异。设置这些变量的值:
Application(“variable_name”)=variable_value
Application(“variable_name”)=variant_array_variable_name
SetApplication(“variable_name”)=object_reference
猎取这些变量的值:
variable_value=Application(“variable_name”)
variant_array_variable=Application(“variable_name”)
Setobject_reference=Application(“variable_name”)
固然,关于Session工具可接纳一样的办法。
能够看到,当从一个Session事务处置器会见时,如何“锁定”(Lock)和“解锁”(unlock)该Application工具;当从一个ASP网页会见时,必要举行不异的处置。用Application事务内的代码会见Application工具中的值时,不请求这么做。这是由于在任何使用程序中只要一个Application工具的实例,而且其事务处置器的代码只在没有举动的用户会话时举行。
也能够看到一个基础的用户会话计数器是怎样完成的。这里利用一个使用程序级的变量Visit_count,当新的会话启动时它就主动增添。一样平常也不限定复杂地把值保留到Application或Session工具中。比方,Web开辟者的Web站点在http://webdev.wrox.co.uk上,有响应的一个global.asa文件,当一个新的会话启动时该文件就在服务器上的数据库中写进响应的条目,数据细节从Request.ServerVariables汇合中猎取。这供应了一个基础的办法统计会见者的数目,并搜集会见者的一些基础信息。
2.创立Variant数组
在Session和Application工具中创立和利用一个Variant数组来存储值的办法今朝还没有会商,在这里作为一个十分有效的手艺举行会商。正如已看到的那样,一个Variant数据范例能够包括一个数组,而不单单是一个值。
一个数组只是在内存的一个一连地区中以指定的序次存储二进制值的一个长行。要布置Variant,必要指向首项,并给出有关巨细和布局的信息,剧本引擎能够做余下的事变。
可在一个Variant变量中创立一维、二维或多维数组,然后把该数组分派给一个使用程序层或用户会话层的变量,并包管全部数组可在响应的中央利用。上面代码演示了一个复杂的一维数组的利用手艺:
DimvarArray(3)
varArray(0)=“Thisisa”
varArray(1)=“Variantarray”
varArray(2)=“storedinthe”
varArray(3)=“Sessionobject”
Session(“Variant_Array”)=varArray
3.使用程序和会话在什么时候启动和停止
在先容ASP使用程序和会话怎样举行事情时提到过这个内容。以最基础的术语概述以下:
・当第一个用户哀求使用程序感化域内(即Web网站的缺省根目次内),大概在该网站的一个子目次内的一个用户界说的假造使用程序的一个ASP网页时,启动该使用程序。在任何用户会话启动之前产生。
・当恣意用户第一次哀求在缺省使用程序或一个假造使用程序内的一个ASP网页时,启动一个会话(假如还没一个举动的会话)。
・当用户在会话指定的超时周期内没有下载一个ASP网页时,会话停止。超不时间能够在剧本代码中利用Session.Timeout属性举行设置,可在Properties对话框中对各个使用程序独自设置,大概经由过程ActiveDirectory的IIS:部分修正IIS元数据库中的缺省值举行设置。挪用Session.Abandon办法的一个网页完成实行今后,会话也会停止。
・在一个使用程序中的最初一个举动会话停止今后,该使用程序当即停止。
4.ASP处置指令
正如在第1章中所看到的,能够把一条处置指令增添到一个ASP网页。处置指令能够依据必要包括一个以上的条目。能够在语句中利用的关头字及其申明如表3-10所示:
表3-10ASP指令关头字及申明
指令关头字
说明
LANGUAGE=”language_name”
设置该网页的缺省的剧本言语,如:<%@LANGUAGE=”VBScript”%>
ENABLESESSIONSTATE=”True”|”Fasle”
当设置为“True”时,避免一个会话的cookie发送到扫瞄器,因而将不会创立新的Session工具,任何现有会话的内容将不再可用
CODEPAGE=”code_page”
设置该网页的代码页,如<%@CODEPAGE=”1252”%>
LCID=”locale_identifier”
设置该网页的地位标识符,如<%@LCID=”2057”%>
TRANSACTION=”transaction_type”
指明该网页文件在一个事件情况下运转。无效值是:
“Required”:假如已有可用的事件,剧本将在个中运转;假如没有可用的事件,启动一个新的事件。
“Requires_New”:剧本将初始化一个新的事件。
“Supported”:假如已有可用的事件,剧本将在个中运转;并且不启动一个新的事件。
“Not_Supported”:剧本将不运转于任何已有的事件中,而且不初始化一个新的事件。
在第18章中具体先容事件。
在一个网页上只能同意有一条处置指令,而且应当放在第一行。在处置指令中能够包括不止一个如许的条目,但必需用空格举行分开,等号两头不克不及有空格,比方:
<%@LANGUAGE=”VBScript”CODEPAGE=”1252”LCID=”2057”%>
3.3.4举动的ASPApplication工具
我们供应一些复杂的网页,这些网页树模了利用过程当中的ASPApplication和Session工具。为了可以一般利用,必需把它们放到服务器上的一个假造使用程序内,而且把所供应的global.asa文件放到该使用程序的根目次中。最复杂的举措是把global.asa文件放到缺省Web网站的根目次(缺省情形下是C:/InetPub/WWWRoot)中。
对任何已有的global.asa文件重定名是一个好举措,能够在今后对该文件举行恢复。
本书的一切例子文件都能够从我们的Web网站上失掉,在例子的Chapter03子目次中另有本章的一切其他示例网页。
在Chapter03子目次中,Default.asp网页是一个复杂的菜单,该菜单同意运转Application和Session示例网页,运转屏幕如-13所示:
1.显现Application汇合的内容
单击第一个链接,翻开名为show_application.asp的Application工具示例页面。它显现了假造使用程序以后的Application工具的内容,如-14所示:
注重到ASPCounter工具是StaticObjects汇合的一个成员(经由过程<OBJECT>元素举行界说),可是其他部分(由Server.CreateObject实例化)是Contents汇合的成员。
能够看到利用global.asa例子网页放到这些汇合中的值,这在后面已看到:
<!--DeclareinstanceoftheASPCountercomponentwith
application-levelscope//-->
<OBJECTID=”ASPCounter”RUNAT=”Server”SCOPE=”Applicatoin”
PROGID=”MSWC.Counters”>
</OBJECT>
...
...
<SCRIPTLANGUAGE=”VBScript”RUNAT=”Server”>
SubApplication_onStart()
‘CreateaninstanceofanADOConnectionwithapplication-levelscope
SetApplication(“ADOConnection”)=Server.CreateObject(“ADODB.Connection”)
DimvarArray(3)‘CreateaVariantarrayandfillit
varArray(0)=“Thisisa”
varArray(1)=“Variantarray”
varArray(2)=“storedinthe”
varArray(3)=“Applicationobject”
Application(“Variant_Array”)=varArray‘StoreitinthdApplication
Application(“Start_Time”)=CStr(Now)‘Storethedate/timeasastring
Application(“Visit_Count”)=0‘Setcountervariabletozero
EndSub
...
...
</SCRIPT>
(1)遍历Contents汇合的代码
为了遍历Contents汇合,可以使用一个ForEach...Next布局。汇合中的每项能够是一个复杂的Variant范例变量、一个Variant数组大概一个工具的援用。由于必要对每品种型的值举行分歧的处置,以是就不能不对每个举行反省来辨别其范例。
在VBScript中可以使用VarType函数完成这个事情。这里利用IsObject和IsArray函数取代:
ForEachobjIteminApplication.Contents
IfIsObject(Application.Contents(objItem))Then
Response.Write“Objectreference:‘”&objItem&“
”
ElseIfIsArray(Application.Contents(objItem))Then
Response.Write“Array:‘”&objItem&“contentsare:
”
VarArray=Application.Contents(objItem)
‘Note:thefollowingonlyworkswithaone-dimensionalarray
ForintLoop=0ToUBound(varArray)
Response.Write“Index(“&intLoop&“)=“&_
VarArray(intLoop)&“
”
Next
Else
Response.Write“Variable:‘”&objItem&“=“_
&Application.Contents(objItem)&“
”
EndIf
Next
注重程序怎样从Application工具检索该数组。将其分派给一个部分(Variant)变量,利用上面的语句:
varArray=Application.Contents(objItem)
利用UBound函数能够查找出数组的巨细(元素的数目),这个值能够作为遍历的停止前提:
ForintLoop=0UBound(varArray)
这个例子是一维数组,并将只显现如许的一个数组的内容。可依据必要编纂代码以处置多维数组,比方:
ForintLoop=0ToUBound(varArray)
IntNumberOfDimensions=UBound(varArray,1)
ForintDimension=0TointNumberOfDimensions
Response.Write“Index(“&intLoop&“)=“_
&varArray(intLoop,intDimension)
Next
Response.Write“
”
Next
(2)遍历StaticObjects汇合的代码
StaticObjects汇合包括了一切在global.asa中利用<OBJECT>元素声明的工具援用。由于每一个条目都是一个工具变量,可用复杂些的代码对这个数组举行遍历。我们将输入工具的名字(在ID属性华夏有的界说):
ForEachobjIteminApplication.StaticObjects
IfIsObject(Application.StaticObjects(objItem))Then
Response.Write“<OBJECT>element:ID=”&objItem&“
”
EndIf
Next
(1)遍历Contents汇合的代码
为了遍历Contents汇合,可以使用一个ForEach...Next布局。汇合中的每项能够是一个复杂的Variant范例变量、一个Variant数组大概一个工具的援用。由于必要对每品种型的值举行分歧的处置,以是就不能不对每个举行反省来辨别其范例。
在VBScript中可以使用VarType函数完成这个事情。这里利用IsObject和IsArray函数取代:
ForEachobjIteminApplication.Contents
IfIsObject(Application.Contents(objItem))Then
Response.Write“Objectreference:‘”&objItem&“
”
ElseIfIsArray(Application.Contents(objItem))Then
Response.Write“Array:‘”&objItem&“contentsare:
”
VarArray=Application.Contents(objItem)
‘Note:thefollowingonlyworkswithaone-dimensionalarray
ForintLoop=0ToUBound(varArray)
Response.Write“Index(“&intLoop&“)=“&_
VarArray(intLoop)&“
”
Next
Else
Response.Write“Variable:‘”&objItem&“=“_
&Application.Contents(objItem)&“
”
EndIf
Next
注重程序怎样从Application工具检索该数组。将其分派给一个部分(Variant)变量,利用上面的语句:
varArray=Application.Contents(objItem)
利用UBound函数能够查找出数组的巨细(元素的数目),这个值能够作为遍历的停止前提:
ForintLoop=0UBound(varArray)
这个例子是一维数组,并将只显现如许的一个数组的内容。可依据必要编纂代码以处置多维数组,比方:
ForintLoop=0ToUBound(varArray)
IntNumberOfDimensions=UBound(varArray,1)
ForintDimension=0TointNumberOfDimensions
Response.Write“Index(“&intLoop&“)=“_
&varArray(intLoop,intDimension)
Next
Response.Write“
”
Next
(2)遍历StaticObjects汇合的代码
StaticObjects汇合包括了一切在global.asa中利用<OBJECT>元素声明的工具援用。由于每一个条目都是一个工具变量,可用复杂些的代码对这个数组举行遍历。我们将输入工具的名字(在ID属性华夏有的界说):
ForEachobjIteminApplication.StaticObjects
IfIsObject(Application.StaticObjects(objItem))Then
Response.Write“<OBJECT>element:ID=”&objItem&“
”
EndIf
Next
1.增添值到Contents汇合
增添值到Contents汇合的办法,与在global.asa网页的剧本代码中利用过的办法不异。示例网页同意把一个新的Variant值增添到Application工具中,并已有倡议的名字和值(可依据必要举行编纂),如-15所示:
单击按钮,从头载进这个网页,把值增添到Application.Contents汇合中,而且在列表中显现,如-16所示:
增添新的Contents条目标代码
一切的按钮和其他HTML控件安排在示例网页中的一个窗体上。ACTION设置了以后网页的路径,提交该窗体时,从头装进。METHOD属性为“POST”,以是控件中的值呈现在Request.Form汇合中。在之前的章节中接纳过这两种手艺:
<FORMACTION=”<%=Request.ServerVariables(“SCRIPT_NAME”)%>”METHOD=”POST”>
该窗体上的按钮都是一般的HTMLINPUT控件,具有不异的题目(三个空格)但名字分歧。比方,创立第一个按钮(把值增添到Application工具中)的代码是:
<INPUTTYPE=”SUBMIT”NAME=”cmdAdd”VALUE=””>
从头载进该网页时,反省Request.Form汇合,判断单击的是哪一个SUBMIT按钮,并举行响应的处置。假如是增添一个值到Application工具的按钮(该按钮在HTML的<INPUT>元素中被定名为cmdAdd),利用上面的程序段:
IfLen(Request.Form("cmdAdd"))Then
strVarName=Request.Form("txtVarName")
strVarValue=Request.Form("txtVarValue")
Application.Lock
Application("strVarName")=strVarValue
Application.Unlock
EndIf
注重程序怎样利用Application.Lock和Application.Unlock办法,确保这些值不会因两个用户并发地会见而发生凌乱。假如只是对一个特定的值举行设置,一样平常不成能产生这类情形。但一向利用Lock和Unlock办法是明智的。
2.Contents汇合中删除值
在例子网页的底部有两个按钮,如-17所示:
这两个按钮同意从Application.Contents汇合中删除值。第一个按钮从汇合中删除单个的指定值,下拉列表框显现的是Contents汇合值的名字的列表(记着,不克不及从StaticObjects汇合中删除值,由于它们是静态的)。
经由过程遍历Contents汇合(如后面我们所做的)实行ASP网页时,创立该列表。可是,我们仅搜集每项的名字并把它们放到<SELECT>列表元素内的<OPTION>元素中:
…
<SELECTNAME=”lstRemove”SIZE=”1”>
<%
ForEachobjIteminApplication.Contents
Response.Write“<OPTION>”&objItem&“</OPTION>”
Next
&>
</SELECT>
…
该ASP代码实行今后,在扫瞄器中看到的了局是:
<SELECTNAME=”lstRemove”SIZE=”1”>
<OPTION>ADOConnection</OPTION>
<OPTION>Variant_Array</OPTION>
<OPTION>Start_Time</OPTION>
<OPTION>Visit_Count</OPTION>
<OPTION>My_New_Value</OPTION>
</SELECT>
(1)删除单个值
当单击按钮删除单个值时,该窗体再次提交给不异的网页,可是这一次将查找名为cmdRemoveThis的SUBMIT按钮。假如存在(即单击了这个按钮),则利用列表框的值,挪用Application.Contents汇合的Remove办法:
IfLen(Request.Form("cmdRemoveThis"))Then
strToRemove=Request.Form("lstRemove")
Response.Write"strToRemove="&strToRemove
Application.Lock
Application.Contents.Remove(strToRemove)
Application.Unlock
EndIf
注重这是Contents汇合的一个办法,而不是Application工具的。语法是Application.Contents.Remove,而不是Application.Remove。
从Contents汇合中删除Start_Time值的了局如-18所示:
(2)删除一切的值
假如单击三个SUBMIT范例按钮中的最初一个(如-18所示),该网页中的代码将检测到单击的按钮为cmdRemoveAll,将实行Application.Contents汇合的RemoveAll办法:
IfLen(Request.Form("cmdRemoveAll"))Then
Application.Lock
Application.Contents.RemoveAll
Application.Unlock
EndIf
再次提示,这是Contents汇合的一个办法,而不是Application。语法是Application.Contents.RemoveAll,而不是Application.RemoveAll。
-19所示的是从Contents汇合中删除一切值的了局(记着在运转工夫不克不及从StaticObjects汇合删除项):
3.3.5举动中的ASPSession工具
示例网页的第二个示例页面show_session.asp,树模了怎样利用Session工具。可在Chapter03子目次中的入手下手菜单(Default.asp)中翻开它。
1.显现和更新Session汇合
Session工具示例页面看起来与方才利用过的Application工具示例页面类似。它遍历Session工具的Contents和StaticObjects汇合,显现其名字和(大概的话)响应的值。假如把这些值与Application工具页面举行对照,将会看到分歧的地方。
这里还可以看到客户端IP地点的一些其他值。这是当会话启动时global.asa中的代码从Request.ServerVariables汇合中失掉的。这个页面还显现四个会话属性的值,如-20所示:
上面是例子中利用的golbal.asa文件的相干段落,它把缺省值增添到-20所示的屏幕上所看到的会话中:
...
<!--DeclareinstanceoftheASPContentLinkcomponent
withsession-levelscope//-->
<OBJECTID="ASPContentLink"RUNAT="Server"SCOPE="Session"
PROGID="MSWC.NextLink">
</OBJECT>
<SCRIPTLANGUAGE="VBScript"RUNAT="Server">
...
...
SubSession_onStart()
CreateaninstanceoftheAdRotatorcomponentwithsession-levelscope
SetSession("ASPAdRotator")=Server.CreateObject("MSWC.AdRotator")
DimvarArray(3)CreateaVariantarrayandfillit
varArray(0)="Thisisa"
varArray(1)="Variantarray"
varArray(2)="storedinthe"
varArray(3)="Sessionobject"
Session("Variant_Array")=varArrayStoreitintheSession
Session("Start_Time")=CStr(Now)Storethedate/timeasastring
WecanaccessthecontentsoftheRequestandResponseinaSession_onStart
eventhandlerforthepagethatinitiatedthesession.Thisisthe*only*
placethattheASPpagecontextisavailablelikethis.
asanexample,wecangettheIPaddressoftheuser:
Session("Your_IP_Address")=Request.ServerVariables("REMOTE_ADDR")
Application.LockPreventconcurrentupdates
intVisits=Application("Visit_Count")+1Incrementcountervariable
Application("Visit_Count")=intVisitsStorebackinApplication
Application.UnlockReleaselockonApplication
EndSub
...
...
</SCRIPT>
遍历Contents和StaticObjects汇合的代码与后面在Application工具示例中利用的代码一样,只不外这里援用了Session.Contents和Session.StaticObjects汇合,而不是Application.Contents和Appliction.StaticObjects汇合。
接近页面底部的按钮的功效是把值增添到Session.Contents汇合和从Session.Contents汇合删除值。这些按钮与在Application工具示例页面中响应的按钮事情体例不异,这里会见的是Session.Contents汇合,和响应的Remove和RemoveAll办法。我们不再反复注释。
2.停止一个用户会话
在Session工具页面的底部有一个按钮,该按钮停止以后的用户会话,这经由过程挪用Session工具的Abandon办法完成。它与其他的HTML控件在不异的窗体上,名为cmdAbandon。当该窗体再次被提交给这个网页时,在Request.Form汇合中查找这个值(好像在Application工具例子中做的一样)。如发明这个值,则将该用户重定向到另外一个网页:
IfLen(Request.Form("cmdAbandon"))Then
Response.Clear
Response.Redirect"abandon.asp"
Response.End
EndIf
新的页面名为abandon.asp,非常复杂,除创立动静的文本和HTML之外只要以下的代码:
<%Session.Abandon%>
该网页的其他部分只是一个包括单个SUBMIT按钮的窗体。注重怎样利用来自Request.ServerVariables汇合的援用网页(HTTP_REFERER)的URL的值,以确珍重新载进前一个网页(Session工具例子网页):
<FORMACTION="<%=Request.ServerVariables("HTTP_REFERER")%>"METHOD="POST">
<DIVCLASS="subhead">YourSessionHasBeenTerminated</DIV>
Anew<B>Session</B>willbestartedwhenyouloadanother
ASPpage.Itwillcontainanyvaluesthataredefinedin
the<B>global.asa</B>fileforthisapplication.
<INPUTTYPE="SUBMIT"NAME="cmdOK"VALUE="">
Returntothepreviouspage
</FORM>
了局如-21所示。这时候,以后的用户会话已被停止(保持),而且该用户不克不及援用本来的Session汇合或属性的内容:
但是,记着这统统是在挪用Abandon办法的网页实行时,乃至在对该办法的挪用已完成今后,仍可以从Session工具中取得用户的会话内容。当此网页停止时,会话才停止。
固然,当前往到显现会话内容的Session工具示例网页时,将启动一个新的ASP会话。它将有一个分歧的Start_Time值和经由过程实行global.asa中的代码创立的其他缺省的会话值,如-22所示:
注重,Session.SessionID属性值没有改动。ASP试图从头分派不异的会话ID,因而不克不及依托该值来判断一个新的会话已启动。
3.4小结
本章先容了两个ASP内置工具:Application和Session工具。这些工具引进了ASP的使用程序和用户会话的观点(二者都是特定的术语,而且不是一般发言时的意义)。ASP使用程序同意分派专门的属性给页面集,界说了IIS和ASP怎样办理这些网页及所利用的其他组件。
但是,利用ASP使用程序和会话的次要缘故原由是必要主动地取得形态。换句话说,存储信息和变量援用的才能,要末对用户装载的一切网页是全局和可用的(即在一个使用程序中),要末仅仅对一个指定的用户的一切网页是可用的(在一个会话中)。这使创建Web使用程序变得十分复杂(即使用程序在Web上事情,但可以像传统的编译的使用程序一样能完成指定的义务)。
本章经由过程一些示例页面,具体先容怎样利用ASP的Application和Session工具。这些页面树模了这两个工具可用的一切手艺。
源代码保护方面其实现在考虑得没那么多了..NET也可以反编译.ASP写得复杂的话别人能看得懂的话.他也有能力自己写了.这方面担心的倒不太多.纵观现在网上可以下载的那些所谓BBS还有什么网站等等的源代码 |