附录B 快速学会ASP内建物件
本章介绍Active Server Pages七个内建物件的技巧,包括Application物件、Session物件、Request物件、Response物件、Server物件、ObjectContext物件、ASPError物件、伺服器#指令、ASP @指令等。
ASP内建物件
Active Server Pages 3.0提供七个内建的「物件」(object),提供应用程式共同资讯(Application物件)、存放使用者相关的资讯(Session物件)、接收浏览器传送过来的输入资讯(Request物件)、回应输出资料给浏览器(Response物件)、存取伺服器资讯(Server物件)、交易处理(ObjectContext物件)、ASP错误资讯(ASPError物件)等功能,如下:
於内建的物件中,IIS 5.0比IIS 4.0所新增加的功能如下:
这些物件,由於是内建於Active Server Pages,因此不须另外加予定义,即可直接使用。
本章将详细介绍如下。
B-1 如何使用Application物件呢?
使用Application物件,可以让一个应用程式(Application)的所有使用者都可以使用共同之资讯。
对於一个应用程式而言,所有的档案位於一个虚拟路径(virtual path)及其子目录下。
因为Application物件,可以让多个使用者共同使用资讯,因此提供「Lock」、和「Unlock」方法,来避免多个使用者同时修改同一个共同之资讯。
IIS 5.0新增加Application.Contents集合、Application.StaticObjects集合、Application.Contents.Remove方法、Application.Contents.RemoveAll方法。
Application物件的语法,如下:
Application [.collection | .method | _events]
储存共同变数值
Application物件,可以储存变数值,让同一个应用程式中的所有asp程式中的所有使用者共同使用。譬如:
<% Application("greeting")= "欢迎光临!" Application("no")= 125 %>
则同一个应用程式的所有asp程式,都可以读到在Application("greeting")变数所设定的值。
每一个Application变数,都视为Application Contents集合(Collection)成员之一。
访客计数器范例
譬如使用Visiters储存访客计数器的值,并使用Lock方法以禁止别的使用者修改访客计数器的值:
<% Application.Lock Application("Visiters")= Application("Visiters")+ 1 Application.Unlock %> 您是第 <%= Application("Visiters")%> 位访客!
於浏览器执行Application1.asp两次後,显示如下:
Set Application
您可以使用「Set Application」来定义适用於一个Application的ASP元件。譬如:
<% Set Application("Obj1")= Server.CreateObject("MyComponent")%>
定义後即可使用ASP元件的方法。譬如:
<% Application("Obj1").MyObjMethod %>
或复制到另外一个物件,再使用其方法。譬如:
<% Set MyLocalObj1 = Application("Obj1") MyLocalObj1.MyObjMethod %>
定义适用於一个Application共同ASP元件的另外一个之方式,为在Global.asa档案中使用 <OBJECT> 标记,SCOPE指定为Application。如下:
<OBJECT RUNAT=Server SCOPE=Application ID=MyAd1 CLASSID=" Clsid:00000293-0000-0010-8000-00AA006D2EA4"> </OBJECT>
每一个使用 <OBJECT> 标记定义的Application变数,都视为Application StaticObjects集合(Collection)成员之一。
储存内建的物件
asp内建的物件,不能储存於Application物件。譬如以下将发生错误:
<% Set Application("var1")= Session Set Application("var2")= Request Set Application("var3")= Response Set Application("var4")= Server Set Application("var5")= Application %>
仅有标示「 free- threaded」、「apartment - threaded」的物件,可以储存於Application物件中。
使用阵列
若您於Application物件中使用阵列,不可直接修改阵列成员的值。譬如以下将发生错误:
<% Application("StoredArray")(3)= "new value" %>
这是因为Application物件为一个collection,StoredArray(3)不可接受新值。
建议您修改阵列成员的值後,再将阵列储存於Application物件。譬如:
<% '产生和起始阵列 dim MyArray() Redim MyArray(5) MyArray(0)= "hello" MyArray(1)= "some other string" '阵列储存於Application物件 Application.Lock Application("StoredArray")= MyArray Application.Unlock Response.Redirect("file2.asp") %>
file2.asp程式码:
<% '从Application物件取得阵列 LocalArray = Application("StoredArray") '修改阵列成员的值 LocalArray(1)= " there" '显示"hello there" Response.Write(LocalArray(0)& LocalArray(1)) '再将阵列储存於Application物件 Application.Lock Application("StoredArray")= LocalArray Application.Unlock %>
Application物件的集合(collections)、属性(properties)、方法(methods)、事件(events)详述如下。
■ Application.Contents集合
Application.Contents集合包含所有已经被定义的Application资讯,但是不包括於Global.asa档案中由<OBJECT>所定义的部份。
Application.Contents集合的Application资讯,可以使用Application.Contents.Remove方法、Application.Contents.RemoveAll方法以移除一个或所有Application的资讯。
Application.Contents集合支援For...Each和For...Next语法,如下:
<%
Application("A")= "123"
Application("B")= "456"
Application("C")= "789"
For Each Key in Application.Contents
Response.Write Key + " = " + Application(Key)+ "<BR>"
Next
%>
将显示结果,如下:
将For...Each改用如下的For...Next语法,将显示相同结果:
<%
For i = 1 to Application.Contents.Count
Response.Write CStr(i)+ " = " + Application.Contents(i)+ "<BR>"
Next
%>
显示结果,如下:
■ Application.StaticObjects集合
Application.StaticObjects集合包含所有Global.asa档案中由<OBJECT>所定义的Application资讯。
Application.StaticObjects集合的<OBJECT>,系於Global.asa中定义,SCOPE指定为Application,如下:
<OBJECT RUNAT=Server SCOPE=Application ID=MyAd1 CLASSID=" Clsid:00000293-0000-0010-8000-00AA006D2EA4"> </OBJECT>
Application.StaticObjects集合的Application资讯,不受Application.Contents.Remove方法、Application.Contents.RemoveAll方法的影响。
Application.StaticObjects集合支援For...Each和For...Next语法,如下:
<%
For Each strKey In Application.StaticObjects
Response.Write strKey & " = <i>OBJECT</i><BR>"
Next
%>
由於已经在Global.asa中定义一个<OBJECT RUNAT=Server SCOPE=Application>,因此将显示结果,如下:
■ Application.Contents.Remove方法
Application.Contents.Remove方法移除Application.Contents集合中一个Application的资讯。
语法,如下:
Application.Contents.Remove(name|index)
其中Name为变数名称,index为变数索引值。
譬如:
<% Application("StrA")= "字串A" Application("StrB")= "字串B" Response.Write "未移除: " & Application("StrA")& Application("StrB")& "<BR>" Application.Contents.Remove("StrA") Response.Write "移除StrA: " & Application("StrA")& Application("StrB")& "<BR>" %>
表示移除Application("StrA")的资讯。执行後将显示结果,如下:
■ Application.Contents.RemoveAll方法
Application.Contents.RemoveAll方法移除Application.Contents集合中所有Application的资讯。
语法,如下:
Application.Contents.RemoveAll()
譬如:
<% Application("StrA")= "字串A" Application("StrB")= "字串B" Response.Write "未移除: " & Application("StrA")& Application("StrB")& "<BR>" Application.Contents.RemoveAll() Response.Write "移除ALL: " & Application("StrA")& Application("StrB")& "<BR>" %>
表示移除Application("StrA")、Application("StrB")等所有Application的资讯。执行後将显示结果,如下:
■ Application.Lock方法
使用Lock方法,以禁止别的使用者修改Application的资讯,来避免多个使用者同时修改同一个资讯。
呼叫Lock方法後,若未呼叫Unlock方法,则当此asp程式执行结束时或times out时,伺服器将自动Unlock。
语法,如下:
Application.Lock
譬如:
<% Application.Lock Application("Visiters")= Application("Visiters")+ 1 Application.Unlock %>
您是第 <%= Application("Visiters")%> 位访客!
将访客计数器加1时,使用Lock方法以禁止别的使用者修改访客计数器的值。执行後将显示结果,如下:
■ Application.Unlock方法
使用Unlock方法,以允许别的使用者修改Application的变数资讯。
呼叫Lock方法後,若未呼叫Unlock方法,则当此asp程式执行结束时或times out时,伺服器将自动Unlock。
注意若同一只asp程式呼叫Application.lock了数次,须同样呼叫Application.Unlock数次,才能Unlock解除,否则须等到此asp程式执行结束时或times out时自动Unlock。
语法,如下:
Application.Unlock
譬如:
<% Application.Lock Application("Visiters")= Application("Visiters")+ 1 Application.Unlock %>
您是第 <%= Application("Visiters")%> 位访客!
将访客计数器加1後,使用Unlock方法以允许下一个使用者修改访客计数器的值。
■ Application_OnStart事件
启动一个Application应用程式时,将触发执行Application_OnStart的事件。触发Application_OnStart事件的执行程式,定义於Global.asa档案中。
一个Application应用程式第一个新的session(第一个使用者使用)产生时,将先触发执行Application_OnStart事件,再执行Session_OnStart事件。因此於Application_OnStart事件的程式中若参考到Session_OnStart的程式,将发生错误。
因Application_OnStart只会执行一次,於Application_OnStart设定Application变数时,不需要使用Application.Lock和Application.Unlock。
语法,如下:
<SCRIPT LANGUAGE=ScriptLanguage RUNAT=Server> Sub Application_OnStart . . . End Sub </SCRIPT>
■ Application_OnEnd事件
结束一个application应用程式时,将触发执行Application_OnEnd的程序。触发Application_OnEnd事件的执行程式,定义於Global.asa档案中。
语法,如下:
<SCRIPT LANGUAGE=ScriptLanguage RUNAT=Server> Sub Application_OnEnd . . . End Sub </SCRIPT>
Application_OnEnd事件的程式中,不可呼叫Server.MapPath方法。
B-2 如何使用Session物件呢?
Session物件,管理仅适用於一个使用者使用一个应用程式的资讯。一个Session仅属於一个使用者。
一个使用者第一次进入一个应用程式浏览网页时,将产生一个新的Session物件。
储存於Session物件的变数值,当使用者浏览多个网页时,仍然会被保留,而可以使用於整个Session。
当Session超过timeout时间、或被放弃(Abandon方法)时, 将被破坏而结束一个Session。
若使用者的浏览器支援cookie的功能,才可以使用Session物件的功能。
IIS 5.0新增了Session.Contents集合、Session.StaticObjects集合、Session.Contents.Remove方法、Session.Contents.RemoveAll方法。
语法,如下:
Session [.collection | .method | _events]
Session范例
譬如:
<% Session("name")= "MyName" Session("year")= 96 Set Session("myObj")= Server.CreateObject("someObj") %>
储存使用者变数值
Session物件,可以储存一个使用者的变数值,让使用者所浏览的多个网页共同使用。譬如:
<% Session("username")= "Jack" Session("age")= 14 %>
每一个Session变数,都视为Session Contents集合(Collection)成员之一。
Set Session
可以使用「Set Session」,定义一个适用於Session的ASP元件。譬如:
<% Set Session("Obj1")= Server.CreateObject("MyComponent")%> 定义後即可使用ASP元件的方法。譬如:
<% Session("Obj1").MyObjMethod %>
或复制到另外一个物件,再使用其方法。譬如:
<% Set MyLocalObj1 = Session("Obj1") MyLocalObj1.MyObjMethod %>
另外一个定义一个适用於Session的ASP元件方式,为在Global.asa档案中使用 <OBJECT> 标记,SCOPE指定为Session。如下:
<OBJECT RUNAT=Server SCOPE=Session ID=MyAd2 PROGID="MSWC.Adrotator"> </OBJECT>
每一个使用 <OBJECT> 标记定义的Session变数,都视为Session StaticObjects集合(Collection)成员之一。
储存内建的物件
不能储存内建的ASP物件於Session物件。譬如以下将发生错误:
<% Set Session("var1")= Session Set Session("var2")= Request Set Session("var3")= Response Set Session("var4")= Server Set Session("var5")= Application %>
仅有标示「 free- threaded」、「apartment - threaded」的物件,可以储存於Session物件中。
使用阵列
若您於Session物件中使用阵列,不可直接修改阵列成员的值。譬如以下将发生错误:
<% Session("StoredArray")(3)= "new value" %>
这是因为Session物件为一个collection,StoredArray(3)不可接受新值。
建议您修改阵列成员的值後,再将阵列储存於Session物件。譬如:
<% '产生和起始阵列 dim MyArray() Redim MyArray(5) MyArray(0)= "hello" MyArray(1)= "some other string" '阵列储存於Session物件 Session("StoredArray")= MyArray Response.Redirect("file2.asp") %>
file2.asp程式码:
<% '从Session物件取得阵列 LocalArray = Session("StoredArray") '修改阵列成员的值 LocalArray(1)= " there" '显示"hello there" Response.Write(LocalArray(0)&LocalArray(1)) '再将阵列储存於Session物件 Session("StoredArray")= LocalArray %>
Session物件的集合(collections)、属性(properties)、方法(methods)、事件(events)详述如下。
■ Session.Contents集合
Session.Contents集合包含所有已经被定义的Session资讯,但是不包括Global.asa档案中由<OBJECT>所定义的部份。
Session.Contents集合的Sessionn资讯,可以使用Session.Contents.Remove方法、Session.Contents.RemoveAll方法,以移除一个或所有Session的资讯。
Session.Contents集合支援For...Each和For...Next语法,如下:
<%
Session("A")= "123"
Session("B")= "456"
Session("C")= "789"
For Each Key in Session.Contents
Response.Write Key + " = " + Session(Key)+ "<BR>"
Next
%>
执行session1.asp後将显示结果,如下:
将For...Each改用For...Next语法如下,将显示相同结果:
<%
For i = 1 to Session.Contents.Count
Response.Write CStr(i)+ " = " + Session.Contents(i)+ "<BR>"
Next
%>
执行後将显示结果,如下:
■ Session.StaticObjects集合
Session.StaticObjects集合包含Global.asa档案中所有由<OBJECT>所定义的Session资讯。
<OBJECT>系於Global.asa中定义,SCOPE指定为Session,如下:
<OBJECT RUNAT=Server SCOPE=Session ID=MyAd2 PROGID="MSWC.Adrotator"> </OBJECT>
Session.StaticObjects集合的Session资讯,不受Session.Contents.Remove方法、Session.Contents.RemoveAll方法的影响。
Session.StaticObjects集合支援For...Each和For...Next语法,如下:
<%
For Each strKey In Session.StaticObjects
If IsObject(Session.StaticObjects(strKey))
Then Response.Write strKey & " = <i>OBJECT</i><BR>"
Next
%>
由於已经在Global.asa中定义一个<OBJECT RUNAT=Server SCOPE= Session>,因此执行後将显示结果,如下:
■ Session.Contents.Remove方法
Session.Contents.Remove方法移除Session.Contents集合中一个Session的资讯。
语法,如下:
Session.Contents.Remove(name|index)
其中Name为变数名称,index为变数索引值。
譬如:
<% Session("StrA")= "字串A" Session("StrB")= "字串B" Response.Write "未移除: " & Session("StrA")& Session("StrB")& "<BR>" Session.Contents.Remove("StrA") Response.Write "移除StrA: " & Session("StrA")& Session("StrB")& "<BR>" %>
表示移除Session("StrA")的资讯。执行後将显示结果,如下:
■ Session.Contents.RemoveAll方法
Session.Contents.RemoveAll方法移除Session.Contents集合中所有Session的资讯。
语法,如下:
Session.Contents.RemoveAll()
譬如:
<% Session("StrA")= "字串A" Session("StrB")= "字串B" Response.Write "未移除: " & Session("StrA")& Session("StrB")& "<BR>" Session.Contents.RemoveAll() Response.Write "移除ALL: " & Session("StrA")& Session("StrB")& "<BR>" %>
表示移除Session("StrA")、Session("StrB")等所有Session的资讯。执行後将显示结果,如下:
■ Session.Abandon方法
使用Abandon方法放弃一个Session,将破坏结束此Session,释放出所占的资源。
若未使用Abandon方法放弃一个Session,当一个使用者在timeout时间内未再要求此应用程式任何一个网页时,此Session将自动结束。
语法,如下:
Session.Abandon
当呼叫Abandon方法放弃一个Session时,直到此网页的所有script程式执行完後,所放弃的Session才会真正被删除掉。因此使用Abandon方法後,此网页的script仍然可以使用将放弃Session的变数。
譬如以下的例子於第叁行仍然会显然jack:
<% Session("MyName")= "Jack" Session.Abandon Response.Write(Session("MyName")) %>
执行後将显示结果,如下:
若於下一个网页读取Session("MyName"),将读到「empty」,因为Session的变数已被破坏放弃。
呼叫Abandon方法放弃一个Session後,网站伺服器自动於下一个网页产生一个新的Session,您可重新设定其变数。
以下的例子於此网页的所有script程式执行完後,将删除其所放弃的Session,这样才算是Session真正被删除掉,并释放出所占的资源:
<% Session.Abandon %>
■ Session.CodePage属性
处理多国语文
ASP提供一个指令以设定「code page」,可以用来处理多国语文的网页内容,譬如一个网站包括英文和中文的网页内容。
一个「code page」,是一个让系统处理各国语文特殊字元符号的内部表格。不同的「code page」,支援不同国家的字元组(character sets)。「code page」使用一个数字代表一种语文,譬如950代表中文,932代表日文,1252代表美式英文等。
Windows NT使用一种叫作「Unicode」的16位元固定宽度字元编码标准。
若您的网站使用Windows NT预设的语文,且使用者的浏览器也使用同样的语文,则您不需要设定「code page」。
若您的网站使用多种语文,则您须於ASP中设定「code page」,以便让ActiveX components和其他应用程式能够处理正确的语文资讯。尤其是像多位元组的语文(譬如中文)更加重要。
ASP有一个新的session属性,叫做「Session.CodePage」,可以设定所使用的语文。「Session.CodePage」预设值为「CP_ACP」,此为系统预设的ANSI code page。
若要设定「Session.CodePage」属性有两个方法,您可插入一个CODEPAGE的script标记,或直接设定CodePage属性。
CODEPAGE的script标记
CODEPAGE的script标记之语法,如下,注意@和CODEPAGE中间须加空格:
<% @ CODEPAGE= nnn %>
nnn是code page ID,使用一个数字代表一种语文。
以上程式码须位於任何可执行码之前。一个档案只能出现一次。
以上程式码并设定了Session.CodePage属性的值。
CODEPAGE的script标记,可加到设定script语言语法的程式码,如下:
<% @ LANGUAGE=JScript CODEPAGE= nnn %>
Session.CodePage属性
设定Session.CodePage属性之语法,如下:
<% Session.CodePage = nnn %>
script语言中可以改变Session.CodePage之设定,譬如:
<!-- 日文, code page 932 --!> <% @ CodePage = 932 %> ... <!-- 中文, code page 950 --!> ...
让我们看一个范例。
网站伺服器session1.asp档案的ASP程式码如下:
<% = "Session.CodePage = " & Session.CodePage %>
在用户端使用浏览器,浏览session1.asp执行的结果如下,显示以下Session属性的画面:
有意思吗 ?
■ Session.LCID属性
LCID属性,传回一个使用者的地区识别代码(locale identifier)。 一个locale identifier是一个国际标准的地区识别代码数字。
您也可使用@ LCID指令设定地区识别代码locale identifier(LCID)。设定Session.LCID值将覆盖於@ LCID指令所设定的LCID值。
譬如以下的ASP程式码:
<% = "Session.LCID = " & Session.LCID %><BR> <% Session.LCID = 2057 curNumb = FormatCurrency(125) Response.Write(curNumb) %>
在用户端使用浏览器,浏览session1.asp执行的结果如下:
■ Session.SessionID属性
SessionID属性,传回一个使用者的代码。 一个SessionID是一个经复杂演算结果後产生的唯一数字,代表了一个使用者的身份。
一个使用者第一次於一个应用程式要求任何一个ASP网页时,ASP将产生一个SessionID,然後传送到使用者的浏览器,储存成一个cookie,但因未设定cookie之有效期间,所以并未储存於使用者的硬碟中。
网站伺服器自动於每一个网页读取cookie以取得SessionID,同一个SessionID的网页使用者,代表为同一个使用者。
语法,如下:
Session.SessionID
每一个使用者虽然有不同的SessionID,但是不要使用SessionID当做资料库主要的值,因为若网站伺服器重新开机後,可能产生与重新开机前相同的SessionID。若需要唯一的值,您可以使用自动增加的资料型态,譬如Microsoft SQL Server的IDENTITY、或Microsoft Access的COUNTER。
譬如以下的ASP程式码:
<% = "Session.SessionID = " & Session.SessionID %>
在用户端使用浏览器,浏览session1.asp执行的结果如下:
■ Session.Timeout属性
在一个Application应用程式中,当一个使用者於timeout时间内未再要求此应用程式任何一个网页时,此Session将自动结束。
Timeout属性,可设定一个Session的timeout时间。
语法,如下:
Session.Timeout [ = nMinutes]
若想设定久一点,譬如30分钟自动结束session,可设定「Timeout」:
<% Session.Timeout = 30 %>
譬如以下的ASP程式码:
<% = "Session.Timeout = " & Session.Timeout %>
在用户端使用浏览器,浏览session1.asp执行的结果如下:
未超过自动结束Session的timeout时间时,若想结束一个Session,可以使用「Abandon」方法。譬如:
<% Session.Abandon %>
■ Session_OnStart事件
一个使用者第一次进入一个应用程式时,将产生一个新的Session,并触发Global.asa档案中Session_OnStart的事件。
触发Session_OnStart事件的执行程式,定义於Global.asa档案中。可呼叫内建的物件(Application、Request、Response、Server、Session)。语法,如下:
<SCRIPT LANGUAGE=ScriptLanguage RUNAT=Server> Sub Session_OnStart . . . End Sub </SCRIPT>
为了确保使用者都从一个首页开始浏览,因为新的使用者将触发Session_OnStart事件,可将之Redirect连结到此首页。譬如:
<SCRIPT RUNAT=Server Language=VBScript> Sub Session_OnStart
startPage = "first.asp"
currentPage = Request.ServerVariables("SCRIPT_NAME")
' 若此网页不是首页时,可将之Redirect连结到此首页
if strcomp(currentPage,startPage,1)then
Response.Redirect(startPage)
end if
End Sub
</SCRIPT>
若使用者的浏览器支援cookie的功能,才可以使用以上的例子。因为不支援cookie的浏览器不会传来SessionID cookie,每次都产生一个新的Session,都触发执行Session_OnStart事件连结到首页,即不支援cookie的使用者永远只能浏览首页。因此最好於首页显示「本网页须使用支援cookie功能的浏览器」的提示。
触发Session_OnStart事件的执行程式中,若使用Redirect连结到其他的网页时,Redirect後的程式不会被执行到。
譬如:
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
Sub Session_OnStart
' 其他程式...
Response.Redirect "http://www.abc.com/StartHere.asp"
' 其他程式... 不会被执行到
End sub
</SCRIPT>
■ Session_OnEnd事件
当超过自动结束Session的timeout时间时,或使用「Abandon」方法时,将结束一个Session,此时将触发执行Session_OnEnd的程序。触发Session_OnEnd事件的执行程式,定义於Global.asa档案中。
语法,如下:
<SCRIPT LANGUAGE=ScriptLanguage RUNAT=Server> Sub Session_OnEnd . . . End Sub </SCRIPT>
Session_OnEnd事件的程式所用到的script语言,不可呼叫Server.MapPath方法。
B-3 如何使用Request物件呢?
取得用户资讯
透过Internet或Intranet,网站伺服器如何取得用户端的资讯(譬如使用的浏览器种类、或表单输入)呢 ?
ASP的内建「Request物件」提供取得用户端资讯的功能。
Request物件将HTTP request传来的资讯解析出,包括五个「collection」(集合):
您可以使用以下通用的语法,来读取Request物件的资讯:
Request.Collection名称(variable名称)
若不指定Collection名称,您可以使用以下通用的语法,来读取Request物件的资讯:
Request(variable名称)
由於不指定Collection名称,须寻找是哪一个Collection的变数名称,collections寻找顺序依次为QueryString、Form、Cookies、ClientCertificate、和ServerVariables。寻找到的第一个变数名称即传回其值。
建议您加上Collection名称,可以加快执行速度,譬如使用Request.ServerVariables("AUTH_USER")而非Request.("AUTH_USER")。
若寻找不到variable名称,则传回「EMPTY」。
■ 接收浏览器的档案资料
ASP提供从POST request接收浏览器档案资料的功能。您可以使用ASP scripts控制ActiveX component来应用这些资料。scripts语言须支援位元组阵列的功能,须注意的是,JScript或VBScript都未支援这种功能。
接收浏览器的档案资料,ASP提供了Request.BinaryRead方法和Request.TotalBytes属性。
本节将详细介绍如下。
■ Request.BinaryRead方法
Request.BinaryRead方法,可读取由用户端传送给伺服器的资料。这些资料为POST request的一部份,然後储存於一个SafeArray阵列当中。
语法,如下:
variant = Request.BinaryRead(count)
因为BinaryRead方法所读到的资料为Post request的一部份,若再使用Request.Form读取资料,将发生错误;相反地,若已使用Request.Form读取资料,再使用BinaryRead方法读取资料,将发生错误。
■ Request.TotalBytes属性
得知总计读取的位元组数。
语法如下,此属性为唯读:
counter = Request.TotalBytes
■ Request.Cookies集合
Request.Cookies读取Cookies的值,语法如下,其中中括弧[...]部份为选项,可有可无:
Request.Cookies(cookie)[(key)|.HasKeys]
假设cookie包括两个key(type1、type2),若接下来的Request.Cookies未设定key,则将传回所有key的值,譬如:
type1=value1&type1=value2
假设两个cookie有相同的名称,则Request.Cookies将传回路径最长的cookie值。譬如两个cookie路径为/www/和/www/home/,则将传回路径/www/home/的cookie值。
若要得知是(True)否(False)包括key,可使用如下的HasKeys语法:
<%= Request.Cookies("cookie的名称").HasKeys %>
若「cookie的名称」是一个路径,即包括key,则传回TRUE,否则传回FALSE。
您能使用「Each cookie in Response.Cookies」读取所有的cookie值。
而使用「For Each key in Request.Cookies(cookie)」读取所有cookie的key值。
请看以下的范例即可知道。
读取所有的cookie值
可以读取此网站所建的所有cookie值吗 ?
在用户端使用浏览器,浏览cookie2.asp读取所有cookie值的结果如下:
ASP程式码,如下:
<%
For Each cookie in Request.Cookies
If Not Request.Cookies(cookie).HasKeys Then
%> <%= cookie %> = <%= Request.Cookies(cookie)%> <BR>
<%
Else
For Each key in Request.Cookies(cookie)
%> <%= cookie %>(<%= key %>)= <%= Request.Cookies(cookie)(key)%>
<%
Next
End If
Next
%>
储存於用户端的硬碟的cookie值内容,如下:
USERID Jack 1.1.1.1/aspsamp 0 2090369024 29258206 2932252880 29184720 * TEST I+love+you%21 1.1.1.1/aspsamp 0 2090369024 29258206 2932752880 29184720 *
有趣吗 ?
■ Request.Form集合
Request.Form读取HTTP讯息资料的栏位,以取得使用POST方式的表单form输入资料。
语法如下:
Request.Form(name)[(index)|.Count]
譬如以下的例子,其中input1为栏位名称,Request.Form("input1").Count得知input1栏位输入几个值:
<%
For I = 1 To Request.Form("input1").Count
Response.Write Request.Form("input1")(I)& "<BR>"
Next
%>
若input1有两个输入值,譬如为value1和value2,则以上的例子,在浏览器将显示:
value1 value2
同一栏位输入多个值时,若未采用指标值index指定要读取哪一个值时,将得到多个值,各个值中间以逗点分隔之。
您可以使用「For Each item In Request.Form("栏位名称")」,重覆取得此栏位输入的所有多个输入值,以上的例子也可由以下的程式码得到相同的结果:
<%
For Each item In Request.Form("input1")
Response.Write item & "<BR>"
Next
%>
您可以使用「For Each x In Request.Form」,重覆取得所有栏位的输入值,譬如:
<% For Each x In Request.Form %> Request.Form( <%= x %> )= <%= Request.Form(x)%> <BR> <% Next %>
若栏位input1有两个输入值,譬如为value1和value2,则以上的例子,在浏览器将显示:
input1=value1 input1=value2
POST范例
让我们看一个POST的例子。
网站伺服器form1.asp档案的ASP程式码如下:
<form action="asp1a.asp" method="post"> 姓名:< INPUT TYPE=TEXT NAME="input1" VALUE="大名"> <p>特徵: <select multiple name="input2"> <OPTION>戴眼镜 <OPTION>小肚微凸 <OPTION>漂亮 </select> <p> <input type=submit VALUE="写完了"> </form>
写完後按下 写完了 按钮时,所执行的asp1a.asp档案之ASP程式码如下:
<%= Request.Form("input1")%> 您好, 您的特徵是 <%= Request.Form("input2")%>.
若传给asp1a.asp的值,可能为:
input1=jack& input2=小肚微凸+漂亮
则在用户端使用浏览器,浏览执行的结果如下:
输入表单按下 写完了 按钮後,将显示处理的结果:
若您设定name栏位名称,则网站伺服器将解析此栏位的输入值。若您需要未经解析的输入值,只须使用「Request.Form」,不含name栏位名称。譬如以下asp1a.asp之ASP程式码:
<%= Request.Form %>
若输入与上面的例子相同,在用户端使用浏览器,浏览未经解析的输入值如下:
■ Request.QueryString集合
Request.QueryString,读取HTTP讯息资料栏位,以取得使用GET方式的表单form输入的资料。
输入的栏位和资料将接於<form action=" URL位址">所设定的URL位址後面,先加一个「?」,栏位和资料之间用「&」分隔之,譬如:
URL位址? input1=value1& input2=value2
Request.QueryString将解析出输入的资料value1、value2。
语法如下:
Request.QueryString(name)[(index)|.Count]
Request.QueryString解析於ServerVariables的QUERY_STRING变数。
同一栏位输入多个值时,若未采用指标值index指定要读取哪一个值时,将得到多个值,各个值中间以逗点分隔之。
以下的例子test.asp,其中input1为栏位名称,Request.QueryString("input1").Count得知input1栏位输入几个值:
<%
For I = 1 To Request.QueryString("input1").Count
Response.Write Request.QueryString("input1")(I)& "<BR>"
Next
%>
若input1有两个输入值,譬如为value1和value2,传来的为:
http://test.asp?input1=value1& input1=value2
则以上的例子,在浏览器将显示:
value1 value2
您可以使用「For Each item In Request.QueryString("栏位名称")」,重覆取得此栏位输入的所有多个输入值,以上的例子也可以由以下的程式码得到相同的结果:
<%
For Each item In Request.QueryString("input1")
Response.Write item & "<BR>"
Next
%>
您可以使用「For Each x In Request.QueryString」,重覆取得所有栏位的输入值,譬如:
<% For Each x In Request.QueryString %> Request. Request.QueryString( <%= x %> )= <%= Request.QueryString(x)%> <BR>
若栏位input1有两个输入值,譬如为value1和value2,则以上的例子,在浏览器将显示:
input1=value1 input1=value2
请加油吧!
GET范例
让我们看一个GET的例子。
网站伺服器form1.asp档案的ASP程式码如下:
<form action="asp1b.asp" method="GET"> 姓名:< INPUT TYPE=TEXT NAME="input1" VALUE="大名"> <p>特徵: <select MULTIPLE name="input2"> <OPTION>戴眼镜 <OPTION>小肚微凸 <OPTION>漂亮 </select> <p><input type=submit VALUE="写完了"> </form>
写完後按下 写完了 按钮时,所执行的asp1b.asp档案之ASP程式码如下:
<%= Request.QueryString("input1")%> 您好, 您的特徵是 <%= Request.QueryString("input2")%>.
若传给asp1b.asp的值,可能为:
asp1b.asp ?input1=jack& input2=戴眼镜&input2=小肚微凸
则在用户端使用浏览器,浏览form1.asp执行的结果如下:
输入表单按下 写完了 按钮後,将显示处理的结果:
若您设定name栏位名称,则网站伺服器将解析此栏位的输入值。若您需要未经解析的输入值,只须使用「Request.QueryString」,不含name栏位名称。譬如asp1b.asp之ASP程式码如下:
<%= Request.QueryString %>
若输入与上面的例子相同,在用户端使用浏览器,浏览未经解析的输入值如下:
您学会了吗 ?
■ Request.ClientCertificate集合
使用Client Certificates(用户端认证)
使用支援SSL(Secure Sockets Layer)3.0协定、或Private Communications Technology(PCT1)协定的浏览器,网页来访者(用户)可以传送一个「client certificate」(用户端认证)给网站伺服器,以证明其用户的身份。
ClientCertificate collection取得由使用者的浏览器所发出的认证栏位资料。
浏览器使用SSL3.0/PCT1协定时,URL以「https://」为起头,而非一般的「http://」为起头,来传送certificate栏位。
「client certificate」是一个加密的号码,储存於用户端硬碟中的一个档案当中。用户端的浏览器,将此加密的号码要求浏览一个ASP网页。
若未使用client certificate(用户端认证),则传回「EMPTY」。
「client certificate」提供一个验证用户身份的安全方法,有「client certificate」(用户端认证)的被授权用户,才能浏览此网页。
网站伺服器能写一个ASP程式码,经由Request.ClientCertificate读取certificate栏位,譬如用户的姓名、或公司名,以验证用户的身份。
启动Client Certificates功能
以IIS而言,并不需要使用「client certificate」以验证用户的身份。若要具有「client certificate」的功能,网站伺服器必须做以下的设定,以启动SSL的功能,您可以设定哪些虚拟目录需要「client certificate」。
Client Certificates语法
语法,如下:
Request.ClientCertificate(Key[SubField])
未列於上述的SubField值,为以点分隔的ASN.1 identifier格式,譬如"3.56.7886.34"。
For Each
您可以使用「For Each key in Request.ClientCertificate」,重覆取得所有certificate的值,譬如:
<% For Each key in Request.ClientCertificate Response.Write( key & ": " & Request.ClientCertificate(key)& "<BR>") Next %>
Subject
以下的例子使用Subject key测试是否有无client certificate,譬如:
<%
If Len(Request.ClientCertificate("Subject"))= 0 then
Response.Write("无client certificate")
End if
%>
IssuerCN
以下的例子使用IssuerCN得知发出client certificate的公司一般名称,譬如:
<%= Request.ClientCertificate("IssuerCN")%>
SubjectO
以下的例子使用SubjectO检查公司组织名,譬如:
<% If(Request.ClientCertificate("SubjectO")="Msft")then Response.Write("Good Choice!") End if %>
ValidUntil
以下的例子显示client certificate的有效期间ValidUntil,譬如:
<%= Request.ClientCertificate("ValidUntil")%>
Flags
以下的例子使用Flags key测试是否已知client certificate的issuer,譬如:
<%
if Request.ClientCertificate("Flags")and ceUnrecognizedIssuer then
Response.Write "Unrecognized issuer"
end if
%>
您觉得有趣吗 ?
■ Request.ServerVariables集合
ServerVariables Collection
ServerVariables collection读取伺服器的环境变数值。提供的资讯包括伺服器环境和用户端的使用环境,经由HTTP表头(headers)传回。
SERVER_PORT
譬如使用SERVER_PORT,可以得知接收HTTP request的连接port资讯。网站伺服器request1.asp档案的ASP程式码如下:
TCP/IP port : <%= Request.ServerVariables("SERVER_PORT")%>
在用户端使用浏览器,浏览request1.asp执行的结果如下,显示连接port资讯:
HTTP_ACCEPT_LANGUAGE
而经由以下HTTP_ACCEPT_LANGUAGE的HTTP表头变数,可以得知用户端的使用语言环境。以下的例子,判断用户端的使用语言,而给予不同的网页内容:
<% language = Request.ServerVariables("HTTP_ACCEPT_LANGUAGE") If language = "en" Then %> <!--#INCLUDE FILE="english.asp"--> <% Else %> <!--#INCLUDE FILE="others.asp"--> <% End If %>
ServerVariables语法
语法,如下:
Request.ServerVariables(variable)
新的表头
若用户端传送来新的表头,譬如:
NewHeader: NewValue
可使用以下的语法,於新表头前须加HTTP_,以读取这个新表头的值:
<% Request.ServerVariables("HTTP_NewHeader")%>
SERVER_NAME
以下由Request. ServerVariables得知伺服器名称,以超连结到本伺服器的网页。
譬如ASP程式码如下:
<A HREF = "http://<%= Request.ServerVariables("SERVER_NAME")%> /iis5samp/request1.asp">连结到本页</A>
For Each
您可以使用「For Each name In Request.ServerVariables 」,重覆取得所有伺服器变数的值。
譬如以下的ASP程式码:
<TABLE border=1> <TR> <TD><B>Server Variable</B></TD> <TD><B>Value</B></TD> </TR> <% For Each name In Request.ServerVariables %> <TR><TD> <%= name %> </TD><TD> <%= Request.ServerVariables(name)%> </TD></TR> <% Next %> </TABLE>
则在用户端使用浏览器,浏览执行的结果如下,显示所有伺服器变数的值:
再举一个例子。
譬如以下的ASP程式码:
ALL_HTTP server variable = <%= Request.ServerVariables("ALL_HTTP")%> <P> CONTENT_LENGTH server variable = <%= Request.ServerVariables("CONTENT_LENGTH")%> <BR> CONTENT_TYPE server variable = <%= Request.ServerVariables("CONTENT_TYPE")%> <BR> QUERY_STRING server variable = <%= Request.ServerVariables("QUERY_STRING")%> <BR> SERVER_SOFTWARE server variable = <%= Request.ServerVariables("SERVER_SOFTWARE")%> <BR>
,显示伺服器变数的值:
有意思吗 ?
B-4 如何使用Response物件呢?
传送资讯给用户
透过Internet或Intranet,网站伺服器如何传送资讯给用户呢 ?
ASP的内建「Response物件」提供传送资讯给用户的功能,譬如:
IIS 5.0於Response物件新增加Response.CacheControl、Response.Charset、Response.IsClientConnected、Response.Pics属性。
语法如下:
Response [.collection | .property | _method]
XML格式输出(Response)到浏览器
在IIS 5.0的ADO 2.5版,直接将recordset的资料,使用RS.Save Response, adPersistXML指令,以XML格式输出(Response)到浏览器。请参阅
3-1〈ADO如何支援XML呢 ? 〉 一节。
■ Response.Buffer属性
暂存资讯於缓冲器
网站伺服器处理ASP档案时,会将处理完的一部份ASP档案执行结果传送到用户端浏览器。
使用Response.Buffer方法,将预备传送到用户端浏览器的资讯,先暂存於缓冲器(buffer),直到网站伺服器处理完此ASP档案後才传送到用户端浏览器。
当中若呼叫Response.Flush、或Response.End的方法,也会将暂存於缓冲器缔资讯传送到用户端浏览器。
Buffer语法
语法如下:
Response.Buffer [= flag]
IIS 5.0预设为启动(True)缓冲器的功能。
ASP的缓冲器(buffer)功能预设为关闭。若要启动缓冲器(buffer)的功能,语法如下:
<% Response.Buffer = True %>
位於ASP程式码的第一行
关闭或启动ASP的缓冲器(buffer)的功能,须於网站伺服器传送输出到用户端浏览器之前就设定好。因此,Response.Buffer应位於ASP程式码的第一行。
启动缓冲器(buffer)的好处
启动缓冲器(buffer)的功能,让您於ASP程式码当中,可以随时决定将执行结果传送到用户端浏览器的时机。当ASP程式执行到一半时,可以:
譬如:
<% Response.Buffer = True %>
<html><body>
<% If Request("FName")= "" Then
Response.Clear
Response.Redirect "test.htm"
Response.End
Else
Response.Write Request("FName")
End If %>
</body></html>
Keep-Alive
若您启动缓冲器(buffer)的功能,而未呼叫Flush方法,网站伺服器将维持用户端请求的「Keep-Alive」状态。这个方式的好处是,因为维持「Keep-Alive」状态时,於每次用户端请求时都不须重新建立一个新的连接,所以将改善伺服器的效率。
启动缓冲器(buffer)的缺点
但是启动缓冲器(buffer)的功能也有缺点,因为网站伺服器处理完整个ASP档案後才传送到用户端浏览器,若ASP程式码太大,用户端的浏览器须等比较久才看到执行的结果。
IIS 5.0以前的缓冲器(buffer)功能预设为关闭,而IIS 5.0预设为启动(True)缓冲器的功能。若要预设为启动缓冲器(buffer)的功能,须更改ASPBufferingOn metabase registry设定。
缓冲器(buffer)的方法
缓冲器(buffer)有以下叁个方法(Methods):
以下将一一介绍。
■ Response.CacheControl属性
CacheControl设定proxy servers是(" Public")否(" Private")暂存此网页的资讯於Cache当中,如下:
设定Response.CacheControl为"Public" 时,因第二次浏览者将直接从proxy servers读取此网页,将改善效率。但是,若是每次执行asp程式都产生不同的html码时,对效率上并不会有所帮助。
■ Response.Charset属性
Response.Charset设定character set的名称,加於content-type header上。
譬如:
<% Response.Charset= "ISO-LATIN-7" %>
将产生的content-type header如下:
content-type:text/html; charset=ISO-LATIN-7
■ Response.ContentType属性
设定传送资料的HTTP内容型态
使用Response.ContentType方法,可以设定网站伺服器传送资料到用户端浏览器的HTTP内容型态(HTTP Content Type)。
HTTP内容型态的预设值为「text/HTML」。
语法,如下:
Response.ContentType = ContentType
以下的例子设定为各种的HTTP内容型态(HTTP Content Type),如下:
<% Response.ContentType = "text/HTML" %> <% Response.ContentType = "image/GIF" %> <% Response.ContentType = "image/JPEG" %>
传送原始码给浏览器
譬如,若您想传送原始码给浏览器,只要设定HTTP内容型态为「text/plain」,如下:
<% Response.ContentType = "text/plain" %>
「text/plain」使浏览器将直接显示所有HTML程式码为文字,而不解译HTML码。
WML的HTTP内容型态
「WAP」(Wireless Application Protocol,无线应用协定)是把网页内容传递到行动电话及其他无线装置上的一个开放式标准协定,所使用的HTML叫做「WML」(Wireless Markup Language,无线标记语言),若您想传送网页内容给行动电话,需设定HTTP内容型态为「text/vnd.wap.wml」,如下:
Response.ContentType="text/vnd.wap.wml;"
您学会了吗 ?
■ Response.Expires属性
网页保留的期限
Response.Expires属性,设定一个网页於记录资料匣(page cached,含有使用者查阅过网页的连结)保留的期限。
若用户端浏览器在一个网页保留的期限内,再度浏览此网页时,原储存於用户端硬碟记录资料匣的旧网页(cached version)内容,将被显示於用户端的浏览器。
语法,如下:
Response.Expires [= number]
保留期限设为0(Response.Expires = 0)时,此网页将立刻於记录资料匣被清除。保留期限设定多次时,使用较短的保留期限。
若用户端电脑系统时间比IIS电脑系统时间早时或因时差缘故,设定Response.Expires = 0後,网页可能不会立刻被清除。解决之道如下:
Response.Expires = -1
则网页将立刻被清除。
因此若希望网页会立刻被清除,请设定Response.Expires = -1。
■ Response.ExpiresAbsolute属性
网页保留的时间日期
Response.ExpiresAbsolute属性,设定一个网页在记录资料匣(page cached,含有使用者查阅过网页的连结)保留的时间日期。
若用户端浏览器於一个网页保留的期限内,再度浏览此网页时,原储存於用户端硬碟记录资料匣的旧网页(cached version)内容,将被显示於用户端的浏览器。
若未设定时间,以半夜为准。
若未设定日期,以网页执行当天计算。
语法,如下:
Response.ExpiresAbsolute [= [date] [time]]
<% Response.ExpiresAbsolute=#May 3,2002 17:30:25# %>
■ Response.IsClientConnected属性
Response.IsClientConnected侦测使用者是(True)否(False)仍然连线。
譬如:
<%
'侦测使用者是(True)否(False)仍然连线
If Response.IsClientConnected = False Then
'若未连线则取得SessionID,并加予处理
Shutdown(Session.SessionID)
End If
%>
若侦测使用者未连线,则取得SessionID,并呼叫Shutdown函数加予处理。
■ Response.Pics属性
Response.Pics加值於pics-label response header上。
譬如:
<%
Response.PICS("(PICS-1.1 <http://www.rsac.org/ratingv01.html> labels on "
&chr(34)& "2002.01.05T08:15-0500" & chr(34)& " until"
& chr(34)& "2002.12.31T23:59-0000" & chr(34)& " ratings(v 0 s 0 l 0 n 0))")
%>
将加值於header,如下:
PICS-label:(PICS-1.1 <http://www.rsac.org/ratingv01.html> labels on "2002.01.05T08:15-0500" until "2002.12.31T23:59-0000" ratings(v 0 s 0 l 0 n 0))
双引号须改以chr(34)代替。
■ Response.Status属性
Server回应值
Response.Status属性,设定HTTP协定,网站伺服器回覆给浏览器的Server回应值。
Server回应值定义於HTTP协定当中。用户端送出命令给伺服器後,伺服器以「叁位数字」回应给用户端表示执行成功或失败,第一位数字为「1」表起始开始,为「2」表执行成功,为「3」表其它,为「4」或「5」表失败。HTTP协定的所有伺服器回应,如下表:
| Server回应值 | 说 明 |
|---|---|
| 200 | Okay. |
| 201 | Created. |
| 202 | Accepted. |
| 204 | No content. |
| 301 | Moved permanently. |
| 302 | Move Temporarily. |
| 304 | Not modified. |
| 310 | Move Permanently |
| 400 | Bad request. |
| 401 | Unauthorized |
| 403 | Forbidden. |
| 404 | Not found. |
| 500 | Internal server error. |
| 501 | Not implemented. |
| 502 | Bad gateway. |
| 503 | Service unavailable. |
语法,如下:
Response.Status = StatusDescription
您可以使用Response.Status属性,修改HTTP协定,网站伺服器回覆给浏览器的Server回应值。
以下的例子设定了Server回应值,如下:
<% Response.Status = "401 Unauthorized" %>
有趣吗 ?
■ Response.AddHeader方法
设定HTTP的新表头
使用Response.AddHeader方法,伺服器可以设定HTTP的新表头(header)之名称和值。
此方法不能取代现存的表头(header)。一旦设定新表头(header),就无法移除。
语法,如下:
Response.AddHeader name, value
因为ServerVariables collection会将表头(header)包括的「_」视为「-」,以下的例子寻找表头名称为MY-HEADER的值,如下:
<% Request.ServerVariables("HTTP_MY_HEADER")%>
呼叫Response.AddHeader时机
由於HTTP协定要求须先传送所有的表头(header)再传送内容(content),呼叫Response.AddHeader须於网站伺服器传送输出到用户端浏览器之前。否则将发生错误。
但若您启动缓冲器(buffer)的功能(Response.Buffer = True),就可以於任何时间呼叫Response.AddHeader。
以下的例子呼叫Response.AddHeader於网站伺服器传送输出到用户端浏览器之前,为正确的呼叫方式,譬如:
<% Response.AddHeader "WARNING", "Inavlid input" %> <HTML> 您好 </HTML>
若顺序颠倒将发生错误,譬如:
<HTML> 您好 <% Response.AddHeader "WARNING", "Inavlid input" %> </HTML>
启动缓冲器(buffer)的功能
以下的例子启动缓冲器(buffer)的功能(Response.Buffer = True),就可以在任何时间呼叫Response.AddHeader,为正确的呼叫方式,譬如:
<% Response.Buffer = TRUE %>
<HTML>
您好
<% Response.AddHeader "WARNING", " Inavlid input" %>
今天
<% Response.Flush %>
<%= Response.Write("下雨")%>
</HTML>
以下的例子使用Response.AddHeader方法,要求用户端使用基本的验证(authentication)方式,譬如:
<% Response.Addheader "WWW-Authenticate", "BASIC" %>
以上的例子,用户端浏览器须启动基本的验证(authentication)功能。
■ Response.AppendToLog方法
Web server log
使用AppendToLog方法,加一个字串到Web server log档案的结尾处。
语法,如下:
Response.AppendToLog string
■ Response.BinaryWrite方法
传送二进位资料
使用BinaryWrite方法,伺服器可以传送不经字元转换(character-set conversion)的二进位资料到浏览器。
语法,如下:
Response.BinaryWrite data
譬如,以下的例子传送二进位资料binary1到浏览器,使用物件准备二进位资料:
<% set abc = Server.CreateObject(MY.BinaryGenerator) binary1 = abc.MakePicture Response.BinaryWrite binary1 %>
■ Response.Clear方法
清除缓冲器的内容
Response.Clear方法,将清除缓冲器的内容。
Response.Clear仅清除本体(body)部份,表头(header)部份并未被清除。
若您关闭缓冲器(buffer)的功能,而呼叫Response.Clear方法,将发生错误。
语法如下:
Response.Clear
■ Response.End方法
停止.asp档案的处理
Response.End方法,将停止.asp档案的处理,传送缓冲器现有的内容到用户端浏览器。
语法如下:
Response.End
若您不希望传送缓冲器现有的内容到用户端浏览器,请先使用Response.Clear方法,将清除缓冲器的内容,再使用Response.End方法,将停止.asp档案的处理,譬如:
<% Response.Clear Response.End %>
■ Response.Flush方法
立刻传送缓冲器的内容
Response.Flush方法,将立刻传送缓冲器的内容。
若您关闭缓冲器(buffer)的功能,而呼叫Response.Flush方法,将发生错误。
语法如下:
Response.Flush
一旦呼叫Response.Flush方法,此网页「Keep-Alive」状态将不再被维持。
■ Response.Redirect方法
连结到指定的URL位址
使用Response.Redirect方法,将使用户端的浏览器,尝试连结到指定的URL位址。语法如下:
Response.Redirect URL
譬如,若您希望确认使用者已经看过首页,您可以检查是否已经看过首页,若尚未则自动连结到首页:
<%
If Not Session("Been_to_Home_Page")Then
Response.Redirect "homepage.asp"
End If
%>
须注意的一点是,若此.asp网页的内容已经传送给使用者,再使用Response.Redirect,将发生错误!
Response.Redirect方法,传送以前的表头(header)给使用者,其中URL为连结到的URL位址:
HTTP/1.0 302 Object Moved Location URL
Response.Redirect先传送到浏览器再要求网站伺服器转向,如此会减少一次用户端与网站伺服器之间的来回通讯时间。IIS 5.0新增加了新的转向方法Server.Transfer与Server.Execute方法,直接由IIS 5.0於网站伺服器端直接转向到另一个网页。
■ Response.Write方法
传送字串到用户端的浏览器
Response.Write方法,是最常用到传送指定的字串到浏览器的方法。语法,如下:
Response.Write variant
%>
由於「%>」会被误判为ASP程式的结尾,variant不能包括「%>」,但可使用「%\>」(escape sequence)。譬如:
<% Response.Write "<TABLE WIDTH = 100%\>" %>
结果与以下的HTML码相同:
<TABLE WIDTH = 100%>
Response.Write范例
譬如以下的例子向使用者打招呼:
<% Response.Write "欢迎光临" %>
以下的例子回应表单form的输入:
您的姓名: <% Response.Write Request.Form("name")%>
譬如以下的例子判断是回到此页或第一次光临:
<% If user_has_been_here_before Then Response.Write "<H3 ALIGN=CENTER>欢迎回到此页</H3>" Else Response.Write "<H3 ALIGN=CENTER>欢迎光临</H3>" End If %>
传送字串到用户端的浏览器,不一定需要使用Response.Write,位於<%...%>外的部份将直接传送到用户端的浏览器,譬如以下的结果与上例相同:
<H3 ALIGN=CENTER> <% If user_has_been_here_before Then %> 欢迎回到此页 <% Else %> 欢迎光临 <% End If %> </H3>
请加油吧!
■ Response.Cookies集合
Response.Cookies写入Cookies的资料,语法如下,其中中括弧[...]部份为选项,可有可无:
Response.Cookies(cookie)[(key)|.attribute] = value
新的cookie设定值将盖掉原本设定的值。
cookie的值若设定为数个,譬如「value1 value2 value3」,则设定为「value1+value2+value3」。
譬如:
<%
Response.Cookies("ID")= "Jack"
Response.Cookies("ID").Expires = "July 1, 2002"
Response.Cookies("ID").Domain = "www.abc.com"
Response.Cookies("ID").Path = "/www/test/"
Response.Cookies("ID").Secure = TRUE
%>
cookie使用key的方式,譬如:
<%
Response.Cookies("cookie100")("type1")= "value1"
Response.Cookies("cookie100")("type2")= "value2 value3"
%>
则以下的HTTP表头(header)被送出:
Set-Cookie:COOKIE100=TYPE1=value1&TYPE2=value2+value3
若接下来的Response.Cookies未设定key,则将破坏原本的两个key(type1、type2),譬如:
<% Response.Cookies("cookie100")= "value4" %>
现在,cookie100的cookie值为value4。
相反地,若接下来的Response.Cookies设定key,则将破坏原本的cookie值,譬如:
<% Response.Cookies("cookie100")("type3")= "value5" %>
key(type3)的值为value5。
若要得知是(True)否(False)包括key,可使用如下的HasKeys语法:
<%= Response.Cookies("cookie100").HasKeys %>
若cookie100是一个路径,即包括key,则传回TRUE,否则传回FALSE。
您能使用「Each cookie in Response.Cookies」设定所有的cookie值,譬如设定所有cookie的有效期间:
<%
For Each cookie in Response.Cookies
Response.Cookie(cookie).Expires = #July 12, 2002#
Next %>
您能使用「For Each key in Response.Cookies(cookie)」设定所有cookie的key值,譬如清除所有cookie的key值:
<%
For Each cookie in Response.Cookies
If Not cookie.HasKeys Then
Response.Cookies(cookie)= ""
Else
For Each key in Response.Cookies(cookie)
Response.Cookies(cookie)(key)= ""
Next key
End If
Next
%>
有意思吗 ?
B-5 如何使用Server物件呢?
Server物件提供存取伺服器的方法(methods)、和属性(properties)的功能。
IIS於Server物件新增加Server.Execute、Server.GetLastError、Server.Transfer方法。
语法,如下:
Server.method | property
本节将一一详细介绍如下。
■ Server.ScriptTimeout属性
Script的times out
ScriptTimeout属性,取得或设定Script的最久执行(times out)时间。
伺服器元件(component)不理会ScriptTimeout的times out时间设定。
语法,如下:
Server.ScriptTimeout = Seconds
ScriptTimeout的times out时间设定,不能小於在registry(AspScriptTimeout metabase)的times out设定。若ScriptTimeout的times out时间设定较小,以registry的times out设定为准。
以下的例子设定script最久执行(times out)时间为120秒,如下:
<% Server.ScriptTimeout = 120 %>
以下的例子取得script的最久执行(times out)时间,如下:
<% TimeOut = Server.ScriptTimeout %>
■ Server.CreateObject方法
定义一个ASP元件
CreateObject方法,产生伺服器元件(component)的instance,以定义一个ASP元件(ASP component)。
若一个ASP元件(ASP component)具有OnStartPage和OnEndPage的方法(methods),使用CreateObject方法将呼叫执行OnStartPage的方法。
语法,如下:
Server.CreateObject( progID )
<% Set Ad = Server.CreateObject("MSWC.Adrotator")%>
<%= Ad.GetAdvertisement("aspadv.txt")%>
ASP元件有效期间
以预设值而言,使用CreateObject方法定义的ASP元件(ASP component),只在定义的网页有效,一旦此ASP网页处理执行完毕,此定义的ASP元件将自动被摧毁。
定义的ASP元件(ASP component),若须於数个网页都维持有效,须使用SESSION或APPLICATION物件来定义。可使用<OBJECT>标记来定义於一个SESSION或APPLICATION都维持有效的ASP元件(ASP component)。
譬如以下的例子所定义的ASP元件(ASP component),在一个使用者(SESSION名称为a)浏览本网站的所有网页都维持有效:
<% Set Session("a")= Server.CreateObject("MSWC.AdRotator")%>
NOTHING
将SESSION定义的ASP元件设定为「NOTHING」或其他新值,将自动摧毁此ASP元件。
譬如以下的例子,第一行将摧毁上例定义的ASP元件,第二行以其他新值取代之:
<% Session("a")= Nothing %>
<% Session("a")= "其他新值" %>
语法的progID不能使用ASP内建的物件,譬如以下的例子会发生错误:
<% Set Response = Server.CreateObject("Response")%>
■ Server.Execute方法
Server.Execute为IIS 5.0新增加的新转向方法。执行Server.Execute方法後先转向到其他程式,之後仍然会继续执行原呼叫程式Server.Execute下一行的指令。
Server.Execute的档案好像为原ASP程式的一部份,与一般程式中呼叫某程序的功能相类似。
语法,如下:
Server.Execute( path )
Server.Execute会将转向後之URL位址之transaction结果(OnTransactionAbort和OnTransactionCommit),带回原呼叫程式而影响其transaction结果。
■ Server.GetLastError方法
Server.GetLastError方法显示有用的错误资讯。
语法,如下:
Server.GetLastError()
譬如:
Set objASPError = Server.GetLastError Response.Write "<br>" & objASPError.Category Response.Write "<br>" & objASPError.Number Response.Write "<br>" & objASPError.ASPDescription Response.Write "<br>" & objASPError.File Response.Write "<br>" & objASPError.Line
首先由Set objASPError = Server.GetLastError取得错误资讯,接着由以下属性取得相关错误资讯,如下:
请参阅B-6
〈如何使用ASPError物件呢 ? 〉 。
■ Server.HTMLEncode方法
HTML编码法
HTMLEncode方法,使用HTML编码法转换字串。
语法,如下:
Server.HTMLEncode( string )
譬如:
<%= Server.HTMLEncode("test: <P>")%>
将输出以下,「<」的HTML编码为「< 」,而「>」为「> 」:
test: <P>
以上显示於用户端的浏览器:
test: <P>
■ Server.MapPath方法
转换成物理路径
MapPath方法,将指定的虚拟路径(virtual path)、或是相对路径(relative path),转换成物理路径(physical path)。
语法,如下:
Server.MapPath( path )
若path以「/」或「\」为起头,视为虚拟路径(virtual path)。若不以「/」或「\」为起头,则MapPath方法将传回相对於此网页的路径。
MapPath方法不会检查路径是否存在。
Request.ServerVariables("PATH_INFO")
譬如以下的例子,test.asp位於C:\Inetpub\Wwwroot\asp路径下,C:\Inetpub\Wwwroot为伺服器的主目录(home directory),由PATH_INFO得知此网页test.asp的物理路径(physical path):
<%= server.mappath(Request.ServerVariables("PATH_INFO"))%>
输出为:
c:\inetpub\wwwroot\asp\test.asp
相对路径转换成物理路径
以下的例子,此网页位於C:\Inetpub\Wwwroot\asp路径下,因为不以「/」或「\」为起头,MapPath方法将传回相对於此网页的路径:
<%= server.mappath("data.txt")%><BR>
<%= server.mappath("jack/data.txt")%><BR>
输出为:
c:\inetpub\wwwroot\asp\data.txt<BR> c:\inetpub\wwwroot\asp\jack\data.txt<BR>
虚拟路径转换成物理路径
以下的例子,因为path以「/」或「\」为起头,视为虚拟路径(virtual path),而asp虚拟路径位於C:\Inetpub\asp路径下:
<%= server.mappath("/asp/data.txt")%><BR>
<%= server.mappath("\asp")%><BR>
输出为:
c:\inetpub\asp\data.txt<BR> c:\inetpub\asp<BR>
以下的例子,以「/」或「\」得知伺服器的主目录(home directory):
<%= server.mappath("/")%><BR>
<%= server.mappath("\")%><BR>
输出为:
c:\inetpub\wwwroot<BR> c:\inetpub\wwwroot<BR>
■ Server.Transfer方法
Server.Transfer为IIS 5.0新增加的新转向方法。执行Server.Transfer方法後就转向到其他程式,不会回原呼叫程式。
语法,如下:
Server.Transfer( path )
Server.Transfer与Response.Redirect比较相类似。Response.Redirect需要由IIS网站先传送到浏览器,浏览器再向将IIS网站要求转向到另一个网页,如此会增加一次用户端与网站伺服器之间的来回通讯时间。
Server.Transfer直接由IIS 5.0於网站伺服器端直接转向到另一个网页,不需先传送到浏览器再要求网站伺服器转向。
Server.Transfer方法会将Session和Application变数值暂时带到转向後之URL位址,Response.Redirect则不会。
■ Server.URLEncode方法
URL编码法
URLEncode方法,使用URL编码法转换字串,包括escape字元。
语法,如下:
Server.URLEncode( string )
譬如:
<%= Server.URLEncode("test here: <P>")%>
将输出以下,「 」的URL编码为「+」,「:」为「%3A 」,「<」的URL编码为「%3C 」,而「>」为「%3E」:
test+here%3A+%3CP%3E
有趣吗 ?
B-6 如何使用ASPError物件呢?
使用Server.GetLastError方法取得错误资讯後,即可由ASPError物件取得有用的错误资讯。
语法如下:
ASPError.property
譬如:
<%
If Response.Buffer Then
Response.Clear
Response.Status = "500 Internal Server Error"
Response.ContentType = "text/html"
Response.Expires = 0
End If
Set objASPError = Server.GetLastError
Response.Write "<br>ASPCode = " & objASPError.ASPCode
Response.Write "<br>ASPDescription = " & objASPError.ASPDescription
Response.Write "<br>Category = " & objASPError.Category
Response.Write "<br>Column = " & objASPError.Column
Response.Write "<br>Description = " & objASPError.Description
Response.Write "<br>File = " & objASPError.File
Response.Write "<br>Line = " & objASPError.Line
Response.Write "<br>Number = " & objASPError.Number
Response.Write "<br>Source = " & objASPError.Source
%>
首先由Set objASPError = Server.GetLastError取得错误资讯,接着由各属性取得相关错误资讯。
若要使用Server.GetLastError取得错误资讯,需将自订错误的处理程式指到以上ASP程式(如asperror3.asp)。方法为在 Internet服务管理员 开启 iis5Samp 虚拟目录的内容,选择 自订错误 标签页,如下:
选择类型为 URL 项,按下 编辑内容 按钮,如下:
输入URL为/iis5Samp/asperror3.asp,按下 确定、套用 按钮。
如此一来,在浏览器执行错误码error1.asp,如下:
<% for i=1 to 1 nxt %>
即会由所设定的自订错误的处理程式asperror3.asp显示错误的讯息,如下:
学会了吗 ?
B-7 如何使用transaction处理功能呢?
异动(Transaction)处理功能使用的时机,为於一个网页当中更新数个资料库的资料时,若更新任一个资料库的资料时发生错误而未更新时,则所有已经更新的资料库将自动恢复到未更新前的资料,以确保所有资料库资料相符的正确性。
当於一个网页当中,更新两个资料库的资料,譬如从一个帐户汇款到另外一个帐户时,当一个帐户的资料库已经扣除所汇的金额,若更新另外一个帐户资料库的资料时发生错误而未更新时,则两个资料库的资料将发生不相符的现象。
若於此网页当中加入异动(Transaction)处理的功能,将已经更新的资料库自动恢复到未更新前的资料,以确保两个资料库资料的正确。
异动(Transaction)处理的功能,仅限於:
一个ASP档案当中,加入@ TRANSACTION指令,即将此ASP档案的网页具备异动(Transaction)处理的功能。
当ASP程式中所有的资料库更动都成功时,才算成功;有一个资料库的更动失败时,已经更动的资料库资料将自动恢复(rollback),这就是所谓的异动(Transaction)功能。譬如从甲帐户汇款到乙帐户时,若乙帐户的资料库更动失败时,已经更动甲帐户的资料库资料将自动恢复(rollback)。数个资料库的资料更动,不是「同生」,就是「共死」。
并不是所有资料库都提供异动(Transaction)的功能,Access没有提供,而SQL Server和Oracle则提供异动(Transaction)的功能。ASP程式中异动(Transaction)功能的有效范围为这个ASP程式,换句话说,这个ASP程式中所有的资料库更动都具有异动(Transaction)功能。
ObjectContext物件
提供Transaction交易处理功能的物件,叫做ObjectContext物件,系由元件服务(Microsoft Transaction Server)所管理。
ObjectContext物件提供两个事件(events),如下:
ObjectContext物件提供两个方法(methods),如下:
Transaction交易处理设计速成
异动(Transaction)处理的设计十分简单,只要於一个ASP档案第一行加入「TRANSACTION=Required」如下:
<%@ TRANSACTION=Required LANGUAGE="VBScript" %>
则此ASP档案的网页即具备异动(Transaction)处理的功能。
ASP档案第一行加入「TRANSACTION=Required」後,若网页内所有程式(包括更新数个资料库)执行成功时,将呼叫OnTransactionCommit()副程式。
若执行失败(包括更新任何一个资料库失败)时,将呼叫OnTransaction Abort()副程式。
异动(Transaction)处理就是这麽简单。
让我们赶快来看看一个异动(Transaction)处理的例子。
这个ASP例子trans1.asp,於用户端使用浏览器,浏览执行的结果如下,显示交易处理已经成功:
网站伺服器trans1.asp档案的ASP程式码如下,交易处理成功呼叫OnTransactionCommit()副程式:
<%@ TRANSACTION=Required LANGUAGE="VBScript" %> <HTML> <HEAD><TITLE>Active Server Pages</TITLE></HEAD> <BODY BGCOLOR=#FFFFFF> ... </BODY> </HTML> <% Sub OnTransactionCommit() Response.Write "Transaction已经commit(呼叫OnTransaction Commit())." end sub Sub OnTransactionAbort() Response.Write "Transaction已经abort(呼叫OnTransaction Abort())." end sub %>
ObjectContext.SetAbort方法将强制呼叫OnTransactionAbort()副程式。
ObjectContext.SetComplete方法将强制呼叫OnTransactionCommit()副程式。
让我们来看看另外一个交易处理已经失败的例子。
这个ASP例子trans2.asp,於用户端使用浏览器,浏览执行的结果如下,显示交易处理已经失败:
网站伺服器trans2.asp档案的ASP程式码如下,ObjectContext.SetAbort方法将强制呼叫OnTransactionAbort()副程式:
<%@ TRANSACTION=Required LANGUAGE="VBScript" %> <HTML> <HEAD><TITLE>Active Server Pages</TITLE></HEAD> <BODY BGCOLOR=#FFFFFF> ... <% ObjectContext.SetAbort %> </BODY> </HTML> <% Sub OnTransactionCommit() Response.Write "Transaction已经commit(呼叫OnTransactionCommit())." end sub Sub OnTransactionAbort() Response.Write "Transaction已经abort(呼叫OnTransactionAbort())." end sub %>
ASP语法有错误,也将执行失败呼叫OnTransactionAbort()副程式。
让我们来看看一个ASP语法有错误的例子。
这个ASP例子trans3.asp,於用户端使用浏览器,浏览执行的结果如下,显示语法有错误而呼叫OnTransactionAbort()副程式:
网站伺服器trans3.asp档案的ASP程式码如下:
<%@ TRANSACTION=Required
LANGUAGE="VBScript" %>
<HTML>
<HEAD><TITLE>Active Server Pages</TITLE></HEAD>
<BODY BGCOLOR=#FFFFFF>
<FONT COLOR="#FF8080">■ </FONT> <FONT COLOR="BLUE">
OnTransactionAbort :</FONT><br>
语法有错误!
<% a.b %>
</BODY></HTML>
<%
Sub OnTransactionCommit()
Response.Write "Transaction已经commit(呼叫OnTransactionCommit())."
end sub
Sub OnTransactionAbort()
Response.Write "Transaction已经abort(呼叫OnTransactionAbort())."
end sub
%>
更新两个资料库资料
於一个网页更新数个相关联资料库的资料,最好使用异动(Transaction)处理,譬如从销售资料库增加销售数量,同时从库存资料库减少库存数量,以确保更新发生错误时,两个资料库的资料不会发生不相符的现象。
让我们看看更新两个资料库资料的例子trans4.asp和trans4.asp,您必须先安装SQL Server 7.0/6.5才可以执行。
这个ASP例子trans4.asp,於用户端使用浏览器,浏览执行的结果如下,显示库存数量减少一个的更新成功时,销售数量增加一个的更新也成功:
网站伺服器trans4.asp档案的ASP程式码如下:
<%@ TRANSACTION=Required
LANGUAGE="VBScript" %>
<HTML>
<HEAD><TITLE>Active Server Pages</TITLE></HEAD>
<BODY BGCOLOR=#FFFFFF>
<FONT COLOR="#FF8080">■ </FONT> <
FONT COLOR="BLUE">更新两个资料库的资料 :</FONT><p>
<%
Set Conn = Server.CreateObject("ADODB.Connection")
Set rs1 = Server.CreateObject("ADODB.Recordset")
Set rs2 = Server.CreateObject("ADODB.Recordset")
Conn.Open "Driver={SQL Server};Server=(Local);
UID=sa;PWD=;DATABASE=pubs"
Set rs1.ActiveConnection = Conn
Set rs2.ActiveConnection = Conn
rs1.Source = "SELECT * FROM sales"
rs1.CursorType = 3 'adOpenStatic
rs1.LockType = 3 'adLockOptimistic
rs1.Open
If(Not rs1.EOF)Then
rs1("qty").Value = rs1("qty").Value + 1
rs1.Update
Response.Write "销售数量: " &
rs1("qty")& "<br>"
End If
rs2.Source = "SELECT * FROM stores where stor_id='" &
rs1("stor_id")& "'"
rs2.CursorType = 3
rs2.LockType = 3
rs2.Open
If(Not rs2.EOF)Then
rs2("Zip").Value = rs2("Zip").Value - 1
rs2.Update
Response.Write "库存数量: " &
rs2("Zip")& "<br>"
End If
%>
</BODY></HTML>
<%
Sub OnTransactionCommit()
Response.Write "<br>更新成功!<br>
Transaction已经commit(呼叫OnTransactionCommit())."
end sub
Sub OnTransactionAbort()
Response.Write "<br>更新不成功!<br>
Transaction已经abort(呼叫OnTransactionAbort())."
end sub
%>
让我们赶快来看看另外一个更新不成功的例子。
这个ASP例子trans5.asp,於用户端使用浏览器,浏览执行的结果如下,显示库存数量减少一个的更新不成功时,销售数量增加一个的更新也不成功:
网站伺服器trans5.asp档案的ASP程式码如下:
<%@ TRANSACTION=Required LANGUAGE="VBScript" %>
<HTML>
<HEAD><TITLE>Active Server Pages</TITLE></HEAD>
<BODY BGCOLOR=#FFFFFF>
<FONT COLOR="#FF8080">■ </FONT> <
FONT COLOR="BLUE">更新两个资料库的资料 :</FONT><p>
<%
Set Conn = Server.CreateObject("ADODB.Connection")
Set rs1 = Server.CreateObject("ADODB.Recordset")
Set rs2 = Server.CreateObject("ADODB.Recordset")
Conn.Open "Driver={SQL
Server};Server=(Local);UID=sa;PWD=;DATABASE=pubs"
Set rs1.ActiveConnection = Conn
Set rs2.ActiveConnection = Conn
rs1.Source = "SELECT * FROM sales"
rs1.CursorType = 3 'adOpenStatic
rs1.LockType = 3 'adLockOptimistic
rs1.Open
If (Not rs1.EOF) Then
Response.Write "销售数量: " &
rs1("qty") & "<br>"
rs1("qty").Value = rs1("qty").Value + 1
rs1.Update
End If
rs2.Source = "SELECT * FROM stores where stor_id='12345'"
rs2.CursorType = 3
rs2.LockType = 3
rs2.Open
rs2("Zip").Value = rs2("Zip").Value - 1
rs2.Update
%>
</BODY></HTML>
<%
Sub OnTransactionCommit()
Response.Write "<br>更新成功!<br>Transaction已经commit (呼叫
OnTransactionCommit())."
end sub
Sub OnTransactionAbort()
Response.Write "<br>更新不成功!<br>Transaction已经abort (呼叫
OnTransactionAbort())."
end sub
%>
动作是否正常呢 ?
■ @ TRANSACTION语法
@ TRANSACTION指令设定此ASP档案的网页是否可具备异动(Transaction)处理的功能。
异动(Transaction)处理功能使用的时机,为於一个网页当中更新数个资料库的资料时,若更新任一个资料库的资料时发生错误而未更新时,所有已经更新的资料库将自动恢复到未更新前的资料,以确保所有资料库资料相符的正确性。
异动(Transaction)处理的设计十分简单,只要於一个ASP档案第一行加入「TRANSACTION=Required」,如下:
<% @ TRANSACTION=Required LANGUAGE="VBScript" %>
则此ASP档案的网页即具备异动(Transaction)处理的功能。
@ TRANSACTION指令语法如下,注意@和LANGUAGE中间须加空格,且位於ASP档案的第一行:
<% @ TRANSACTION=value %>
value可设定为:
<% @ TRANSACTION=Required %>
您学会了吗 ?
B-8 如何使用伺服器#指令呢?
您可以使用伺服器端包含档的#指令(server-side include directives),以将一个档案的内容,包括於一个HTML或ASP网页当中,以及包括一个档案的资讯,譬如档案大小、档案修改时间等,或者设定错误讯息格式等。
ASP所提供的#指令,如下:
#指令只可使用於HTML码当中,不可以使用於ASP码当中。
详细介绍如下:
■ #config指令
#config指令,设定传到使用者浏览器的错误讯息、日期、档案大小单位等格式。
#config可使用於HTML码当中,不可以使用於ASP码当中。
语法,如下:
<!-- #config Output = String -->
<!-- #config errmsg="An SSI error has occurred." -->
譬如设定时间为HH:MM:SS格式:
<!-- #config timefmt="%H:%M:%S" -->
譬如设定日期为MM/DD/YY格式:
<!-- #config timefmt="%m/%d/%y" -->
譬如设定档案大小的单位为bytes格式:
<!-- #config sizefmt="bytes" -->
您学会了吗 ?
■ #echo指令
#echo指令,於一个HTML网页当中插入环境变数。
#echo可使用於HTML码当中,不可以使用於ASP码当中。於ASP码当中,可使用Response.ServerVariables语法,请参阅B-5〈如何使用Server物件呢 ? 〉一节。
语法,如下:
<!-- #echo var = VariableName -->
譬如插入HTTP request储存於?後的字串:
<!-- #echo var="QUERY_STRING"-->
有意思吗 ?
■ #exec指令
#exec指令,执行一个应用程式或DOS命令(shell command),并将执行结果插入一个HTML网页当中。
#exec指令可使用於HTML码当中,不可以使用於ASP码当中。
语法,如下:
<!-- #exec CommandType = CommandDescription -->
为了避免执行#exec指令所造成的安全问题(譬如下个FORMAT),可设定SSIExecDisable metabase属性,以关闭#exec指令功能。
譬如,执行.exe程式并输入参数:
<!-- #exec cgi="/scripts/test.exe?firstname+lastname" -->
譬如,执行.dll程式并输入参数:
<!-- #exec cgi="/scripts/test.dll?jack" -->
譬如,执行DOS命令(shell command)并输入参数:
<!-- #exec cmd="c:\tools\test.exe -a" -->
好玩吗 ?
■ #flastmod指令
#flastmod指令,於一个HTML网页当中插入档案的修改时间。
此指令可使用於HTML码当中,不可以使用於ASP码当中。
语法,如下:
<!-- #flastmod PathType = FileName -->
时间格式可於#config指令的timefmt中设定。
譬如插入default.htm档案的修改时间:
<!-- #flastmod file = "default.htm" -->
有意思吗 ?
■ #fsize指令
#fsize指令,於一个HTML网页当中插入档案大小。
此指令可使用於HTML码当中,不可以使用於ASP码当中。
语法,如下:
<!-- #fsize PathType = FileName -->
档案大小的单纯格式可於#config指令的sizefmt中设定。
譬如插入default.htm档案的档案大小:
<!-- #fsize file = "default.htm" -->
动作是否正常呢 ?
■ #include指令
#include指令,於一个HTML或ASP网页当中插入一个档案的内容。
插入的档案可为HTML或ASP格式的码。
此指令可使用於HTML码当中,不可以使用於ASP码当中。
语法,如下:
<!-- #include PathType = FileName -->
譬如插入test.asp和global.inc档案:
<!-- #include file = "test.asp" --> <!-- #include virtual = "/include/global.inc" -->
学会了吗 ?
B-9 如何使用ASP @指令呢?
您只能在一个ASP档案中,使用一次@指令(@ processing directives),以告诉IIS如何处理此ASP档案的程式码,包括异动(Transaction)处理的功能、地区识别代码、session tracking、script语言、所使用的语文等。
ASP所提供的@指令,如下:
@指令只可使用於ASP码当中,不可以使用於HTML码当中。
@ TRANSACTION请参阅B-7〈如何使用transaction处理功能呢 ? 〉一节。
其他介绍@指令如下:
■ @ CODEPAGE指令
@ CODEPAGE指令设定ASP码所使用的「code page」,一个code page为一个character set(字元组),可以包括数字、字元、标点符号等。不同的语文使用不同的code page。code page使用一个数字代表一种语文,譬如950代表中文, ANSI code page为1252使用於美国英语和大部份的欧语,932使用於日本的汉字。
使用@ CODEPAGE指令设定语文後,可使用Session.CodePage属性重新设定之。Session.CodePage属性请参阅B-2〈如何使用Session物件呢 ? 〉一节。
CODEPAGE的script标记之语法,如下,注意@和CODEPAGE中间须加空格:
<% @ CODEPAGE=codepage %>
codepage是code page ID,使用一个数字代表一种语文。
以上程式码须位於任何可执行码之前。一个档案只能出现一次。
譬如设定为中文:
<% @ CODEPAGE=950 %>
学会了吗 ?
■ @ ENABLESESSIONSSTATE指令
@ ENABLESESSIONSSTATE指令启动或关闭一个网页的session tracking功能。session tracking记录一个用户所提出的request资讯。若不需要session tracking功能,将之关闭,可加速ASP的执行速度。
语法如下,注意@和ENABLESESSIONSSTATE中间须加空格:
<% @ ENABLESESSIONSSTATE=True|False %>
启动(True)或关闭(False)一个网页的session tracking功能。
譬如启动session tracking功能:
<% @ ENABLESESSIONSSTATE=True %>
有意思吗 ?
■@ LANGUAG指令
@ LANGUAGE指令设定ASP档案使用的script语言。若未设定,则预设为VBScript。
语法如下,注意@和LANGUAGE中间须加空格:
<% @ LANGUAGE=scriptengine %>
scriptengine可设定为VBScript或JScript。
设定後,可使用IIS Admin物件的AspScriptLanguage属性来改变script语言。
譬如设定为JScript:
<% @ LANGUAGE= JScript %>
好玩吗 ?
■ @ LCID指令
@ LCID指令设定地区识别代码地区识别代码(locale identifier LCID)。LCID的地区识别码为国际标准缩写,以辨别系统安装的地区。LCID为两个位元组,低位元组部份包括语文识别(language identifier),高位元组部份为预留。LCID有两个,LOCALE_SYSTEM_DEFAULT为系统预设的地区,LOCALE_USER_DEFAULT为现在使用者的地区。
语法如下,注意@和LANGUAGE中间须加空格:
<% @ LCID=localeidentifier %>
localeidentifier为地区识别代码(locale identifier)。
设定後,可使用Session物件的Session.LCID属性属性来改变地区识别代码。