附录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物件)等功能,如下:

  1.  Application物件: 一个应用程式内所有使用者共同使用,可以於多个网页之间保留和使用一些共同的资讯。
  2.  Session物件: 仅适合於一个使用者使用,可以於多个网页之间保留一个使用者的资讯。
  3.  Request物件: 取得用户资讯。
  4.  Response物件: 传送资讯给用户。
  5.  Server物件: 提供存取伺服器的方法(methods)、和属性(properties)的功能。
  6.  ASPError物件: 利用ASPError物件可找出ASP的详细错误。
  7.  ObjectContext物件: 提供异动(Transaction)处理功能的物件,系由元件服务(Microsoft Transaction Server)所管理。

於内建的物件中,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有以下数个集合(collection):
     
    •  Application.Contents集合: 包含所有已经被定义的Application资讯,不包括Global.asa档案中由<OBJECT>所定义的部份。
       
    •  Application.StaticObjects集合: 包含所有Global.asa档案中由<OBJECT>所定义的Application资讯。
       
  • Application有以下数个方法(methods):
     
    •  Lock: 禁止别的使用者修改Application的资讯。
       
    •  Unlock: 允许别的使用者修改Application的资讯。
       
    •  Contents.Remove: 移除Application.Contents集合中一个Application的资讯。
       
    •  Contents.RemoveAll: 移除Application.Contents集合中所有Application的资讯。
       
  • Application有以下数个事件(events),定义於Global.asa档案中:
     
    •  Application_OnStart: 启动一个Application应用程式时触发执行的程序。
       
    •  Application_OnEnd: 结束一个Application应用程式时触发执行的程序。
       

储存共同变数值
 

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>
  •  ScriptLanguage: 设定事件的程式所用到的script语言,为VBScript或JScript。 若多个事件的程式用到相同的script语言,则可以一起包括於一个<SCRIPT>...</SCRIPT>当中。
     

■ Application_OnEnd事件
 

结束一个application应用程式时,将触发执行Application_OnEnd的程序。触发Application_OnEnd事件的执行程式,定义於Global.asa档案中。

语法,如下:

<SCRIPT LANGUAGE=ScriptLanguage RUNAT=Server> 
Sub Application_OnEnd
. . . 
End Sub 
</SCRIPT>
  •  ScriptLanguage: 设定事件的程式所用到的script语言,为VBScript或JScript。 若多个事件的程式用到相同的script语言,则可以一起包括於一个<SCRIPT>...</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物件有以下数个集合(collection):
     
    •  Session.Contents集合: 包含所有已经被定义的Session资讯,不包括Global.asa档案中由<OBJECT>所定义的部份。
       
    •  Session.StaticObjects集合: 包含所有Global.asa档案中由<OBJECT>所定义的Session资讯。
       
  • Session物件有以下数个方法(methods):
     
    •  Abandon: 放弃session,将破坏结束一个Session,释放出所占的资源。
       
    •  Contents.Remove: 移除Session.Contents集合中一个Session的资讯。
       
    •  Contents.RemoveAll: 移除Session.Contents集合中所有Session的资讯。
       
  • Session物件有以下几个属性(properties):
     
    •  CodePage: 处理多国语文。
       
    •  LCID: 传回一个使用者的地区代码(locale identifier)。
       
    •  SessionID: 传回一个使用者的代码。
       
    •  Timeout: 一个Session的timeout时间,单位为分钟。
       
  • Session物件有以下数个事件(events),定义於Global.asa档案中:
     
    •  Session_OnStart: 启动一个Session时触发执行的程序。
       
    •  Session_OnEnd: 结束一个Session时触发执行的程序。
       

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]
  • nMinutes:设定自动结束Session的timeout时间,单位为分钟。预设值为20分钟。
     

若想设定久一点,譬如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>
  • ScriptLanguage:设定事件的程式所用到的script语言,为VBScript或JScript。 若多个事件的程式用到相同的script语言,则可以一起包括於一个<SCRIPT>...</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>
  • ScriptLanguage:设定事件的程式所用到的script语言,为VBScript或JScript。 若多个事件的程式用到相同的script语言,则可以一起包括於一个<SCRIPT>...</SCRIPT>当中。
     

Session_OnEnd事件的程式所用到的script语言,不可呼叫Server.MapPath方法。

B-3 如何使用Request物件呢?
 

取得用户资讯
 

透过Internet或Intranet,网站伺服器如何取得用户端的资讯(譬如使用的浏览器种类、或表单输入)呢 ?

ASP的内建「Request物件」提供取得用户端资讯的功能。

Request物件将HTTP request传来的资讯解析出,包括五个「collection」(集合):

  1.  Request.ClientCertificate: 读取Client Certificates值。
  2.  Request.Cookies: 读取用户端硬碟所储存的Cookies值。
  3.  Request.Form: 读取使用POST方式的表单(form)之输入值。
  4.  Request.QueryString: 读取使用GET方式的表单(form)之输入值。
  5.  Request.ServerVariables: 读取伺服器的环境变数值。

您可以使用以下通用的语法,来读取Request物件的资讯:

Request.Collection名称(variable名称)
  •  Collection名称: 为QueryString、Form、Cookies、ServerVariables、或ClientCertificate。
     
  •  variable名称: 为要读取collection的变数名称。
     

若不指定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)
  •  variant: 呼叫BinaryRead後所传回的位元组阵列,为VT_ARRAY | VT_UI1型态。
     
  •  count: 呼叫前设定读取多少的位元组。呼叫後传回已经传来多少的位元组。总共读取的位元组数为Request.TotalBytes。
     

因为BinaryRead方法所读到的资料为Post request的一部份,若再使用Request.Form读取资料,将发生错误;相反地,若已使用Request.Form读取资料,再使用BinaryRead方法读取资料,将发生错误。

■ Request.TotalBytes属性
 

得知总计读取的位元组数。

语法如下,此属性为唯读:

counter = Request.TotalBytes

■ Request.Cookies集合
 

Request.Cookies读取Cookies的值,语法如下,其中中括弧[...]部份为选项,可有可无:

Request.Cookies(cookie)[(key)|.HasKeys]
  •  cookie: 待读取的Cookies名称。
     
  •  key: 读取cookie路径的key。
     
  •  HasKeys: 仅可读取,得知cookie是(True)否(False)包括key。
     

假设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]
  •  name: 栏位名称。
     
  •  index: 当同一栏位输入多个值时,指标值index指定要读取同一栏位的哪一个值。范围由1到Request.Form(name).Count。
     
  •  Count: 由Request.Form(name).Count可得知name栏位输入几个值。若无此name栏位,则Count=0。
     

譬如以下的例子,其中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]
  •  name: 栏位名称。
     
  •  index: 当同一栏位输入多个值时,指标值index指定要读取同一栏位的哪一个值。范围由1到Request.QueryString(name).Count。
     
  •  Count: 由Request.QueryString(name).Count可得知name栏位输入几个值。若无此name栏位,则Count=0。
     

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])
  •  Key : 设定certificate栏位名称,如下:
     
    •  Subject: subfield(子栏位)值,包含certificate的Subject(标题)。若未设定subfield,则传回的各subfield值之间以逗点分隔之,譬如C=US, O=Msft, ...。
       
    •  Issuer: subfield(子栏位)值,包含certificate的Issuer(发行者)。若未设定subfield,则传回的各subfield值之间以逗点分隔之,譬如C=US, O=Verisign, ...。
       
    •  ValidFrom: certificate的有效期间的起始日期,譬如7/16/97  11:59:59 PM。
       
    •  ValidUntil: certificate的有效期间的结束日期,譬如7/16/99  11:59:59 PM。
       
    •  SerialNumber: certification序号,譬如04-67-F3-02。
       
    •  Certificate: 整个certificate内容,为ASN.1格式。
       
    •  Flags: 其他额外的资讯,譬如:
       
      • ceCertPresent:已经提出client certificate 。
         
      • ceUnrecognizedIssuer:上次certification的是一个不知名的issuer。
         
  •  SubField: 取得Subject、或Issuer的key之个别栏位。加於Subject、或Issuer的後面,譬如IssuerO、或SubjectCN。以下列出一些共同的SubField值:
     
    • C:国名。
       
    • O:公司组织名。
       
    • OU:组织单位名。
       
    • CN:使用者一般名称(用於Subject的key)。
       
    • L:位置。
       
    • S:州或省。
       
    • T:职称头衔。
       
    • GN:名。
       
    • I:姓。
       

未列於上述的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)
  •  variable :伺服器环境的变数名称,如下:
     
    •  ALL_HTTP: 用户(client)所传送的所有HTTP headers,於header名称前面加上HTTP_以及header名称为大写,譬如:HTTP_ACCEPT:image/gif、HTTP_ACCEPT_LANGUAGE: zh-tw、HTTP_CONNECTION: Keep-Alive、HTTP_HOST: 1.1.1.1 、HTTP_USER_AGENT: Mozilla/4.0、HTTP_COOKIE:...、HTTP_ACCEPT_ENCODING: gzip, deflate等。
       
    •  ALL_RAW: 用户所传送的所有HTTP headers原始资料,与ALL_HTTP不同的是ALL_HTTP於header名称前面加上HTTP_以及header名称为大写,ALL_RAW则为使用者传送的原始资料,譬如:Accept: image/gif、Accept-Language: zh-tw、Connection: Keep-Alive、Host: 1.1.1.1、User-Agent: Mozilla/4.0 、Cookie: ...、Accept-Encoding: gzip, deflate等。
       
    •  APPL_MD_PATH: 取得ISAPI DLL应用程式的metabase path,譬如: LM/W3SVC/1/Root/asp。
       
    •  APPL_PHYSICAL_PATH: 取得ISAPI DLL应用程式的physical path,譬如:c:\asp\。
       
    •  AUTH_PASSWORD: 使用Basic authentication验证方式时,用户於验证(authentication)对话方块中所输入的密码。
       
    •  AUTH_TYPE: 用户尝试存取伺服器有保护的程式之authentication(验证)方式。「Basic」表示Basic authentication验证方式,「NTLM」表示challenge/response验证方式,空字串表示未使用验证。
       
    •  AUTH_USER: 用户验证(client's authentication)时,用户於验证(authentication)对话方块中所输入的使用者名称。
       
    •  CERT_COOKIE: 使用用户端认证(client certificate)方式时所取得的独特字串,可当做验证用户的签名。
       
    •  CERT_FLAGS : 位元0代表是(b0=1)否(b0=0)使用用户端认证(client certificate),位元1为1(b1=1)代表核发用户端认证(client certificate)的认证中心(Certificate Authority)为无效,即未列於伺服器已经认可的认证中心名单当中。
       
    •  CERT_ISSUER: 用户端认证(client certificate)的Issuer(发行者)栏位(O=MS, OU=IAS, CN=user name, C=USA)。
       
    •  CERT_KEYSIZE: SSL(Secure Sockets Layer)连结所使用的key(金钥)长度,譬如:128。
       
    •  CERT_SECRETKEYSIZE: 伺服器认证(server certificate)的private key(密钥)长度,譬如:1024。
       
    •  CERT_SERIALNUMBER : 用户端认证(client certificate)的Serial number(序号)栏位。
       
    •  CERT_SERVER_ISSUER: 伺服器认证(server certificate)的Issuer(发行者)栏位。
       
    •  CERT_SERVER_SUBJECT: 伺服器认证(server certificate)的Subject(主旨)栏位。
       
    •  CERT_SUBJECT: 用户端认证(client certificate)的Subject(主旨)栏位。
       
    •  CONTENT_LENGTH: 预期从用户接收到的content(内容)长度(单位为bytes)。
       
    •  CONTENT_TYPE: content(内容)传送的型态,譬如:GET、POST、PUT。
       
    •  GATEWAY_INTERFACE: CGI版本,譬如:CGI/1.1。
       
    •  HTTP_<HeaderName>: 表头名称为HeaderName的值。
       
    •  HTTP_ACCEPT: Accept header值,譬如image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, application/vnd.ms-powerpoint, */* 。
       
    •  HTTP_ACCEPT_LANGUAGE: 显示内容之语言,譬如zh, en 。
       
    •  HTTP_CONNECTION: 譬如Keep-Alive 。
       
    •  HTTP_HOST: 譬如168.95.1.10。
       
    •  HTTP_UA_PIXELS: 譬如640x480 。
       
    •  HTTP_UA_COLOR: 譬如color8。
       
    •  HTTP_UA_OS: 譬如Windows NT 。
       
    •  HTTP_UA_CPU: 譬如x86。
       
    •  HTTP_USER_AGENT: 提出request者之浏览器种类,譬如Mozilla/2.0(compatible; MSIE 3.01; Windows NT)。
       
    •  HTTP_COOKIE: request所包括的cookie字串,譬如ASPSESSIONID = YECSYVXCZKIOCEFT。
       
    •  HTTP_REFERER: redirect发生时,原来提出request者之URL位址。
       
    •  HTTPS: 是(ON)否(OFF)使用SSL(Secure Sockets Layer)连结,譬如:OFF。
       
    •  HTTPS_KEYSIZE: SSL(Secure Sockets Layer)连结所使用的key(金钥)长度,譬如:128。
       
    •  HTTPS_SECRETKEYSIZE: 伺服器认证(server certificate)的private key(密钥)长度,譬如:1024。
       
    •  HTTPS_SERVER_ISSUER: 伺服器认证(server certificate)的Issuer(发行者)栏位。
       
    •  INSTANCE_ID: IIS instance的文字型态ID,譬如1。
       
    •  INSTANCE_META_PATH: IIS instance的metabase path,譬如/LM/W3SVC/1。
       
    •  LOCAL_ADDR: 取得提出request之伺服器IP位址,譬如1.1.1.1。
       
    •  LOGON_USER: Windows NT的签入使用者。
       
    •  PATH_INFO: 此网页档案的虚拟路径。譬如:/asp/aspreqst.asp。
       
    •  PATH_TRANSLATED: 此网页档案的真正物理路径。譬如:D:\asp\aspreqst.asp 。
       
    •  QUERY_STRING: HTTP request储存於?後的字串。
       
    •  REMOTE_ADDR: 发出HTTP request的用户(譬如gateway、firewall)IP位址。譬如:168.95.1.10。
       
    •  REMOTE_HOST: 发出HTTP request的用户(譬如gateway、firewall)名称。譬如:www.abc.com 。
       
    •  REMOTE_USER: 发出HTTP request的使用者名称,空字串表示使用anonymous匿名方式。
       
    •  REQUEST_METHOD: request的方式,如GET、HEAD、POST等。譬如:GET、HEAD、POST。
       
    •  SCRIPT_MAP: URL基底部份。
       
    •  SCRIPT_NAME: 此script档案的虚拟路径。譬如:/asp/aspreqst.asp。
       
    •  SERVER_NAME: 伺服器名称。譬如:www.abc.com。
       
    •  SERVER_PORT: 伺服器的连接port。譬如:80 。
       
    •  SERVER_PORT_SECURE: request是(1)否(0)使用安全的PORT。譬如:0 。
       
    •  SERVER_PROTOCOL: HTTP名称版本。譬如HTTP/1.0 。
       
    •  SERVER_SOFTWARE: IIS伺服器的软体版本。譬如Microsoft-IIS/4.0 、Microsoft-IIS/5.0。
       
    •  URL: URL基底部份。
       

新的表头
 

若用户端传送来新的表头,譬如:

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物件」提供传送资讯给用户的功能,譬如:

  • 传送字串到浏览器。
     
  • 连结到指定的URL位址。
     
  • 设定传送资料的内容型态。
     
  • 传送并写入cookie到用户端的电脑。
     
  • 暂存资讯於缓冲器。
     

IIS 5.0於Response物件新增加Response.CacheControl、Response.Charset、Response.IsClientConnected、Response.Pics属性。

语法如下:

Response [.collection | .property | _method]
  • Response物件之集合(Collections):只有Cookies一项,Response.Cookies传送并写入cookie到用户端的电脑。
     
  • Response物件有以下几个属性(Properties):
     
    •  Buffer: 设定是(True)否(False)暂存资讯於缓冲器。IIS 5.0预设为True。
       
    •  CacheControl: 设定proxy servers是(" Public")否(" Private")暂存此网页的资讯於Cache当中。
       
    •  Charset: 设定character set的名称,加於content-type header上。
       
    •  ContentType: 设定HTTP传送资料的内容型态(HTTP content type)。
       
    •  Expires: 设定记录资料匣(page cached,含有使用者查阅过画面的连结)保留的期限。
       
    •  ExpiresAbsolute: 设定记录资料匣(page cached,含有使用者查阅过画面的连结)保留的时间日期。
       
    •  IsClientConnected: 侦测使用者是(True)否(False)仍然连线。
       
    •  Pics: 加值於pics-label response header上。
       
    •  Status: 设定HTTP协定,网站伺服器回覆给浏览器的执行结果Status。
       
  • Response物件有以下几个方法(Methods):
     
    •  AddHeader: 设定HTTP的新表头(header)之名称和值。
       
    •  AppendToLog: 加一个字串到Web server log结尾处。
       
    •  BinaryWrite: 伺服器传送不经字元转换(character-set conversion)的二进位资料到浏览器。
       
    •  Clear: 清除缓冲器的内容。
       
    •  End: 停止.asp档案的处理,传送缓冲器的内容。
       
    •  Flush : 立刻传送缓冲器的内容。
       
    •  Redirect: 连结到指定的URL位址。
       
    •  Write: 传送字串到浏览器。
       

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程式执行到一半时,可以:

  1. 随时使用Response.Redirect方法,连结到别的URL位址;
  2. 或使用Response.Clear方法,清除缓冲器的内容,传送不同的内容到用户端浏览器;
  3. 或使用Response.End方法,停止.asp档案的处理,传送缓冲器的内容;
  4. 或使用Response.Flush方法,立刻传送缓冲器的内容。

譬如:

<% 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
  • ContentType是一个叙述HTTP内容型态(HTTP Content Type)的字串。

    以下的例子设定为各种的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]
  • number :记录资料匣(page cached)的保留期限,单位为分钟。

    保留期限设为0(Response.Expires = 0)时,此网页将立刻於记录资料匣被清除。保留期限设定多次时,使用较短的保留期限。

    若用户端电脑系统时间比IIS电脑系统时间早时或因时差缘故,设定Response.Expires = 0後,网页可能不会立刻被清除。解决之道如下:

    1. 设定Response.ExpiresAbsolute为过期时间。
    2. 将Response.Expires保留期限设为负值,如下:
    Response.Expires = -1

    则网页将立刻被清除。

    因此若希望网页会立刻被清除,请设定Response.Expires = -1。

    ■ Response.ExpiresAbsolute属性
     

    网页保留的时间日期
     

    Response.ExpiresAbsolute属性,设定一个网页在记录资料匣(page cached,含有使用者查阅过网页的连结)保留的时间日期。

    若用户端浏览器於一个网页保留的期限内,再度浏览此网页时,原储存於用户端硬碟记录资料匣的旧网页(cached version)内容,将被显示於用户端的浏览器。

    若未设定时间,以半夜为准。

    若未设定日期,以网页执行当天计算。

    语法,如下:

    Response.ExpiresAbsolute [= [date] [time]]
    •  date :设定保留期限的日期。格式请参考RFC-1123的日期格式。
       
    •  time :设定保留期限的时间。将被转换成GMT时间传送到用户端的浏览器。 保留期限设定多次时,使用较短的保留期限(时间日期)。以下的例子设定一个网页在记录资料匣(page cached)保留的时间日期到May 3,2002 17:30:25为止,如下:
       
    <% 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
  •  StatusDescription :Server回应值。包括「叁位数字」和叙述,如上表,譬如「310 Move Permanently」。

    您可以使用Response.Status属性,修改HTTP协定,网站伺服器回覆给浏览器的Server回应值。

    以下的例子设定了Server回应值,如下:

    <% Response.Status = "401 Unauthorized" %>

    有趣吗 ?

    ■ Response.AddHeader方法
     

    设定HTTP的新表头
     

    使用Response.AddHeader方法,伺服器可以设定HTTP的新表头(header)之名称和值。

    此方法不能取代现存的表头(header)。一旦设定新表头(header),就无法移除。

    语法,如下:

    Response.AddHeader name, value
    •  name :新表头(header)之名称。
       
    •  value :新表头(header)之初值。
       

    因为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
  •  string :加到log档案结尾处的字串。不能包括逗点,最大字数为80。

    ■ Response.BinaryWrite方法
     

    传送二进位资料
     

    使用BinaryWrite方法,伺服器可以传送不经字元转换(character-set conversion)的二进位资料到浏览器。

    语法,如下:

    Response.BinaryWrite data
  •  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
  •  URL :连结到的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
  •  variant :传送的字串。variant可为VBScript的任何资料型态,包括characters、strings、integers。

    %>
     

    由於「%>」会被误判为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 :待写入的Cookies名称。
       
    •  key :若设定key,则cookie为路径,设定key值为value。
       
    •  attribute :设定cookie的参数,可设定的参数如下:

       
      •  Expires :仅可写入,设定此cookie的有效期间,须使用Expires设定有效期间,cookie才会真正写入用户端的硬碟。
         
      •  Domain :仅可写入,若设定Domain,则此cookie仅被此Domain读取。
         
      •  Path :仅可写入,若设定Path,则此cookie仅被此送到此Path。若未设定Path,则此cookie被送到application path。
         
      •  Secure :仅可写入,设定此cookie是(True)否(False)安全。
         
      •  HasKeys :仅可读取,设定此cookie是(True)否(False)包括key。
         
    •  Value :设定此cookie的值、key的值、参数的值。
       

    新的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物件属性(properties):只有一个,如下:
       
    •  ScriptTimeout :设定script执行的times out时间。
       
    • Server物件方法(methods):

       
      •  CreateObject :产生伺服器元件(component)的instance,以定义一个ASP元件。
         
      •  Execute :执行Server. Execute後先转向到其他程式,之後仍然会继续执行原呼叫程式Server.Execute下一行的指令。
         
      •  GetLastError :显示有用的错误资讯。
         
      •  HTMLEncode :使用HTML编码法转换字串。
         
      •  MapPath :将指定的虚拟路径(virtual path)、或是相对路径(relative path),转换成物理路径(physical path)。
         
      •  Transfer :执行Server.Transfer後就转向到其他程式,不会回原呼叫程式。
         
      •  URLEncode :使用URL编码法转换字串,包括escape字元。
         

    本节将一一详细介绍如下。

    ■ Server.ScriptTimeout属性
     

    Script的times out
     

    ScriptTimeout属性,取得或设定Script的最久执行(times out)时间。

    伺服器元件(component)不理会ScriptTimeout的times out时间设定。

    语法,如下:

    Server.ScriptTimeout = Seconds
  • Seconds:Script最久执行(times out)时间,单位为秒。预设值为90秒。

    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 )
  •  progID :设定产生物件的型态,格式为[Vendor.]Component[.Version] 。 譬如以下的例子定义一个「广告轮播器」的ASP元件,让广告图片轮流显示於网页上,只要两行ASP程式码,如下:
    <% 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 )
  •  path :虚拟路径(virtual path),或是相对路径(relative path)。 建议勿使用绝对URL位址。

    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取得错误资讯,接着由以下属性取得相关错误资讯,如下:

    •  objASPError.Category :如Microsoft VBScript编译阶段错误。
       
    •  objASPError.Number :如0x800A03FC。
       
    •  objASPError.ASPDescription :如必须要有 'Next'。
       
    •  objASPError.File :如/iis5samp/error1.asp。
       
    •  objASPError.Line :如24。
       

    请参阅B-6 〈如何使用ASPError物件呢 ? 〉 。

    ■ Server.HTMLEncode方法
     

    HTML编码法
     

    HTMLEncode方法,使用HTML编码法转换字串。

    语法,如下:

    Server.HTMLEncode( string )
  •  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),或是相对路径(relative 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 )
  •  path :虚拟路径(virtual path),或是相对路径(relative 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 )
  •  string :待编码转换的字串。

    譬如:

    <%= Server.URLEncode("test here: <P>")%>

    将输出以下,「 」的URL编码为「+」,「:」为「%3A 」,「<」的URL编码为「%3C 」,而「>」为「%3E」:

    test+here%3A+%3CP%3E

    有趣吗 ?

    B-6 如何使用ASPError物件呢?
     

    使用Server.GetLastError方法取得错误资讯後,即可由ASPError物件取得有用的错误资讯。

    语法如下:

    ASPError.property
    • ASPError物件有以下几个属性(Properties):

       
      •  ASPCode :传回IIS错误码。
         
      •  ASPDescription :传回ASP详细错误原因描述,譬如「必须要有 'Next'」。
         
      •  Category :指示出错误来源为ASP、scripting language、或object ,譬如「Microsoft VBScript编译阶段错误」。
         
      •  Column :传回ASP程式错误位置列数,譬如「1」。
         
      • Description :传回错误原因简介。
         
      •  File :传回错误程式档案名称,譬如「/iis5samp/error1.asp」。
         
      •  Line :传回ASP程式错误位置行数,譬如「24」。
         
      •  Number :传回COM标准错误码,譬如「0x800A03FC」。
         
      •  Source :传回实际产生错误的原始码行。
         

    譬如:

    <%
    
    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 Server相容的资料库,譬如Microsoft SQL Server。Microsoft Access并未提供异动(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),如下:

    •  OnTransactionCommit事件 :若网页内所有程式(包括更新数个资料库)执行成功时,将触发此事件,呼叫OnTransactionCommit()副程式。
       
    •  OnTransactionAbort事件 :执行失败(包括更新任何一个资料库失败)时,将触发此事件,呼叫OnTransactionAbort()副程式。
       

    ObjectContext物件提供两个方法(methods),如下:

    •  ObjectContext.SetComplete方法 :程式认为执行成功时,使用此方法,以强制呼叫OnTransactionCommit()副程式。
       
    •  ObjectContext.SetAbort方法 :程式认为执行失败时,使用此方法,以强制呼叫OnTransactionAbort()副程式。
       

    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可设定为:

    •  Required :设定此ASP档案的网页具备异动(Transaction)处理的功能。
       
    •  Requires_New :设定此ASP档案的网页具备异动(Transaction)处理的功能。
       
    •  Supported :设定此ASP档案的网页具备异动(Transaction)处理的功能。
       
    •  Not_Supported :设定此ASP档案的网页不具备异动(Transaction)处理的功能。譬如,设定此ASP档案的网页具备异动(Transaction)处理的功能:
       
    <% @ TRANSACTION=Required %>

    您学会了吗 ?

    B-8 如何使用伺服器#指令呢?
     

    您可以使用伺服器端包含档的#指令(server-side include directives),以将一个档案的内容,包括於一个HTML或ASP网页当中,以及包括一个档案的资讯,譬如档案大小、档案修改时间等,或者设定错误讯息格式等。

    ASP所提供的#指令,如下:

    •  #config :设定传到使用者浏览器的错误讯息、日期、档案大小单位等格式。
       
    •  #echo :於一个HTML网页当中插入环境变数。
       
    •  #exec :执行一个应用程式或DOS命令(shell command),并将执行结果插入一个HTML网页当中。
       
    •  #flastmod :於一个HTML网页当中插入档案修改时间。
       
    •  #fsize :於一个HTML网页当中插入档案大小。
       
    •  #include :於一个HTML或ASP网页当中插入一个档案的内容。
       

    #指令只可使用於HTML码当中,不可以使用於ASP码当中。

    详细介绍如下:

    ■ #config指令
     

    #config指令,设定传到使用者浏览器的错误讯息、日期、档案大小单位等格式。

    #config可使用於HTML码当中,不可以使用於ASP码当中。

    语法,如下:

    <!-- #config Output = String -->
    •  String :设定值。
       
    •  Output :设定输出的格式,可设定如下:

       
      •  ERRMSG :设定传到使用者浏览器的错误讯息。
         
      •  TIMEFMT :设定日期格式,譬如:

         
        • 「%a」:设定星期为简写格式(譬如:Mon)。
           
        • 「%A」:不设定星期为简写格式(譬如:Monday)。
           
        • 「%b」:设定月为简写格式(譬如:Feb)。
           
        • 「%B」:不设定月为简写格式(譬如:February)。
           
        • 「%c」:设定以日期时间代表现在位置(譬如:12/25/99 12:45:58)。
           
        • 「%d」:设定日为数字格式(譬如:01-31)。
           
        • 「%H」:设定小时为24小时格式(譬如:00-23)。
           
        • 「%I」:设定小时为12小时格式(譬如:01-12)。
           
        • 「%j」:设定日为一年第几天的格式(譬如:001-366)。
           
        • 「%m」:设定月份为数字格式(譬如:01-12)。
           
        • 「%M」:设定分钟为数字格式(譬如:01-59)。
           
        • 「%p」:设定12小时制的AM/PM格式(譬如:AM)。
           
        • 「%S」:设定秒数为数字格式(譬如:00-59)。
           
        • 「%U」:设定星期为一年第几个星期的格式,星期日为一周的第一天(譬如:00-51)。
           
        • 「%w」:设定星期为一周的第几天之数字格式,星期日为一周的第一天(譬如:0-6)。
           
        • 「%W」:设定星期为一年第几个星期的格式,星期一为一周的第一天(譬如:00-51)。
           
        • 「%x」:设定以日期代表现在位置(current locale)(譬如:12/25/99)。
           
        • 「%X」:设定以时间代表现在位置(current locale)(譬如:12:25:59)。
           
        • 「%y」:设定年以两个数字代表(譬如:98)。
           
        • 「%Y」:设定年以四个数字代表(譬如:1998)。
           
        • 「%Z, %z」:设定时差名称或缩写。
           
        • 「%%」:表示百分比符号。
           
      •  SIZEFMT :表示设定档案大小的单位为kilobytes(设定为ABBREV)或bytes(设定为BYTES)。譬如设定错误讯息:
         
    <!-- #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 -->
    •  VariableName :设定插入的环境变数,可设定如下:

       
      •  ALL_HTTP :用户(client)所传送的所有HTTP headers,於header名称前面加上HTTP_以及header名称为大写。
         
      •  AUTH_TYPE :用户尝试存取伺服器有保护的程式之authentication(验证)方式。「Basic」表示Basic authentication验证方式,「NTLM」表示challenge/response验证方式,空字串表示未使用验证。
         
      •  AUTH_PASSWORD :使用Basic authentication验证方式时,用户於验证(authentication)对话方块中所输入的密码。
         
      •  AUTH_USER :用户验证(client's authentication)时,用户於验证(authentication)对话方块中所输入的使用者名称。
         
      •  CONTENT_LENGTH :预期从用户接收到的content(内容)长度(单位为bytes)。
         
      •  CONTENT_TYPE :content(内容)传送的型态,譬如:GET、POST、PUT。
         
      •  DOCUMENT_NAME :现在的档案名称。
         
      •  DOCUMENT_URI :现在档案的虚拟路径(virtual path)。
         
      •  DATE_GMT :格林威治(GMT)标准日期时间。
         
      •  DATE_LOCAL :当地的日期时间。
         
      •  GATEWAY_INTERFACE :CGI版本,譬如:CGI/1.1。
         
      •  HTTP_ACCEPT :HTTP header,以逗点分隔,譬如*/*; q=0.1, text/html, image/jpeg 。
         
      •  LAST_MODIFIED :文件最後修改日期。
         
      •  PATH_INFO :此网页档案的虚拟路径。譬如:/asp/aspreqst.asp。
         
      •  PATH_TRANSLATED :此网页档案的真正物理路径。譬如:D:\asp\aspreqst.asp 。
         
      •  PATH_TRANSLATED :此网页档案的虚拟路径。
         
      •  QUERY_STRING :HTTP request储存於?後的字串。
         
      •  QUERY_STRING_UNESCAPED :HTTP request储存於?後的字串,为Unescaped格式即未做URL encoded。
         
      •  REMOTE_ADDR :发出HTTP request的用户(譬如gateway、firewall)IP位址。譬如:168.95.1.10。
         
      •  REMOTE_HOST :发出HTTP request的用户(譬如gateway、firewall)名称。譬如:www.abc.com 。
         
      •  REMOTE_USER :发出HTTP request的使用者名称,空字串表示使用anonymous匿名方式。
         
      •  REQUEST_METHOD :request的方式,如GET、HEAD、POST等。譬如:GET、HEAD、POST。
         
      •  SCRIPT_NAME :此script档案的虚拟路径。譬如:/asp/aspreqst.asp。
         
      •  SERVER_NAME :伺服器名称。譬如:www.abc.com。
         
      •  SERVER_PORT :伺服器的连接port。譬如:80 。
         
      •  SERVER_PORT_SECURE :request是(1)否(0)使用安全的PORT。譬如:0 。
         
      •  SERVER_PROTOCOL :HTTP名称版本。譬如HTTP/1.0 。
         
      •  SERVER_SOFTWARE :伺服器的软体版本。譬如Microsoft-IIS/4.0 。
         
      •  URL :URL基底部份。
         

    譬如插入HTTP request储存於?後的字串:

    <!-- #echo var="QUERY_STRING"-->

    有意思吗 ?

    ■ #exec指令
     

    #exec指令,执行一个应用程式或DOS命令(shell command),并将执行结果插入一个HTML网页当中。

    #exec指令可使用於HTML码当中,不可以使用於ASP码当中。

    语法,如下:

    <!-- #exec CommandType = CommandDescription -->
    •  CommandType :设定命令(command)的型态,可设定如下:

       
      •  CGI :设定命令的型态为CGI script、ASP、或ISAPI的应用程式。CommandDescription参数为一个包括此应用程式的虚拟路径(virtual path),以及接在?後传给应用程式的输入参数值,输入参数间以+分隔之。
         
      •  CMD :设定命令的型态为DOS命令(shell command)的应用程式。CommandDescription参数为一个包括此应用程式的物理路径(physical path),以及接在空格後传给应用程式的输入参数值,输入参数间以空格分隔之。
         

    为了避免执行#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 -->
    •  FileName :档案名称,以前後加「"」。
       
    •  PathType :设定档案路径的型态,可设定如下:

       
      •  File :设定档案名称是一个相对路径(relative path)。
         
      •  Virtual :设定档案名称是一个虚拟路径(virtual path)。
         

    时间格式可於#config指令的timefmt中设定。

    譬如插入default.htm档案的修改时间:

    <!-- #flastmod file = "default.htm" -->

    有意思吗 ?

    ■ #fsize指令
     

    #fsize指令,於一个HTML网页当中插入档案大小。

    此指令可使用於HTML码当中,不可以使用於ASP码当中。

    语法,如下:

    <!-- #fsize PathType = FileName -->
    •  FileName :档案名称,以前後加「"」。
       
    •  PathType :设定档案路径的型态,可设定如下:
       
    •  File :设定档案名称是一个相对路径(relative path)。

       
      •  Virtual :设定档案名称是一个虚拟路径(virtual path)。
         

    档案大小的单纯格式可於#config指令的sizefmt中设定。

    譬如插入default.htm档案的档案大小:

    <!-- #fsize file = "default.htm" -->

    动作是否正常呢 ?

    ■ #include指令
     

    #include指令,於一个HTML或ASP网页当中插入一个档案的内容。

    插入的档案可为HTML或ASP格式的码。

    此指令可使用於HTML码当中,不可以使用於ASP码当中。

    语法,如下:

    <!-- #include PathType = FileName -->
    •  FileName :档案名称,以前後加「"」。
       
    •  PathType :设定档案路径的型态,可设定如下:
       
    •  File :设定档案名称是一个相对路径(relative path)。
       
    •  Virtual :设定档案名称是一个虚拟路径(virtual path)。
       

    譬如插入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所提供的@指令,如下:

    •  @ CODEPAGE :设定ASP档案的character set(字元组)语文。
       
    •  @ ENABLESESSIONSTATE :启动或关闭一个网页的session tracking功能。
       
    •  @ LANGUAGE :设定ASP档案使用的script语言。
       
    •  @ LCID :设定设定地区识别代码(locale identifier LCID)。
       
    •  @ TRANSACTION :设定是否具备异动(Transaction)处理的功能。
       

    @指令只可使用於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属性属性来改变地区识别代码。