附录A 快速学会ASP
本章介绍快速学会Active Server Pages的方法,包括Active Server Pages简介、Active Server Pages语法、ASP Scripting语法、控制程式的流程、表单(form)的处理、Cookies存取用户端档案、以及Script程式侦错等。
静态的网站内容
目前Internet上许多的网站,仍然提供「静态」(static)的网页内容。
所谓「静态」,指的就是网站的网页内容是「固定不变」地。
当浏览器透过Internet的HTTP(Hypertext Transport Protocol)协定,向网站伺服器(web server)要求提供网页的内容时,网站伺服器收到要求後,会传送原已设计好静态的HTML的档案资料给浏览器。
一个「静态」的网站,若要更新网页的内容,必须手动地来更新其HTML的档案资料。
一个「静态」(static)的网站,有以下的缺点:
那麽,如何制作「动态的网站」呢 ?
动态的网站内容
一个「动态」的网站,网站的网页内容是「动态」地。所谓「动态」的网站,指的是:
要将原本「静态」的网站,变成一个「动态」的网站,最快的方法为使用Active Server Pages。
ASP(Active Server Pages)
Active Server Pages(动态伺服器网页,简称ASP),内含於IIS 3.0、4.0、或5.0(或以後版本)当中,提供一个伺服器端(server-side)执行的scripting环境,您可以结合HTML网页、ASP指令和ActiveX元件,以产生和执行动态、互动、高效率的网站伺服器(web server)的应用程式。
ASP(Active Server Pages)是在IIS或PWS网站伺服器执行的script语言,使用VBScript或JScript来撰写程式。JScript为Microsoft版本的JavaScript。如果您会写Visual Basic或dBASE的程式,采用VBScript就对了;如果您习惯C语言,就使用JScript来撰写ASP程式。
ASP(Active Server Pages)的特点如下:
任何一种语言都有不够用的地方,ASP透过「ActiveX伺服器元件」(ActiveX Server components)可以扩充功能。ASP程式的特点为不须compile编译,使用如 记事本 等文书编辑程式即可编辑设计。
有人会说不须compile编译,但执行的效率如何呢 ? ASP程式第一次执行时,会由ASP.dll程式自动做compile编译,因此第二次执行时,执行就会快一些。
还在使用CGI吗?
依照笔者的测试,ASP程式执行的效率比CGI快好几倍。如果您还在使用CGI开发Web应用程式,赶快转到ASP程式吧!ASP程式不仅执行较CGI快,开发速度与维护方便都比CGI好上许多!於Windows的平台上,ASP程式取代CGI是必然的趋势。
Netscape可以看到ASP程式执行的结果吗?
笔者最常被问到的问题为:「Netscape浏览器不能执行VBScript,使用VBScript来撰写的ASP程式执行的结果在Netscape浏览器可以看到吗 ? 」
当然可以!为什麽呢 ? ASP程式是於IIS或PWS网站伺服器执行<% ...%>内的VBScript程式後,产生标准的HTML码,再送到用户端的Netscape浏览器,因此ASP程式执行後可以在任何一种浏览器上显示。如果ASP程式执行後可以在一种浏览器上显示,但是却不能在另外一种浏览器上显示时,您知道问题在哪里吗 ? 问题在您的ASP程式执行後所产生的标准的HTML码不够标准,所以不能在另外一种浏览器上显示。问题是在程式本身而非ASP,ASP是与浏览器的种类版本无关的。
ASP新定义
ASP有一个新的定义,就是ASP为使用者介面(HTML)与应用逻辑元件(business logic component)连结之处。
这是甚麽意思呢 ? 意思就是并不是把所有的程式都放置於ASP程式当中,应用逻辑(business logic)部份撰写成元件(component,即ActiveX伺服器元件),ASP则扮演成HTML和元件之间的程式控制部份。
学会ASP的捷径
对於一个不懂ASP如何撰写的新手而言,学会ASP的捷径,如下:
对於一个对ASP有点懂又不太懂的未出师者而言,有待学会的ASP,如下:
ASP物件(Object)
ASP包括了7个基本的物件(Object),负责与Web有关的部份。只要学会这7个基本的物件,ASP就学会了。这7个基本的物件(Object),如下:
所有与Web有关的部份,都是呼叫这7个基本的物件(Object)。
ASP元件
Active Server Pages内含数个内建的「ActiveX伺服器元件」,如下:
A-1 ASP语法如何呢?
.asp档案
Active Server Pages(ASP)制作成.asp附档名的档案,一个.asp档案是一个文字档,包括:
ASP语法
HTML标记(tags)使用「<...>」来将HTML码包含起来,以与一般的文字区分开来,HTML码系在使用者的浏览器当中执行;而ASP使用「<%...%>」来将ASP的script程式码包含起来,ASP码系在伺服器当中执行,执行後产生浏览器看得懂的HTML码,再传送给使用者。
ASP的副档名就是.asp,一个ASP程式包括如下:
<% VBScript JScript ASP物件ASP元件% >HTML码
ASP程式包括使用「<% ...伺服端script程式 %>」包起来在伺服端执行的script程式,以及<% ...%>外面的HTML码。<% ...%>内的script程式在IIS网站伺服器执行後,输出标准的HTML码,并与<% ...%>外面的HTML码结合,一起送到用户端的浏览器。
譬如若要显示现在的日期时间(IIS伺服器电脑的日期时间),只要一行的ASP码,如下:
现在是: <% =now %>
於用户端使用浏览器,浏览执行basic1.asp的结果请见下图,显示IIS伺服器现在的日期时间:
ASP原始程式码,并不会传到用户端的浏览器;不像HTML码,於用户端的浏览器可以看到HTML的原始程式码。譬如重覆回路的ASP码,如下:
<% for i = 1 to 5 %>
<FONT SIZE= <% = i %> COLOR=#0000FF>
IIS 5.0超级网站速成班</FONT><BR>
<% next %>
其中now是VBScript的时间函数。
有趣吗 ? 让我们赶快来看看另外一个ASP例子。
这个ASP例子,於用户端使用浏览器,浏览执行basic1.asp的结果如下,显示五个重覆的句子,且字体愈来愈大:
上例使用的是VBScript语言的回圈指令for...next,循环5次。
Active Server Pages的原始程式码,不会传到使用者的浏览器,可以保护您写出来的原始程式码不会外漏。因此於用户端的浏览器可以看到的原始程式码为ASP程式码执行後的HTML码,如下:
<FONT SIZE=1 COLOR=#0000FF>IIS 5.0超级网站速成班</FONT><BR> <FONT SIZE=2 COLOR=#0000FF>IIS 5.0超级网站速成班</FONT><BR> ... <FONT SIZE=5 COLOR=#0000FF>IIS 5.0超级网站速成班</FONT><BR>
却看不到原来的ASP原始程式码。
传送字串或HTML码到用户端的浏览器
Response.Write方法,是最常用到传送字串或HTML码到浏览器的方法。语法如下:
Response.Write字串
以下的例子向使用者打招呼:
<% Response.Write "欢迎光临" %>
於用户端使用浏览器,浏览执行的结果如下:
传送字串到用户端的浏览器,不一定需要使用Response.Write,位於<%...%>外的部份将直接传送字串或HTML码到用户端的浏览器,譬如以下的结果与上例相同:
<% .... %> 欢迎光临 <% ... %>
使用<% =...%> 也将直接传送字串或HTML码到用户端的浏览器,譬如以下的结果也与上例相同:
<% ="欢迎光临" %>
连结到指定的URL位址
使用Response.Redirect方法,可以连结到指定的URL位址。语法,如下:
Response.Redirect URL
譬如,自动连结到首页:
<% Response.Redirect "homepage.asp" %>
须注意的一点是,如是此.asp网页的内容已经传送给使用者,再使用Response.Redirect,将发生错误!
#INCLUDE包括其他档案
您可於ASP程式码插入另外一个「被包括」的档案,执行到此处时将先执行此「被包括」的档案後,再继续执行下一行的程式码。使用的是「#INCLUDE」的语法,语法如下:
<!--#INCLUDE VIRTUAL|FILE="filename"-->
其中VIRTUAL代表虚拟的档案位址,FILE代表绝对的档案位址,如下:
<!--#INCLUDE VIRTUAL="/booksamp/test.inc"--> <!--#INCLUDE FILE="test/test.inc"-->
附加档案名称建议使用.inc,但是也可以使用任何附加档案名称。
您可使用FILE和「../ 」代表上一层的档案目录。
「#INCLUDE」的语法,适用使用於多个网页共同使用的部份,有点像副程式,供多个ASP程式码呼叫使用。
让我们看一个#INCLUDE的例子,於用户端使用浏览器,浏览basic1.asp执行的结果如下,显示所「被包括」的档案copyrgt.asp:
网站伺服器basic1.asp档案的ASP程式码如下:
<!--#INCLUDE FILE="copyrgt.asp"-->
copyrgt.asp档案的ASP程式码如下,只有几行:
<B> <FONT SIZE=1 COLOR=BLUE FACE="Verdana, Arial, Helvetica"> © 2000 Actif Systems corP. All rights reserved. </FONT> </B>
「被包括」的HTML档案,可以包括任何HTML标记,譬如图片与超连结。
「被包括」的#INCLUDE档案,也可再包括其他「被包括」的#INCLUDE档案。
您不能使用ASP程式码来设定「被包括」的#INCLUDE档案。如下的#INCLUDE档案将无法正确地执行:
<% name=(test & ".inc")%> <!--#include file="<%= name %>"-->
#INCLUDE不能置於<%...%>当中。如下的#INCLUDE档案将无法正确地执行:
<% For i = 1 To n ... <!--#include file="test.inc" --> Next %>
将#INCLUDE置於<%...%>外面即可。如下的#INCLUDE档案将可正确地执行:
<% For i = 1 to n ... %> <!--#include file="test.inc" --> <% Next %>
好玩吗 ?
A-2 ASP Scripting语法如何呢?
使用VBScript、或JScript的ASP语法
ASP并不是一个scripting语言,而是提供一个可以整合script语言(VBScript、或Jscript)到HTML网页的环境。
ASP与任何ActiveX scripting语言相容。除了可使用VBScript、或JScript语言来设计,并可经由plug-in的方式,使用由third party所提供的其他譬如REXX、Perl、Tcl等scripting的语言。scripting引擎是处理script的COM(Component Object Model)物件。
什麽是VBScript呢?
VBScript是一种与Visual Basic相类似的程式语言,VBScript是撰写於HTML当中,主要可以串联和控制ActiveX Controls,让您撰写设计生动活泼、互动的「WWW网页内容(Web pages)」、和发展「Web-based」的应用程式。
VBScript可以在用户端(clInternet Explorernt-side)以及伺服器端(server-side)上执行。
目前能够於用户端执行VBScript的浏览器,以Internet Explorer 3.X(或以後版本)的浏览器为主,其他的浏览器如Netscape。使用「ActiveX plug-in for Netscape」的程式,也可以执行VBScript应用程式。
VBScript语言可以用来设计Active Server Pages。Active Server Pages(ASP)提供一个伺服器端(server-side)的scripting环境,可让您产生和执行动态、互动、高效率的网站伺服器(web server)的应用程式。
Active Server Pages(ASP)的VBScript是在伺服器执行,您不需要担心是否浏览器无法执行您设计出来的Active Server Pages,您的网站伺服器会自动将Active Server Pages的程式码,解译为标准HTML(Hypertext Markup Language)格式的网页内容(web pages),再送到用户端的浏览器上显示出来。用户端只要使用一般可执行HTML码的浏览器,即可浏览Active Server Pages所设计的网页内容,而不需能执行VBScript语言的浏览器。
什麽是JScript呢?
Jscript就是Microsoft版的JavaScript,Jscript具备JavaScript所有的功能,并加上一些Internet Explorer浏览器适用的特殊功能,可让您撰写设计生动活泼、互动的「WWW网页内容(Web pages)」、和发展「Web-based」的应用程式。
JScript是一个直译式(interpreted)、以物件为基础的叙述式程式语言(object-based scripting language)。虽然JScript比物件导向(object-orInternet Explorernted)譬如C++、Java等的程式语言的功能少,但JScript具备足够完整的功能。JScript并非为任何程式语言的简易版,与Java也无直接的关系。
JScript可以在用户端(clInternet Explorernt-side)以及伺服器端(server-side)上执行。
Jscript的程式不能单独执行,而必须在浏览器或网站伺服器上执行。目前能够执行JavaScript的浏览器,以「Internet Explorer 3.X」、「Netscape 3.X」(或以後版本)的浏览器为主。
Jscript可以串联和控制ActiveX Controls,於用户端的浏览器执行;也可串联IIS的Active Server Pages,於伺服端的网站伺服器上执行。
您可使用Jscript语言来设计Active Server Pages。Active Server Pages(ASP)的Jscript是在伺服器上执行,用户端不需使用能执行Jscript语言的浏览器。
一个JScript程式码叙述(code statement)包括一行的程式,结尾加分号 「;」表示结束。
控制程式执行的流程
您可以使用VBScript、或JScript语言来控制程式执行的流程,譬如采用「If... Then... Else... End If」叙述来判断现在是早上或下午,若是早上则显示「早安!」,超过中午12点则显示「您好!」。
这个ASP例子basic1.asp,上午显示「早安!」,下午显示「您好!」,在用户端使用浏览器,浏览执行的结果如下:
网站伺服器basic1.asp档案的ASP程式码如下,Time为现在的时间,「If... Then... Else... End If」叙述判断现在的时间是上午或下午:
<% If Time >=#12:00:00 AM# And Time < #12:00:00 PM# Then greeting = "早安!" Else greeting = "您好!" End If %> <%= greeting %>
Active Server Pages的原始程式码,不会传到使用者的浏览器,当然於用户端使用浏览器,观看到的是一般标准的HTML码,如下:
早安!
另外一种ASP写法
以上的ASP程式码basic1.asp,也可以将显示的文字放在<%...%>外面,如下:
<% If Time >= #12:00:00 AM# And Time < #12:00:00 PM# Then %> 早安! <% Else %> 您好! <% End If %>
在用户端使用浏览器执行,上午显示「早安!」,下午显示「您好!」,结果与上图相同。
设定某一网页使用的script语言
若要设定某一网页使用的script语言,可以在此网页的第一行使用「<%@ LANGUAGE = ... %>」加予设定,语法如下:
<%@ LANGUAGE = ScriptingLanguage %>
ScriptingLanguage为VBScript、或Jscript。@和LANGUAGE之间须加一个空白。
<SCRIPT>标记
ASP预设的script语言是VBScript,若要设定某一段ASP程式码使用的script语言,可以使用「<SCRIPT RUNAT=SERVER LANGUAGE=...>...</SCRIPT>」加予设定,譬如ASP程式码使用JScript语言:
<HTML>
<BODY>
<% Call函数1 %>
</BODY>
</HTML>
<SCRIPT RUNAT=SERVER LANGUAGE=JSCRIPT> function 函数1()
{
Response.Write("叫到我函数1了")
}
</SCRIPT>
一个网页使用多种script语言
您可於一个网页当中同时使用VBScript、和JScript语言。方法如下:
譬如:
於用户端使用浏览器,浏览basic1.asp执行的结果如下:
填入资料并按下 写完了 按钮後,结果如下:
网站伺服器basic1.asp档案的ASP程式码如下,并填入资料按下 写完了 按钮後,将执行Answer()的VBScript程式来将填入资料显示出来,并执行ShowDate()的JScript程式将日期显示出来:
<FORM METHOD=get ACTION="basic1.asp"> 姓名:
<INPUT TYPE=TEXT NAME="input1" VALUE="大名">
<BR>喜好:
<INPUT TYPE="RADIO" NAME="input2" VALUE="打球" CHECKED>打球
<INPUT TYPE="RADIO" NAME="input2" VALUE="看书">看书
<INPUT TYPE="RADIO" NAME="input2" VALUE="照镜子">照镜子
<INPUT TYPE="RADIO" NAME="input2" VALUE="皆非">皆非
<BR>特徵:
<SELECT NAME = "input3">
<OPTION>戴眼镜
<OPTION>小肚微凸
<OPTION>漂亮
</SELECT>
<P><INPUT TYPE="SUBMIT" VALUE="写完了">
<INPUT TYPE="RESET" VALUE="重写">
</FORM>
<p>
<TABLE BORDER=1>
<% Call Answer %>
</TABLE>
<% Call ShowDate %>
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
Sub Answer
Response.Write "<TR><TD>名称</TD><TD>输入值</TD></TR>"
Set Params = Request.QueryString
For Each p in Params
Response.Write "<TR><TD>" & p & "</TD><TD>" &
Params(p)& "</TD></TR>"
Next
End Sub
</SCRIPT>
<SCRIPT LANGUAGE=JScript RUNAT=Server>
function ShowDate()
{
var x
x = new Date()
Response.Write(x.toString())
}
</SCRIPT>
产生clInternet Explorernt端script程式码
您可以使用ASP程式码,於网站伺服器(server端)执行script语言(VBScript、或Jscript),来产生或修改於clInternet Explorernt端(用户端的浏览器)执行的script语言(VBScript、或Jscript)。方法如下:
<SCRIPT LANGUAGE="VBScript"> <!-- clInternet Explorernt script <% server script %> clInternet Explorernt script ... --> </SCRIPT>
譬如:
<SCRIPT LANGUAGE="VBScript">
Sub test<%=book("bookID")%>_MouseEnter()
test.Caption = "<%= book("bookName")%>"
End Sub
</SCRIPT>
注 解
注解的部份不会被执行,VBScript的注解方式,於注解前面加上「REM」或「'」,如下:
<% REM注解 ' 注解 %>
值得注意的是,您不能在输出处加上注解,如以下的注解将被显示出来:
<% =name '注解 %>
JScript的注解方式,JScript单行注解的前面加「//」,多行注解前後加「/*...*/」,语法如下:
// 单行注解 /* 多行注解 .... */
如下:
<SCRIPT LANGUAGE=JScript RUNAT=Server> // 注解 </SCRIPT>
以下将介绍VBScript和Jscript的语法。
■ 变 数
一个变数(variant)为一个可变的数,能为数字、字串、布林逻辑、或日期时间等数种资料的类型。
假如你想要从一个类型转换到另外的类型,可以使用内建的转换函数。字串与数字,当成相同的类型,会自动转换,当一个变数像一个字串(或数字)时,就被当作字串(或数字)变数。
对变数名称、函数名称、语法而言,JScript(或JavaScript)将大小写视为不同;而VBScript则将大小写视为相同。
定义变数
VBScript(JScript)使用「Dim」(var)叙述来定义新的变数。譬如:
Dim A (VBScript) var A; (JScript)
您可使用「逗点」分开多个变数的名称,来定义多个新的变数。譬如:
Dim A, B, C (VBScript) var A, B, C; (JScript)
使用新的变数之前先定义,可避免误用。但是您也可以不使用「Dim」(var)叙述来定义变数,直接使用新的变数於程式码当中。
若您将「Option Explicit」的叙述加到VBScript程式码的第一行,如下:
<%@ LANGUAGE = VBScript %> <% Option Explicit %>
则所有新的变数均须先使用「Dim」叙述加予定义,才可以使用。
变数名称的限制
VBScript变数的名称,限制为第一个字必须是字母、不能包含一个句点「.」、和不可以超过255个字母。
变数名称不可以使用中文。
JScript变数的名称,限制第一个字必须是字母或「_」,且大小写视为不同(case-sensitive)。
当你在一个副程式或函数定义变数时,此变数只在那个副程式或函数之内有效,而在那个副程式或函数之外就认不得了;若在副程式或函数之外定义变数时,此变数在所有程式码都有效。
当使用变数於VBScript时,一个副程式或函数当中不能使用超过127个的变数,阵列变数算一个。
使用「变数=值」的表达式,可以指定变数的值,譬如A=100、A=" 动态网站速成班"。
数字资料类型
数字资料类型的变数包括整数和浮点数字。
整数可为8进位(开头为「O」)、16进位(开头为「0x」或「0X」)、10进位。
浮点数字可以科学符号「E」(或e)表示,譬如:-3.1E12、1e12。
数字变数可以加予运算,网站伺服器basic1.asp档案的ASP程式码如下,将数字变数作四则运算:
<% Dim a a = 100 %> <% = a %> + <% = a*2 %> = <% = a + a*2 %>
在用户端使用如Internet Explorer的浏览器,浏览伺服器执行basic1.asp的结果如下,显示运算後的结果:
字串资料类型
字串的值前後须加单引号「’」或双引号「"」。
字串变数可以加予运算,网站伺服器basic1.asp档案的ASP程式码如下,将两个字串变数的值相连接:
<% b = "动态网站设计" %> <% = b + "速成" %>
在用户端使用如Internet Explorer的浏览器,浏览伺服器执行basic1.asp的结果如下,显示两个字串相连接的结果:
布林逻辑资料类型
布林逻辑的值不是true就是false。
网站伺服器basic1.asp档案的ASP程式码,如下:
<% c = True %> 变数c为 <% if c = true then %> 真 <% else %> 假 <% end if %>
在用户端使用如Internet Explorer的浏览器,来浏览伺服器执行basic1.asp的结果如下:
日期时间资料类型
日期时间类型的值前後须加符号「#」。
网站伺服器basic1.asp档案的ASP程式码,如下:
<% Dim d d = #07/27/99 12:59:59pm# Dim e e = Now %> 日期时间变数d为 <% =d %><br> 系统时间为 <% =e %>
在用户端使用如Internet Explorer的浏览器,浏览伺服器执行basic1.asp的结果如下:
■ 阵列变数
您可以指定多个值到一个变数,这种变数叫做阵列变数(array variable)。定义阵列变数的方式与定义变数的方式相同,差别是多加一个小括弧「( )」(VBScript)或中括弧「[ ]」(JScript),括弧内的数值为指标(index),由0算起,譬如「Dim A(10)」定义「A(0)~A(9)」计10个变数。
A(0)为一个一维阵列,多维阵列变数可达60维。定义多维阵列变数系加括弧和逗点「(...,...,...,...)」(VBScript)或多个中括弧「[ ] [ ] [ ]...」(JScript),譬如定义一个二维阵列变数:
Dim Array1(5, 10) (VBScript) var Array1[5][10]; (JScript)
让我们看一个固定长度阵列的例子,网站伺服器basic1.asp档案的ASP程式码如下,其中由UBound()函数得知有几个阵列的成员:
<%
Dim book(3)
book(0)= "NT动态网站速成班"
book(1)= "NT网站资料库速成班 设计实例篇"
book(2)= "NT网站资料库速成班 解决方案篇"
For i = 0 To UBound(book)-1
Response.Write(book(i)& "<br>")
Next
%>
在用户端使用如Internet Explorer的浏览器,浏览伺服器执行basic1.asp的结果如下:
使用「Dim」叙述来定义阵列变数後,您可随时使用「ReDim」叙述来重新定义阵列变数,而改变阵列的大小,譬如:
Dim Array1(10) ReDim Array1(20)
当你使用ReDim重新定义阵列变数时,可以用「Preserve」关键字以保存这阵列的内容,如下:
Array1(10) ReDim Preserve Array1(20)
让我们看一个重新定义阵列变数的例子,网站伺服器basic1.asp档案的ASP程式码如下,其中由UBound()函数得知有几个阵列的成员,将字型颜色设定为阵列变数:
<%
Dim col()
Redim col(14)
col(0)= "RED"
col(1)= "GREEN"
col(2)= "BLUE"
col(3)= "AQUA"
col(4)= "YELLOW"
col(5)= "FUCHSIA"
col(6)= "GRAY"
col(7)= "LIME"
col(8)= "MAROON"
col(9)= "NAVY"
col(10)= "OLIVE"
col(11)= "PURPLE"
col(12)= "SILVER"
col(13)= "TEAL"
For i = 0 To UBound(col)- 1
Response.Write("<FONT COLOR=" &
col(i)&">" & col(i)&" </FONT>")
Next
%>
在用户端使用如Internet Explorer的浏览器,浏览伺服器执行basic1.asp的结果如下,显示14种颜色的字:
■ 函数与副程式
VBScript的程序(procedure)包括Sub(副程式)和Function(函数),JScript则提供Function(函数)。函数与副程式的差别,为函数可传回运算的结果,而副程式不会。
VBScript副程式
一个Sub(副程式)程序是一群的指令叙述,VBScript以「Sub副程式名称(输入参数)」为开始,以「End Sub」作为结束,执行某些指令,但是不返回一个结果值。
「副程式名称(输入参数)」可由括弧中输入参数(常数、变数、或表达式),括弧内的多个参数之间由一个逗点所分开,若Sub(副程式)没有输入参数,则它的Sub叙述可以包含一个空的括弧。
以下basic1.asp的Sub(副程式)例子计算1加到5的总和,然後於副程式当中显示出来,如下:
<% Sub sum2(n) Dim i, j j = 0 For i = 1 to n j = j + i Next Response.Write("1加到5的总和为: " & j & "<BR>") End Sub sum2(5) %>
在用户端使用如Internet Explorer的浏览器,浏览伺服器执行basic1.asp的结果如下:
呼叫副程式时,只要键入副程式的名称和其必须的输入参数即可,或於之前加「Call」叙述。没有输入参数的空括弧可以省略。
VBScript函数
一个Function(函数)程序是一群的指令叙述,VBScript以「Function函数名称(输入参数)」为开始,以「End Function」作为结束,执行某些指令,与副程式不同之处,为能返回执行的结果。
「函数名称(输入参数)」可由括弧中输入参数(常数、变数、或表达式),括弧内的多个参数之间由一个逗点所分开,若Function(函数)没有输入参数,则它的Function叙述必须包含一个空的括弧。
以下的函数例子计算1加到5的总和,然後显示出来,网站伺服器basic1.asp档案的ASP程式码如下:
<% Function sum1(n) Dim i, j j = 0 For i = 1 to n j = j + i Next sum1 = j End Function Response.Write("1加到5的总和为: " & sum1(5)& "<BR>") %>
在用户端使用如Internet Explorer的浏览器,浏览伺服器执行basic1.asp的结果如下:
JScript函数
JScript的函数,以「function函数名称(输入参数){」为开始,以 } 作为结束,能返回执行的结果。前後加大括弧「{...}」包起来的部份,定义一个函数。大括弧「{...}」外面的程式码部份,不属於此函数。
以下的JScript函数例子显示今天的日期,其中toString()函数将日期转换成字串,网站伺服器basic1.asp档案的ASP程式码如下:
<Script Language=JScript Runat=Server> function today(){
var d1;
d1 = new Date();
Response.Write(d1.toString());
}
</Script>
<% today()%>
在用户端使用如Internet Explorer的浏览器,浏览伺服器执行basic1.asp的结果如下:
您觉得有趣吗 ?
A-3 如何控制程式的流程呢?
使用VBScript(或JScript)的条件叙述和回圈叙述,你能控制程式的执行流程。
条件叙述可以判断一个状况是否是真实的(True)、错误的(False),或者不同的状况,然後根据判断的结果,执行一个或者更多的叙述。
重复的动作可使用回圈(loop),回圈叙述允许你再叁重复地执行一群的叙述。有些回圈重复执行叙述直到有一个状况是真实的(True)。有些回圈重复执行叙述直到状况是错误的(False)。有的回圈只重复地执行特定的次数。
VBScript可使用以下的条件叙述:
VBScript可使用以下的回圈叙述:
■ 使用If ... Then ... Else
「If ... Then ... Else」叙述,用於判断一个状况是否是真实的(True)或者错误的(False),然後根据判断的结果,执行一个或者更多的叙述。通常,这判断的状况是一个比较的运算式,比较一个值是否与另一个值相同。
假如判断的结果是真实的(True),而且判断後执行的叙述只有一个时,你能使用一行的语法「If ... Then ...」叙述,省略关键字「Else」和「End If」。如下:
<% if a = 1 then c = 100 %>
假如你想要执行的程式码超过一行,此时你须使用多行的语法,於结束时加入「End If」叙述。
假如判断的结果中有一个状况是真实的(True),而其他是错误的(False)时,你能使用「If...Then...Else」叙述,来定义二群的叙述,状况是True时执行一群,状况是False时则执行另一群叙述。
网站伺服器basic1.asp档案的ASP程式码如下:
<% if (Left(Time,2)="AM") or (Left(Time,2)="上午") Then %> 早安 ! 现在时间是 <% = Time %> <% else %> 您好 ! 现在时间是 <% = Time %> <% end if %>
在用户端使用如Internet Explorer的浏览器,浏览伺服器执行basic1.asp的结果如下,上午显示早安,下午显示您好:
动作是否正常呢 ?
■ 使用Select Case
「Select Case ... Case...」的叙述根据不同的状况执行不同的叙述。
网站伺服器basic1.asp档案的ASP程式码如下:
<% dim str1 Select Case Day(Date) Case 1,2,3,4,5,6,7,8,9,10 str1 = "今天日期是 " & Date & " 本月上旬" Case 11,12,13,14,15,16,17,18,19,20 str1 = "今天日期是 " & Date & " 本月中旬" Case Else str1 = "今天日期是 " & Date & " 本月下旬" End Select Response.Write(str1) %>
在用户端使用如Internet Explorer的浏览器,浏览伺服器执行basic1.asp的结果如下,显示今天日期是上旬、中旬、或下旬:
您觉得有趣吗 ?
■ 使用Do...Loop回圈
当或直到有一个状况是真实的(True)时,你能使用「Do...Loop」叙述执行一群的叙述,次数是不确定的。
当有一个状况是真实的(True)时
当有一个状况是真实的(True)时,使用「While」关键字检查「Do...Loop」叙述的状况。
使用Do While... Loop的语法,你能在进入回圈之前先检查状况作判断;或者使用「Do... Loop While...」的语法,在回圈执行过一次後才检查状况作判断(请看以下的例子)。
网站伺服器basic1.asp档案的ASP程式码如下:
<% i = 1 do %> <FONT SIZE=+<% = i %>> <li>快速掌握Internet技术 !<BR> </FONT> <% i = i+1 %> <% loop while(i <= 3)%>
在用户端使用如Internet Explorer的浏览器,浏览伺服器执行basic1.asp的结果如下,回圈次数为3次:
因执行过一次後才检查发现是否符合,回圈之内的程式至少执行一次了。
直到有一个状况是真实的(True)时
直到有一个状况是真实的(True)时,你能使用「Until」关键字於一个「Do...Loop」叙述检查状况,直到状况是真实的(True)时,这回圈才会停止。有二个方法,第一个是使用「Do Until... Loop」的语法,你能在进入回圈之前先检查状况;或者使用「Do... Loop Until...」的语法,在回圈执行过一次後才检查状况(请看以下的例子)。
网站伺服器basic1.asp档案的ASP程式码如下:
<% i = 1 do %> <FONT SIZE=+<% = i %>> <li>快速掌握Internet技术 !<BR> </FONT> <% i = i+1 %> <% loop until(i > 3)%>
在用户端使用如Internet Explorer的浏览器,浏览伺服器执行basic1.asp的结果如下,显示3次回圈的结果:
离开Do... Loop回圈
你能使用「Exit Do」叙述离开一个Do ... Loop的回圈。有时为了避免无止尽的回圈,你能於「If...Then...Else」的叙述,当状况是真实的(True)时使用Exit Do叙述来离开回圈;而当状况是错误的(False)时,回圈仍像平常一样地执行。
■ 使用While ... Wend
若您熟悉「While ... Wend」的用法,VBScript也提供此语法,但因为此语法比较缺乏弹性,推荐你使用「Do ... Loop」回圈代替。
网站伺服器basic1.asp档案的ASP程式码如下:
<% i = 1 while(i <= 3) %> <FONT SIZE=+<% = i %>> <li>快速掌握Internet技术 !<BR> </FONT> <% i = i+1 %> <% wend %>
在用户端使用如Internet Explorer的浏览器,浏览伺服器执行basic1.asp的结果如下,显示3次回圈的结果:
好玩吗 ?
■ 使用For ... Next
你能使用「For...Next」叙述执行一群的叙述,而回圈只重复一个特定的次数。
使用计数器变数(counter variable),於每次回圈当中,增加或者减少计数器的数值。譬如以下的程式,执行程式3次。「For」叙述指定这计数器变数的开始和结束值。「Next」叙述将此计数器变数的数值增加1。
网站伺服器basic1.asp档案的ASP程式码如下:
<% Dim i %> <% for i = 1 to 3 %> <FONT SIZE=+<% = i %>> <li>快速掌握Internet技术 !<BR> </FONT> <% next %>
在用户端使用如Internet Explorer的浏览器,浏览伺服器执行basic1.asp的结果如下,显示3次回圈的结果:
使用Step关键字
使用「Step」关键字,你能指定每次经过回圈时,计数器增减的数值。
在以下的例子,计数器变数的数值k,经过回圈时,每次增加2。
网站伺服器basic1.asp档案的ASP程式码如下:
<% Dim k %> <% for k = 2 to 6 step 2 %> <% =k %>: 快速掌握Internet技术 !<BR> <% next %>
在用户端使用如Internet Explorer的浏览器,浏览伺服器执行basic1.asp的结果如下,显示3次回圈的结果:
若要减少计数器变数的数值,你可使用一个负数Step值。如此,你必须指定结束值小於开始值。在以下的例子,计数器变数的数值j,经过回圈时,每次减少2。网站伺服器basic1.asp档案的ASP程式码如下:
<% Dim j %> <% for j = 6 to 2 step -2 %> <% =j %>: 快速掌握Internet技术 !<BR> <% next %>
在用户端使用如Internet Explorer的浏览器,浏览伺服器执行basic1.asp的结果如下,显示3次回圈的结果:
离开For...Next回圈
经由「Exit For」叙述的使用,你能在这计数器达到它的结束之前,离开任何For...Next叙述。你能於If...Then...Else的叙述,当状况是真实的(True)时使用Exit For叙述来离开回圈;而当状况是错误的(False)时,回圈仍像平常一样地执行。
您觉得有趣吗 ?
A-4 如何发展asp网站应用程式呢?
在多个网页间共享资讯
使用ASP发展的应用程式,可以在多个网页之间保留和使用一些共同的资讯,ASP提供两种适用范围,如下:
您可以使用内建於Active Server Pages的Session、和Application物件,发展ASP的多个网页应用程式。
Session物件,管理仅适用於一个使用者使用一个应用程式的资讯。一个Session仅属於一个使用者。
Application物件,储存一个应用程式共同的资讯,使用此应用程式的所有使用者都可以共同分享。
ASP发展的应用程式,可以只有一个首页,或多个网页档案,所有的档案位於一个虚拟路径(virtual path)和其子目录下。
Global.asa档案
学习ASP,第一个要搞清楚的就是与网页特性有关的Global.asa档案。对於一个「应用程式」(Application)而言,ASP第一个会执行的就是位於此「应用程式」下的Global.asa档案,如果找不到此Global.asa档案,便会忽略不管。
所谓一个「应用程式」,一般是一个虚拟目录,但是一个虚拟目录并不一定是一个「应用程式」。若不是一个「应用程式」的话,就不会执行位於此虚拟目录下的Global.asa档案。
在 Internet服务管理员 中,虚拟目录前的符号为一个活页夹时,表示是一个虚拟目录,但不是一个「应用程式」,换句话说,就不会执行位於此虚拟目录下的Global.asa档案。虚拟目录前的符号为纸盒包含球时,表示是一个虚拟目录,也是一个「应用程式」,换句话说,就会执行位於此虚拟目录下的Global.asa档案。
如下图的IISHelp是一个「应用程式」和虚拟目录,而Scripts只是一个虚拟目录但不是一个「应用程式」:
每一个ASP发展的应用程式,可以有一个Global.asa档案(asa代表Active Server Application)储存通用的Application、Session事件执行程式。此档案须储存於应用程式的根目录下。
在以下的时机,ASP将读取Global.asa档案:
一个Global.asa档案仅可以包括以下部份:
Global.asa档案的程式须包括於<SCRIPT>...</SCRIPT>当中。 若多个事件的程式用到相同的script语言,则可以一起包括於一个<SCRIPT>...</SCRIPT>当中。
Global.asa档案可使用#INCLUDE包括其他档案,执行到此处时将先执行此「被包括」的档案。
修改Global.asa档案
若您修改Global.asa档案,网站伺服器执行完此应用程式所有正在执行的程式後,才会重新编译新的Global.asa档案。编译後重新执行此应用程式,才会接受传送网页的要求。
Application、session起始事件
当一个Application启动、或新的Session产生时,将触发Application_ OnStart事件、Session_OnStart事件。
「Application_OnStart」为Application起始的事件,即起动一个Application应用程式时最先触发执行的程序。「Session_OnStart」为Session起始的事件,即一个使用者第一次进入一个应用程式浏览网页时,将启动一个Session时最先触发执行的程序。
若一个application应用程式和session同时启动时,ASP先执行「Application_OnStart」,再执行「Session_OnStart」。
以下为在Global.asa档案定义「Application_OnStart」的例子,当一个Application应用程式起动时,最先执行如下程式:
<SCRIPT LANGUAGE=VBScript RUNAT=Server> Sub Application_OnStart '起动执行程式 End Sub </SCRIPT>
以下为在Global.asa档案定义「Session_OnStart」的例子,当一个Session启动时,最先执行如下程式,譬如产生Ad Rotator元件的instance:
<SCRIPT LANGUAGE=VBScript RUNAT=Server> Sub Session_OnStart Set Session("MyAd")=Server.CreateObject("MSWC.Adrotator") End Sub </SCRIPT>
Application、Session结束事件
「Application_OnEnd」为Application结束的事件,即结束一个Application应用程式时触发执行的程序。「Session_OnEnd」为Session结束的事件,即结束一个Session时触发执行的程序。
当一个使用者浏览完此应用程式的相关网页後,当超过自动结束Session的timeout时间时,或使用「Abandon」方法时,将结束一个Session,触发Session_OnEnd事件。所有Session都结束後,触发Application_OnEnd事件,会重新编译Global.asa档案。
若一个Application应用程式和Session同时结束时,ASP先执行「Session_OnEnd」,再执行「Application_OnEnd」。
以下在Global.asa档案定义「Session_OnEnd」的例子,当一个Session结束时,执行如下程式:
<SCRIPT LANGUAGE=VBScript RUNAT=Server> Sub Session_OnEnd ' 结束执行程式 End Sub </SCRIPT>
以下为在Global.asa档案定义「Application_OnEnd」的例子,当一个Application应用程式结束时,执行如下程式:
<SCRIPT LANGUAGE=VBScript RUNAT=Server> Sub Application_OnEnd '结束执行程式 End Sub </SCRIPT>
结束一个Application
关闭网站伺服器时,将结束一个Application。
结束一个Session
於一个Application应用程式中,当一个使用者於一段时间内未再要求此应用程式任何一个网页时,此Session将自动结束。
自动结束Session的预设值为20分钟。
若想设定久一点,譬如30分钟自动结束session,可设定「Timeout」:
<% Session.Timeout = 30 %>
未达到自动结束Session的时间时,若想结束一个Session,可以使用「Abandon」方法。譬如:
<% Session.Abandon %>
管理Applications
您可以使用Application物件,设定可让所有使用者都可以存取的属性,来管理一个Application。
您也可以使用Application物件,设定共同的讯息、变数,让此应用程式的所有使用者都可以共同使用。
以下为在Global.asa档案「Application_OnStart」定义共同的讯息的例子,当一个Application应用程式起动时,最先执行如下程式:
<SCRIPT LANGUAGE=VBScript RUNAT=Server> Sub Application_OnStart Application("Message")= "预设的讯息" End Sub </SCRIPT>
以下的网页a.asp将显示此共同的讯息,所有使用者浏览此网页时都可以看到此共同的讯息:
<HTML> <BODY> 共同的讯息: <p> <%= Application("Message")%> </BODY></HTML>
以下的网页b.asp将让使用者修改此共同的讯息:
<HTML> <BODY> <form method="post" action="c.asp"> 修改共同的讯息:<BR> <input type="text" name="newmsg" size=60><p> <input type="submit" value="Submit"> </form> </BODY> </HTML>
按下「Submit」按钮後,执行网页c.asp,修改此共同的讯息,再於网页a.asp显示此共同的讯息:
<%
If Not IsEmpty(Request.Form("newmsg"))Then
Application.Lock
Application("Message")= Request.Form("newmsg")
Application.Unlock
End If
Response.Redirect("a.asp")
%>
管理Session
您可以使用Session物件,设定物件或变数来管理一个Session。
要启动一个Session,有以下叁个方式:
SessionID和Cookies
一个使用者第一次於一个应用程式要求任何一个ASP网页时,ASP将产生一个SessionID,然後传送到使用者的浏览器,储存成一个Cookies,但因未设定Cookies之有效期间,并未储存於使用者的硬碟中。
一个SessionID是一个经复杂演算结果後产生的数字,代表一个使用者的身份。
网站伺服器自动於每一个网页读取Cookies以取得SessionID,同一个SessionID的网页使用者,代表为同一个使用者。
大部份的浏览器都提供支援Cookies的功能。若使用者的浏览器不提供支援Cookies的功能,将无法使用Session物件的功能。
在Session物件储存变动
在Session物件储存变数,让同一个使用者在多个网页之间,共同使用这些变数。
譬如以下的例子设定了叁个变数:
<% Session("a")= Now Session("b")= "Low" Set Session("c")= Server.CreateObject("someObj") %>
您可以在Session物件储存使用者的喜好,让多个网页都得知使用者的喜好。
譬如以下的例子储存使用者的浏览器仅提供文字的功能,多个网页都仅提供给此使用者只有文字的网页:
<%If Session("Fidelity")= "Low" Then %> 只有文字的网页 <% Else %> 一般的网页 <% End If %>
设定ASP元件适用范围
一个ASP元件(ActiveX server components)可设定为以下的适用范围:
您能在Global.asa档案,使用<OBJECT>标记,或使用Server.CreateObject方法来定义一个ASP元件,适用於Application或Session的范围。
<OBJECT>宣告
於Global.asa档案中使用 <OBJECT>...</OBJECT> 标记,可以定义一个适用於Application、或Session的ASP元件。
<OBJECT>...</OBJECT>不位於<SCRIPT>...</SCRIPT>标记之内。
Global.asa档案中定义的ASP元件,不会先被产生,直到被呼叫执行时才会被产生。如此可以节省系统的资源。
语法,如下:
<OBJECT RUNAT=Server SCOPE=Scope ID=IdentifInternet Explorerr
{PROGID="progID"|CLASSID="ClassID"}>
</OBJECT>
使用<OBJECT>标记来定义一个ASP元件,适用於Application或Session的范围。
RUNAT须设定为Server,SCOPE设定为Application或Session。使用注册名称PROGID或注册号码CLASSID的方法。
SCOPE设定为Application或Session的<OBJECT>标记,须置於Global.asa档案当中。
譬如使用注册名称PROGID,来定义一个适用於Session的ASP元件:
<OBJECT RUNAT=Server SCOPE=Session ID=MyAd PROGID="MSWC.Adrotator"> </OBJECT>
以下例子使用了注册号码CLASSID,来定义一个适用於Application的ASP元件:
<OBJECT RUNAT=Server SCOPE=Application ID=MyAd CLASSID="Clsid:00000293-0000-0010-8000-00AA006D2EA4"></OBJECT>
一旦在Global.asa档案中定义一个ASP元件,即可於应用程式中使用此ASP元件,譬如Global.asa档案,如下:
<OBJECT RUNAT=Server SCOPE=Session ID=MyAd PROGID="MSWC.AdRotator"> </OBJECT>
即可於应用程式a.asp中使用此ASP元件MyAd,如下:
<%= MyAd.GetAdvertisement("/ads/adrot.txt")%>
使用Server.CreateObject方法
您可以使用Server.CreateObject方法,定义一个适用於Session的ASP元件,譬如:
<% Set Session("ad")= Server.CreateObject("MSWC.Adrotator")%>
若要执行此ASP元件,程式码如下:
<% Set MyAd = Session("ad")%> <%= MyAd.GetAdvertisement("addata.txt")%>
效 率
使用<OBJECT>标记定义的ASP元件,只有当被呼叫使用时才会被启动;而使用Server.CreateObject方法定义的ASP元件,将立刻被启动。因此以效率而言,<OBJECT>标记定义的ASP元件效率较佳。
对仅适用於一个网页的ASP元件,使用<OBJECT>标记或Server.CreateObject方法定义,效率相同。
您能使用<OBJECT>标记定义一个适用於Session和Application的ASP元件,而使用Server.CreateObject方法定义一个适用於Session的ASP元件。
TypeLibrary
TypeLibrary包括应用程式呼叫COM元件(component)中所参考到的物件(objects)和型态(types)之资讯。
譬如COM元件中所用到的常数(constants),可於Global.asa档案定义TypeLibrary。
语法如下:
<!--METADATA TYPE="TypeLib" FILE="file" UUID="typelibraryuuid" VERSION="majorversionnumber.minorversionnumber" LCID="localeid" -->
若有错误发生:
譬如於VB定义常数(constants),如下:
Public Const MyError = "错误:无法…"
将此资讯储存於Type Library的档案,如error.tlb中,则在Global.asa定义如下:
<!-- METADATA TYPE="TypeLib" FILE="error.tlb" -->
以後此应用程式中的asp程式,即可使用参考此Type Library的COM元件。
另外一个例子,如下:
<!--METADATA TYPE="TypeLib" NAME="Microsoft ActiveX Data Objects
2.5 Library" UUID="{00000205-0000-0010-8000-00AA006D2EA4}"
VERSION="2.5"-->
又譬如说若使用:
<% rs.Open "Customers", Conn, adOpenStatic, adLockOptimistic %>
需让asp知道adOpenStatic、adLockOptimistic常数的值,此资讯储存於Type Library的档案msado.dll中,因此必须於Global.asa定义如下:
<!-- METADATA TYPE="typelib" FILE="c:\program files\common files\system\ado\msado.dll"-->
若不在Global.asa定义typelib,则须将找出adOpenStatic、adLockOptimistic常数的值,於asp程式列出如下:
<% rs.Open "Customers", Conn, 3, 3 %>
您是否想知道更详细一些的资料呢 ? 请参考附录
B-1 〈如何使用Application物件呢 ?〉、 B-2 〈如何使用Session物件呢 ? 〉中有关Application、Session的解说!
A-5 如何读取表单(form)输入资料呢?
表单(form)
将输入的资料传送到伺服器的方法,系使用HTML标记<FORM>...</FORM>的「表单」(form),於用户端浏览器输入资料,按下「SUBMIT」按钮後,将输入的资料传送到伺服器加予处理。表单(form)的语法如下:
<FORM ACTION=url ENCTYPE="EncodingType" METHOD=GET|POST NAME="FormName" OnReset=event onSubmit=event TARGET=window> </FORM>
ASP取得表单(form)输入资料的方法
由表单(form)的METHOD得知,用户端浏览器可以用下面两种方法,将输入的资料传给网站的伺服器:
ASP取得表单(form)输入资料的方法,系使用Active Server Pages一个内建的「物件」(object),叫做Request,依据GET、POST方法而异:
GET: 使用「输入资料= Request.QueryString("栏位名称")」 或「Request.("栏位名称")」, 将附加於URL後的资料取出,以取得此栏的输入资料。 POST: 使用「输入资料=Request.Form("栏位名称")」 或「Request.("栏位名称")」, 读取HTTP讯息资料栏位,以取得此栏的输入资料。
无论GET或POST方式,都可以使用「Request.("栏位名称")」取得此栏的输入资料。
使用Request.QueryString("栏位名称")或Request.("栏位名称"),取出GET方式的输入资料,譬如form1.asp:
<FORM Name=Form1 METHOD=GET ACTION="form1.asp"> 姓名: <Input Type=Text Name=name1> <INPUT Type=Submit Value="写完了"> </FORM> <% = Request.QueryString("name1")%><BR> <% = Request("name1")%>
在用户端使用浏览器,如Internet Explorer,浏览伺服器执行form1.asp的结果如下:
填入姓名後,按下 写完了 按钮,伺服器将取得的输入资料显示出:
填入姓名後,按下 写完了 按钮,传送到form1.asp档案,伺服器使用Request.QueryString("name1")或Request("name1"),将取得的输入显示出来。
使用Request.Form("栏位名称")或Request.("栏位名称"),取出POST方式的输入资料,譬如:
<FORM Name=Form2 METHOD=POST ACTION="form1.asp"> 姓名: <Input Type=Text Name=name2> <INPUT Type=Submit Value="写完了"> </FORM> <% = Request.form("name2")%><BR> <% = Request("name2")%>
在用户端使用浏览器,如Internet Explorer,浏览伺服器执行form1.asp的结果如下:
填入姓名後,按下 写完了 按钮,伺服器将取得的输入资料显示出:
填入姓名後,按下 写完了 按钮,传送到form1.asp档案,伺服器使用Request.form("name2")或Request("name2"),将取得的输入显示出来。
Request.QueryString范例
使用Request.QueryString("栏位名称"),将附加於URL後的资料取出,譬如:
<A HREF="form1.asp?Name=Jack&Age=15"> 按此处, 经由Request.QueryString取得Name, Age</A><P> Name: <%= Request.QueryString("Name")%><BR> Age: <%= Request.QueryString("Age")%>
Request.QueryString取出栏位Name的输入资料为Jack,栏位Age的输入资料为15,在用户端使用浏览器,浏览执行的结果如下:
按下後显示取出的资料:
GET范例
仍然一头雾水吗 ? 看个例子就了解了!
这个例子的表单(form)使用GET方式,在用户端使用浏览器,浏览执行的结果如下:
输入表单并按下 写完了 按钮後,将显示处理的结果:
网站伺服器form1.asp档案的程式码如下,按下「SUBMIT」按钮後,执行网站伺服器的asp1b.asp:
<form action="asp1b.asp" method="GET"> 姓名:<INPUT TYPE=TEXT NAME="input1" VALUE="大名"> <p>特徵: <select name="input2"> <OPTION>戴眼镜 <OPTION>小肚微凸 <OPTION>漂亮 </select> <p><input type=submit VALUE="写完了"> </form>
asp1b.asp档案的ASP程式码如下,由於表单(form)使用GET方式,ASP程式码使用使用「输入资料= Request.QueryString("栏位名称")」,将附加於URL後的资料取出,以取得此栏的输入资料:
<HTML><BODY> <%= Request.QueryString("input1")%> 您好, 您的特徵是 <%= Request.QueryString("input2")%>. </BODY></HTML>
是否想知道更详细一些的资料呢?请参考附录
B-3〈如何使用Request物件呢 ? 〉 中有关Request.Form、Request.QueryString的解说!
A-6 如何使用Cookies呢?
Cookies
为了预防病毒於Internet上到处漫延,WWW禁止在用户端的硬碟上做读写存取档案的动作。但是使用Cookies,可让您在用户端的硬碟上储存一些资讯,譬如当来访者输入其姓名等资料时,使用Cookies将之储存於来访者用户端的硬碟上,下次这位来访者再度浏览此网站时,即可读取此Cookies直接得知来访者的身份。
ASP存取Cookies的方式
ASP存取读写Cookies的方式,是使用Active Server Pages两个内建的「物件」(object),叫做Response和Request,方式十分简单,如下:
写入Cookies: Response.Cookies("待写入的Cookies名称")= "待写入资料" 读取Cookies: 读取资料 = Request.Cookies("待读取的Cookies名称")
写入Cookies注意事项
依据笔者的经验,写入Cookies注意事项如下:
Response.Cookies("待写入的Cookies名称").Expires = #July 1, 2002# Response.Cookies("待写入的Cookies名称").Expires = Date + 365
第一个式子设定有效期间到July 1, 2002。
第二个式子设定有效期间为今天起一年内有效。
存取Cookies的范例
看个例子就知道如何使用了!
在用户端使用浏览器,浏览Cookies2.asp执行的结果如下:
ASP程式码,将名称为Test的Cookies写入「I love you!」到用户端的硬碟当中,再读取显示出来,如下:
<% Response.Cookies("Test")= "I love you!" Response.Cookies("Test").Expires = Date + 365 %> <% = Request.Cookies("Test")%>
储存於用户端的硬碟的Cookies内容,如下:
TEST I+love+you%21 1.1.1.1/aspsamp 0 2090369024 29258206 2932752880 29184720 *
上次光临此网页的时间
您可以使用在用户端写入Cookies来记录上次光临此网页的时间!
ASP程式码,将名称为UserTime的Cookies写入「光临此网页的时间」到用户端的硬碟当中,再读取显示出来,如下:
<% LastUserTime = Request.Cookies("UserTime") Response.Cookies("UserTime")= FormatDateTime(NOW) Response.Cookies("UserTime").Expires = Date + 365 %> 刚写入的CookInternet Explorer(本次光临的时间): <BR> <% = Request.Cookies("UserTime")%><p> <% If LastUserTime <> "" Then %> <% = Request.Cookies("UserName")%> 您上次光临此网页的时间为:<BR> <% = LastUserTime %><p> <% end if %> <A href = "Cookies2.asp">再度光临</A>
在用户端使用浏览器,浏览Cookies2.asp执行的结果如下:
按下 再度光临 ,可以再试一次。
Cookies记录用户的资料
使用Cookies,可让您於用户端的硬碟上记录用户的资料,当用户输入其资料时,使用Cookies将用户的资料储存於用户端的硬碟上,下次再度光临此网站时,即可读取用户端的硬碟的Cookies,以直接得知这来访者的身份。
在用户端使用浏览器,浏览Cookies3.asp执行的结果如下:
第一次浏览时若输入姓名的资料,以後被直接叫名字打招呼时,可不要被吓一跳了:
Cookies3.asp程式码,如下:
<% if Request.Form("UserName")<> "" then Response.Cookies("UserID")= Request.Form("UserName") Response.Cookies("UserID").Expires = Date + 365 end if %> <html> <HEAD> <TITLE>ASP Cookies</TITLE> <META HTTP-EQUIV="content-type" CONTENT="text/html;charset=big5"> </HEAD> <body> Cookies记录用户的资料<P> <% UserName = Request.Cookies("UserID")%> <% if UserName = "" then %> <form action="Cookies2.asp" method="post" > 姓名: <INPUT TYPE=TEXT NAME="UserName" VALUE="大名"> <input type=submit VALUE="写完了"> </form> <% end if %> <P> <%=UserName%> 您好!
储存於用户端的硬碟\windows\Cookies路径下的此Cookies内容,如下:
USERID Jack 1.1.1.1/aspsamp 0 2090369024 29258206 2932252880 29184720 *
想知道更多Cookies的使用方法以及更详细一些的资料呢 ? 请参阅附录
B-3〈如何使用Request物件呢 ? 〉 、 B-4〈如何使用Response物件呢 ? 〉 中有关Request.Cookies、Response.Cookies的解说!
A-7 如何侦错Script程式呢?
Microsoft Script Debugger
Microsoft Script Debugger(Script侦错工具),提供Script程式的侦错功能。您可以使用Microsoft Script侦错工具来进行使用VBScript、JScript编写的Script程式,以及Java applets、beans和ActiveX元件的侦错工作。
有的Script程式在用户端浏览器执行,有的Script程式(<%...%>中的部份)在伺服器端执行。
Microsoft Script Debugger,可以侦错用户端执行的Script程式,和伺服器端执行Script程式:
Microsoft Script Debugger提供以下的除错功能:
侦错在用户端浏览器执行的Script程式码
若要侦错在用户端浏览器执行的Script程式码,需要使用Internet Explorer浏览器和Microsoft Script Debugger(Script侦错工具),并设定Internet Explorer浏览器未关闭Script侦错的功能,请在Internet Explorer浏览器的 工具 功能表的 Internet选项 ,选取 进阶 标签页,如下图:
请不要选取 关闭Script侦错 。
侦错在伺服器端执行的Script程式码
您可以使用Microsoft Script Debugger(Script侦错工具)来进行ASP程式码的除错工作。ASP程式码包括在伺服器端执行的Script程式码。
如果要侦错在伺服器端执行的Script程式码,需要设定为启动ASP侦错的功能,方法为在 Internet服务管理员 中选取Web站台或应用程式的启动点目录,按下滑鼠右键,选择 内容 ,按下 虚拟目录 (或 主目录、目录 )标签,按下 设定 按钮,选择 应用程式侦错 标签,如下图:
若要启动除错,请选取 启用ASP伺服器端指令侦错 ,如此一来,当执行ASP程式码产生错误,或执行ASP程式码中遇到中断点时,除错程式便会自动启动。
启动Microsoft Script Debugger
启动Microsoft Script Debugger(侦错工具)的方法有数种:
选择待侦错的程式
若要选择待侦错的程式,方法为首先在Internet Explorer浏览器中显示待侦错的程式。
从 检视 功能表选择 执行文件 ,或按下侦错工具列上的 执行文件(Running Documents) 图示,如下图:
将显示出 执行文件 画面,选择待侦错的文件,接着按两下即可开启,如下图。注意在Internet Explorer浏览器中显示的待侦错程式才会显示出来:
开启後,如下图:
请加油吧!
设定中断点
您可以设定中断点,来控制Script程式的执行。在中断点处,Script程式会暂停执行,并呼叫侦错工具。到达中断点後,您可以逐行执行Script Script程式中的每一行,以检视每一行的执行效果,有助於查出Script程式码当中的bug。
若要设定中断点,方法为首先在Internet Explorer浏览器中显示待设定中断点的Script程式文件。
对於在用户端浏览器执行的Script程式码,请从Internet Explorer浏览器 检视 功能表中的 Script侦错工具 按下 开启 ,来启动侦错工具。
对於在伺服器端执行的Script程式码,请执行Windows NT Option Pack中的Microsoft Script Debugger来启动,然後参考前面所述的方法以选择待侦错的程式。
在Microsoft Script侦错工具中,将插入点置於要设定中断点的那一行程式。在Java程式中设定中断点时,须选择整行的程式。
从 侦错 功能表当中,选择 切换中断点 ,即可设定中断点,中断点所在的程式行将显示为红色,并於前面加一个红色的中断点。如下图:
您可以重覆以上的步骤来设定多个中断点。
然後切换到Internet Explorer浏览器。对於在用户端浏览器执行的Script程式码,执行一个能启动待侦错Script程式的动作,譬如按下一个按钮。对於在伺服器端执行的Script程式码, 重新整理 浏览器中Script程式的文件。
需注意,如果在浏览器中 重新整理 中Script程式的文件,在用户端浏览器执行的Script程式码里的所有中断点都会被清除。
如此一来,当Script侦错工具遇到第一个中断点时将停止执行。您可以使用逐步追踪的方式来逐步执行每一行指令以除错。
若您不再需要使用这个中断点来侦错时,可以清除中断点。方法为把插入点置於中断点的程式位置,从 侦错 功能表选择 切换中断点 即可清除中断点。
当您结束Script的侦错工作时,可以清除所有中断点。方法为从 侦错功能表 选择 清除所有中断点 即可清除所有中断点。
逐步追踪Script程式
您可以使用Microsoft Script侦错工具逐步追踪的方式,逐步执行每一行指令以除错。
如果Script程式呼叫其他的副程式或函数,您可以选择逐行执行该副程式或函数,或者选择一次执行完毕这个副程式或函数。
若要逐步追踪一个Script程式,方法为首先在Internet Explorer浏览器中显示待逐步追踪的Script程式文件。接着启动Script侦错工具并设定中断点。
然後切换到Internet Explorer浏览器。对於在用户端浏览器执行的Script程式码,执行一个能启动待侦错Script程式的动作,譬如按下一个按钮。对於在伺服器端执行的Script程式码, 重新整理 浏览器中的文件。
Script侦错工具将停留在第一个中断点处,如下图:
若要逐步追踪Script程式,请从 侦错 功能表选择下列:
若您跳入呼叫一个副程式或函数,想在到达副程式或函数结束之前取消逐步追踪,可以从 侦错 功能表选择 跳出 即可。
您可以在 侦错 功能表选择 跳入、跳过、跳出 ,或按下侦错工具列中相对应的图示按钮。
您可以继续进行逐步追踪Script程式侦错,直到Script程式结束。或者从 侦错 功能表选择 执行 指令以执行Script程式。
设定书签
进行Script程式侦错时,可在一行程式上设定书签,以後便可以透过书签迅速返回到该行的程式。
若要设定或清除书签,方法为将插入点置於要设定书签的那一行程式,然後在键盘上按 CTRL+F2 ,即可设定书签,再按 CTRL+F2 即可清除书签。
设定书签後,Script侦错工具会在那一行程式前面加一个图示记号,如下图:
若要透过书签,迅速返回到设定书签的那行程式,方法为在键盘上按 F2 ,即可移动到下一个书签的位置。按 SHIFT+F2 则移动到前一个书签的位置。
检视呼叫堆叠
「呼叫堆叠」视窗,可让您追踪目前执行的副程式和函数,以检视控制流程。您可以执行呼叫堆叠中的某个副程式和函数,然後继续执行Script程式。
侦错Script程式 时,「呼叫堆叠」视窗显示目前已经载入的副程式、函数、或事件处理程式。每次呼叫一个副程式或函数时,此副程式或函数名称会被新增到「呼叫堆叠」的顶端。当结束副程式或函数时,此副程式或函数名称就从「呼叫堆叠」中移除。
检视「呼叫堆叠」,有助於追踪巢状副程式或函数的执行过程。从 检视 功能表中选择 呼叫堆叠 ,即可显示「呼叫堆叠」视窗,如下图:
若要跳至堆叠视窗中的副程式或函数,连按两下此副程式或函数名称,即可跳至此副程式或函数。
检视和更改变数值以及执行Script指令
Script程式侦错过程中,可以检视和更改变数或属性的值,以影响其执行方式。更改之後可以继续执行Script程式,以及检视更改後的影响。
您可用 指令视窗 检视和更改Script执行中变数和属性的值,以影响目前Script程式的执行。
您可以使用 指令视窗 计算任何运算式,或者於 指令视窗 中使用Script语言执行Script指令,但须与目前执行的Script程式语言相同。您可以在中断点处,或从中断点跳入到另一行程式时,执行Script指令。
於 指令视窗 中可以检视和更改:
若要逐步追踪一个Script程式,方法为首先在Internet Explorer浏览器中显示待逐步追踪的Script程式文件。接着启动Script侦错工具并设定中断点。
然後切换到Internet Explorer浏览器。对於在用户端浏览器执行的Script程式码,执行一个能启动待侦错Script程式的动作,譬如按下一个按钮。对於在伺服器端执行的Script程式码, 重新整理 浏览器中的文件。
从 检视 功能表选择 指令视窗 ,如下图:
於 指令视窗 输入以下的指令,以检视变数或属性的值:
指令视窗 将显示变数的值。
若要更改变数的值,只需指派值给变数即可,譬如「i = 10」。
若要立即执行Script指令,请在 指令视窗 中输入Script指令,然後按ENTER键即可。
侦错Global.asa档案
Global.asa的侦错与.asp档案侦错的方式不太相同。
因为伺服器自动执行Global.asa程式,因此无法启动该程式。
另外一个与 .asp程式不同之处,为Global.asa档案中的程式是使用「事件」驱动方式执行的。
当ASP程式执行时,会在整个应用程式开始执行或结束,以及一个使用者开始执行或结束时,触发事件,执行Global.asa档案:
若执行Global.asa档案中,发生语法错误或是执行阶段错误时,则伺服器端终止该程式的执行动作。
若ASP应用程式设定为允许Script侦错工具进行侦错工作,则伺服器启动侦错程式并显示错误讯息;若ASP应用程式设定为不允许Script侦错工具进行侦错工作,则於用户浏览器显示错误讯息。
若要控制Global.asa档案呼叫Script侦错工具的时机,可在Global.asa档案程式的开头,加入启动侦错程式的叙述,如於VBScript语言中加入Stop指令,或於JScript语言中加入debugger指令,如此即可进行逐步追踪的侦错方式。
若需要再次执行Application_OnStart事件的程式,必须停止和重新启动该应用程式。
若需要再次执行Session_OnStart事件的程式,可关闭和重新执行浏览器,以启动新的Session而再次执行Session_OnStart事件程式。您也可以於Script程式当中,呼叫Session物件的Abandon方法,以启动新的Session而再次执行Session_OnStart事件程式。
A-8 VBScript语法呢?
ASP(Active Server Pages)所使用的VBScript语言,是在IIS(Internet Information Services)或PWS(Personal Web Server)网站伺服器执行的script语言。
虽然Netscape浏览器不能执行VBScript语言,但是Netscape浏览器仍然可以执行使用VBScript来撰写的ASP程式,这是因为ASP程式在IIS或PWS网站伺服器执行<% ...%>内的VBScript程式後,产生标准的HTML码,再送到用户端的浏览器,因此asp程式内的VBScript执行後可以在任何一种浏览器上显示。
建议您使用VBScript来撰写ASP程式。
本单元整理ASP所使用的所有VBScript语法,包括VBScript变数与函数。
对於初学者而言,建议您执行范例光碟中的VBScript范例。
VBScript的所有的语法与函数,如下表:
| 分类 | 关键字 |
|---|---|
| 阵列 | Array、Filter、Join、Split、handlingDim 、ReDimIsArray 、Erase 、LBound, Ubound |
| 指定 | = Set |
| 注解 | Rem |
| 常数 | Empty 、Nothing 、Null 、True 、 False |
| 控制流程 | Do...Loop 、For...Next 、If...Then...Else 、Select Case、While...Wend |
| 转换 | Abs、Asc、AscB、AscW、Chr、Ccur、ChrB、ChrW、CBool, Cbyte、CDate、CDbl、Cint、CLng、CSng、CStr、DateSerial、DateValue、Hex, Oct、Fix, Int Sgn TimeSerial、TimeValue、FormatCurrency、FormatDateTime、FormatNumber、FormatPercent |
| 日期时间 | Date、Time、DateSerial、DateValue、Day、Month、Weekday、Year Hour、Minute、Second、Now、 TimeSerial、TimeValue、WeekdayName、MonthName、DateAdd、DateDiff、DatePart |
| 物件 | CreateObject、GetObject |
| Script | ScriptEngine、ScriptEngineBuildVersion、ScriptEngineMajorVersion、ScriptEngineMinorVersion |
| 宣告 | Dim、ReDim、Function、Sub、 Option Explicit |
| 错误处理 | On Error、Err |
| 输入和输出 | InputBox、MsgBox |
| 算术 | Atn、Cos、Sin、Tan、Exp、Log、Sqr、Randomize、Rnd |
| 运算 | Addition(+)、Subtraction(-)、Exponentiation (^) Modulus arithmetic (Mod)、Multiplication (*)、Division (/)、Integer Division (\)、Negation (-)、String concatenation (&)、Equality (=)、Inequality (<>)、 Less Than (<)、Less Than or Equal To (<=)、Greater Than (>)、Greater Than or Equal To (>=)、Is、And、Or、Xor、Eqv、Imp |
| 程序 | Call Function、Sub |
| 字串 | Asc、AscB、AscW、Chr、ChrB、ChrW、Instr、InStrB、Len、LenB、Ucase、Left、LeftB、Mid、MidB、, RightB、Space、StrComp、String、 LTrim, RTrim、Trim、Space、StrReverse、Replace |
| 变数 | IsArray、IsDate、IsEmpty、IsNull、IsNumeric、IsObjecT、VarType、TypeName |
VBScript的变数类型
VBScript的变数的类型和其代码,如下:
| 代码 | 变数的类型 | 说 明 |
|---|---|---|
| 0 | Empty | 空字串或数字0。 |
| 1 | Null | 包含无效的资料。 |
| 2 | Integer | 整数,范围-32,768到32,767。 |
| 3 | Long | 整数,范围-2,147,483,648到2,147,483,647。 |
| 4 | Single | 包含一个单精度浮点数,负的范围为-3.402823E38到-1.401298E-45,正的范围为1.401298E-45到3.402823E38。 |
| 5 | Double | 包含一个双精度浮点数,负的范围为-4.94065645841247E-324,正的范围为4.94065645841247E-324到1.79769313486232E308。 |
| 6 | Currency | 货币。 |
| 7 | Date (Time) | 代表一个日期,范围为January 1, 100到December 31, 9999。 |
| 8 | String | 包含一个长度可变字串,长度最多20亿字母。 |
| 9 | Automation object. | 物件。 |
| 10 | Error | 包含一个错误数字。 |
| 11 | Boolean | 布林逻辑,True或False。 |
| 12 | Variant | 可变,用於阵列变数。 |
| 13 | Non-Automation object. | 非物件。 |
| 17 | Byte | 整数,范围0到255。 |
| 8192 | Array | 阵列变数。 |
VBScript的函数
VBScript的函数,分类为一般函数、阵列(array)函数、日期(date)函数、数学(math)运算函数、字串(string)函数、和物件(object)函数,依照英文字母的顺序,条列如下,於[...]的参数表示可加予省略:
| VBScript 函数 | 功能说明 | 例子 |
|---|---|---|
| Abs(数值) | 绝对值。一个数字的绝对值是它的正值。空字串(null)的绝对值,也是空字串;假如数值是一个未初始化的变数,则绝对值是零。 |
例子:ABS(-12345) 结果:-12345 |
| Array(以逗点分隔的阵列元素) | Array函数传回阵列元素的值。 |
例子: A = Array(10,20,20) B = A(2) 结果:20 说明:变数B为A阵列的第二个元素的值 |
| Asc(字串) | 将字串的第一字母转换成ANSI(美国国家标准符号)字码。 |
例子:Asc("Internet") 结果:73 说明:显示第一字母I的ANSI字码 |
| Atn(数字) | 反正切值(arc tangent)。结果的范围是-(/2到(/2。 |
例子:Atn(100) 结果: 1.56079666010823 |
| CBool(运算式) | 转换成布林逻辑值变数型态(True或False)。 |
例子:CBool(3+5) 结果:True |
| CByte(运算式) | 转换成位元组变数型态。 |
例子:CByte(255) 结果:255 |
| CCur(运算式) | 转换成Currency变数型态。 |
例子:CCur(255.34) 结果:255.34 |
| CDate(日期运算式) | 换成日期变数型态。可先使用IsDate函数判断是否可以转换成日期。 |
例子:CDate(now()+3) 结果:1999/5/10 10:30:59 |
| CDbl(运算式) | 转换成DOUBLE变数型态。 | |
| Chr(ANSI字码) | 将ASCII字码转换成字元。 |
例子:Chr(72) 结果:H |
| CInt(运算式) | 转换成整数变数型态。 |
例子:CInt("1.2345") 结果:1 |
| CLng(运算式) | 转换成LONG变数型态。 | |
| Cos(数字) | 馀弦值(cosine)。结果的范围是-1到1。数字为角的弧度,角度乘以(/180为弧度。 |
例子:Cos(3.14159) 结果:-1 |
| CreateObject(class) |
产生一个新的物件(Automation Object)并传回reference。 class格式为servername.typename,servername为提供物件的应用名称,typename为物件的type或class。 |
例子:Set ExcelSheet = CreateObject("Excel.Sheet") 结果:定义新的试算表物件定,定义了新的试算表物件,即可使用此物件的方法(methods)、和属性(properties) |
| CSng(运算式) | 转换成SINGLE变数型态。 | |
| CStr(运算式) | 转换成字串变数型态。 | |
| Date() | 传回系统的日期。 |
例子:Date 结果:2002/12/31 |
| DateAdd(I, N, D) |
将一个日期加上一段期间後的日期 I:设定一个日期(date)所加上一段期间(number)的单位。譬如interval="d"表示N的单位为日。I的设定值,如下: yyyy Year 年 q Quarter 季 m Month 月 y Day of year 日 d Day 日 w Weekday 星期 ww Week of year 周 h Hour 时 m Minute 分 s Second 秒 N:数值运算式,设定一个日期(date)所加上的一段期间(number),可为正值或负值,正值表示加(结果为date以後的日期),负值表示减(结果为date以前的日期)。 |
例子:DateAdd("m", 1, "31-Jan-98") 结果:28-Feb-98 说明:将日期31-Jan-98加上一个月,结果为28-Feb-98而非31-Feb-98。 例子:DateAdd("d", 20, "30-Jan-99") 结果:1999/2/9 说明:将一个日期30-Jan-99加上20天後的日期。 |
| DateDiff(I, D1, D2 [,FW[, FY]]) |
D:待加减的日期。 计算两个日期之间的期间 I:设定两个日期(date1, date2)之间的期间计算之单位。譬如I="m"表示计算的单位为月。I的设定值,如下: yyyy Year 年 q Quarter 季 m Month 月 y Day of year 日 d Day 日 w Weekday 星期 ww Week of year 周 h Hour 时 m Minute 分 s Second 秒 D1,D2:计算期间的两个日期运算式,若date1较早,则两个日期之间的期间结果为正值;若date2较早,则结果为负值。 FW:设定每周第一天为星期几,若未设定则表示为星期天。FW的设定值,如下: 0 使用National Language Support (NLS) API 的设定值 1 星期天(预设值)为每周第一天 2 星期一为每周第一天 3 星期二为每周第一天 4 星期叁为每周第一天 5 星期四为每周第一天 6 星期五为每周第一天 7 星期六为每周第一天 FY:设定一年的第一周,若未设定则表示一月一日那一周为一年的第一周。FY的设定值,如下: 0 使用National Language Support (NLS) API 的设定值 1 一月一日那一周为一年的第一周(预设值) 2 至少包括四天的第一周为一年的第一周 3 包括七天的第一周为一年的第一周 |
例子:DateDiff("d", "25-Mar-99", "30-Jun-99") 结果:97 说明:显示两个日期之间的期间为97天。 |
| DatePart(I, D [,FW[, FY]]) |
传回一个日期的一部份 I:设定传回那一部份。譬如I="d"表示传回部份为日。I的设定值,如下: yyyy Year 年 q Quarter 季 m Month 月 y Day of year 日 d Day 日 w Weekday 星期 ww Week of year 周 h Hour 时 m Minute 分 s Second 秒 D:待计算的日期。 FW:设定每周第一天为星期几,若未设定则表示为星期天。FW的设定值,如下: 0 使用National Language Support (NLS) API 的设定值 1 星期天(预设值)为每周第一天 2 星期一为每周第一天 3 星期二为每周第一天 4 星期叁为每周第一天 5 星期四为每周第一天 6 星期五为每周第一天 7 星期六为每周第一天 FY:设定一年的第一周,若未设定则表示一月一日那一周为一年的第一周。FY的设定值,如下: 0 使用National Language Support (NLS) API 的设定值 1 一月一日那一周为一年的第一周(预设值) 2 至少包括四天的第一周为一年的第一周 3 包括七天的第一周为一年的第一周 |
例子:DatePart("m", "25-Mar-99") 结果:3 说明:显示传回一个日期的月部份 |
| DateSerial(year, month, day) | 转换(year,month,day)成日期变数型态。 |
例子:DateSerial(99, 10, 1) 结果:1999/10/1 |
| DateValue(日期的字串或运算式) | 转换成日期变数型态,日期从January 1, 100到December 31, 9999。格式为month, day, and year或month/day/year。譬如,December 30, 1999、Dec 30, 1999、12/30/1999、12/30/99。 |
例子:DateValue("January 1, 2002") 结果:2002/1/1 |
| ay(日期的字串或运算式) | 传回日期的「日」部份。 |
例子:Day("12/1/1999") 结果:1 |
| xp(几次方) | 传回e(自然对数)的几次方值。e约 2.718282。 |
例子:Exp(2) 结果:7.389056 e(自然对数)的2次方值 |
| ilter(S, F[, L[, C]]) 串。 |
取得一个字串阵列符合过滤原则的一部份(subset)阵列。若未发现符合过滤原则,传回空的阵列。 S:待过滤的一维字串阵列。 F:待寻找的字串。 L:若设定为True,表示过滤後留下的为包括Value的一部份(subset)阵列;若设定为False,表示过滤後留下的为不包括Value的一部份(subset)阵列。 C:寻找比较的方法,0表二进位比较法,1表文字比较法,2表根据比较的资料型态而定,若省略C则为预设的二进位比较法。 |
|
| Fix(运算式) | 转换字串成整数数字型态。与Int函数相同。若为null时传回null。 Int(number)与Fix(number)的差别在负数。如Int(-5.6)=-6,Fix(-5.6)=-5。 Fix(number)等於Sgn(number) * Int(Abs(number))。 |
例子:Fix(5.6) 结果:5 |
| FormatCurrency(运算式[,N[,L [,P [,G]]]]) |
转换成Currency格式,并加上於控制台所设定的Currency符号,譬如NT$。 N:设定小数部份的显示位数,譬如设定为4时,0.6显示为0.6000。预设值为-1表示根据电脑的地区设定(regional settings)。 L:设定当只有小数部份时是(-1)否(0)显示0,譬如设定为0时,0.6显示为.6。预设值为-2表示根据电脑的地区设定(regional settings)。 P:设定当负数时是(-1)否(0)显示以括弧代替负号,譬如设定为-1时,-6显示为(6)。预设值为-2表示根据电脑的地区设定(regional settings)。 G:设定是(-1)否(0)将数字使用电脑的地区设定(regional settings)的群组符号加予群组。预设值为-2表示根据电脑的地区设定(regional settings)。 |
例子: FormatCurrency(5.6) 结果:NT$5.60 例子: FormatCurrency(-0.60,4,0,-1,-1) 结果:(NT$.60000) 说明:将N设定为4,0.6显示为0.6000四位小数。L设定为0,0.6显示为.6不加0。P设定为-1,-0.6显示为(0.6) 以括弧代替负号。 |
| FormatDateTime(日期运算式[,F]) |
转换成日期时间格式,F设定格式如下: 0:显示日期时间,日期为 short date 格式,时间为 long time 格式。为预设值。 1:显示日期,根据电脑的地区设定(regional settings)所设定的 long date 格式。 2:显示日期,根据电脑的地区设定(regional settings)所设定的 short date 格式。 3:显示时间,根据电脑的地区设定(regional settings)。 4:显示24小时格式的时间(hh:mm)。 |
例子: FormatDateTime(Now) 结果:1999/5/10 10:30:59 说明:显示转换今天成日期时间格式的结果。 |
| FormatNumber(运算式[,N[,L [,P [,G]]]]) |
转换成数字格式。 N:设定小数部份的显示位数,譬如设定为4时,0.6显示为0.6000。预设值为-1表示根据电脑的地区设定(regional settings)。 L:设定当只有小数部份时是(-1)否(0)显示0,譬如设定为0时,0.6显示为.6。预设值为-2表示根据电脑的地区设定(regional settings)。 P:设定当负数时是(-1)否(0)显示以括弧代替负号,譬如设定为-1时,-6显示为(6)。预设值为-2表示根据电脑的地区设定(regional settings)。 G:设定是(-1)否(0)将数字使用电脑的地区设定(regional settings)的群组符号加予群组。预设值为-2表示根据电脑的地区设定(regional settings)。 |
|
| FormatPercent(运算式[,N[,L [,P [,G]]]]) |
转换成百分比格式,即乘予100加上%符号。 N:设定小数部份的显示位数,譬如设定为4时,0.6显示为0.6000。预设值为-1表示根据电脑的地区设定(regional settings)。 L:设定当只有小数部份时是(-1)否(0)显示0,譬如设定为0时,0.6显示为.6。预设值为-2表示根据电脑的地区设定(regional settings)。 P:设定当负数时是(-1)否(0)显示以括弧代替负号,譬如设定为-1时,-6显示为(6)。预设值为-2表示根据电脑的地区设定(regional settings)。 G:设定是(-1)否(0)将数字使用电脑的地区设定(regional settings)的群组符号加予群组。预设值为-2表示根据电脑的地区设定(regional settings)。 |
例子:FormatPercent(-0.60,4,0,-1,-1) 结果:(60.0000%) 说明:将N设定为4,显示为四位小数。L设定为0,纯小数显示为不加整数0。P设定为-1,显示为以括弧代替负号。 |
| GetObject([pathname] [, class]) |
从一个档案传送reference给一个ActiveX物件 pathname:包括物件的档案名称。若省略pathname,则须给class。若pathname是空字串(""),GetObject传回一个新物件的 instance。若省略pathname,GetObject传回现在物件。若物件不存在,将发生错误。 class:class格式为servername.typename,servername为提供物件的应用名称,typename为物件的type或class。 |
例子:Set CADObject = GetObject("C:\CAD\SCHEMA.CAD") 结果:使用GetObject函数从一个档案存取ActiveX物件,并指定此物件到一个物件变数 |
| Hex(运算式) | 传回数值的16进位值。若运算式=null时Hex(运算式)= null,若运算式= Empty时Hex(运算式)=0。16进位可以加「&H」表示,譬如16进位&H10表示十进位的16。 |
例子:Hex(30) 结果:IE |
| Hour(时间的字串或运算式) | 传回时间的「小时」部份。 |
例子:Hour("12:30:54") 结果:12 |
| InStr([start, ]string1, string2[, compare]) | 将一个字串由左而右与另一个比较,传回第一个相同的位置。 start为从第几个字比较起,若省略start则从一个字比较起,string1为待寻找的字串运算式,string2为待比较的字串运算式,compare为比较的方法,compare=0表二进位比较法,compare=1表文字比较法,若省略compare则为预设的二进位比较法。 |
例子:InStr("abc123def123", "12") 结果:4 |
| nstrRev(string1, string2[, start[, compare]]) |
将一个字串由右而左与另一个比较,传回第一个相同的位置。 start为从第几个字比较起,若省略start则从一个字比较起,string1为待寻找的字串运算式,string2为待比较的字串运算式,compare为比较的方法,compare=0表二进位比较法,compare=1表文字比较法,若省略compare则为预设的二进位比较法。 |
例子:InstrRev("abc123def123", "12") 结果:10 说明:显示由右而左比较後第一个相同的位置。 |
| Int(运算式) |
传回一个数值的整数部份。与Fix函数相同。 Int(number)与Fix(number)的差别在负数。如Int(-5.6)=-6,Fix(-5.6)=-5。 Fix(number)等於Sgn(number) * Int(Abs(number))。 |
例子:Int(5.6) 结果:5 |
| IsArray(变数) | 测试变数是(True)否(False)是一个阵列。 |
例子:IsArray(3) 结果:False 说明:不是一个阵列 |
| IsDate(日期或字串的运算式) |
是否可以转换成日期 日期从January 1, 100 A.D.到December 31, 9999 A.D。 |
例子:IsDate("December 31, 1999") 结果:True 说明:可以(True)转换成日期 |
| IsEmpty(变数) | 测试变数是(False)否(True)已经被起始化(initialized) |
例子:IsEmpty(a) 结果:True |
| IsNull(变数) | 测试变数是(False)否(True)不是有效的资料 |
例子:IsNull("") 结果:False 说明:是有效的资料 |
| IsNumeric(运算式) | 是(True)否(False)是数字 |
例子:IsNumeric("abc123") 结果:False 说明:不是(False)数字 |
| IsObject(运算式) | 是(True)否(False)是一个有效的OLE Object。 |
例子:IsObject(3+5) 结果:False 说明:不是有效的OLE Automation object。 |
| Join(S [,D]) |
将一个字串阵列的所有元素连接成一个字串,各元素中间以delimiter分隔之。与Split函数的动作恰好相反,将一个字串分割成一个字串阵列。 S:待连接的一维字串阵列。 D:连接成一个字串时,各元素中间以delimiter分隔。若省略delimiter,则各元素中间以空白" "分隔之。若delimiter为长度为0的空字串,则各元素中间不分隔紧密相接在一起。 |
例子:Join(Split("ABC 12345 DEF")) 结果:ABC 12345 DEF 说明:字串「ABC 12345 DEF」先经Split 函数,分割成一个字串阵列,再经Join函数,将此字串阵列的所有元素连接成一个字串,结果为还原成原来的字串「ABC 12345 DEF」。 |
| LBound(阵列的名称 [,第几维]) | 传回一个阵列的维中的最小指标值。因阵列的指标值系由0编起,一般所有的最小指标值Lbound为0。由Lbound与Ubound函数可决定阵列的大小。 |
例子:LBound(A(6,4,3), 2) 结果:0 |
| LCase(字串运算式) | 转换字串成小写。将大写字母的部份转换成小写,字串其馀的部份不变。 |
例子:LCase("ABC123") 结果:abc123 |
| Left(字串运算式, length) | 取字串左边的几个字。length为取几个字。由Len函数可得知字串的长度。 |
例子:Left("ABC123",3) 结果:ABC |
| Len(字串运算式 | 变数) | 取得字串的长度。 |
例子:Len("ABC123") 结果:6 |
| LoadPicture() | 传回图形物件。 | |
| Log(数值运算式) | 取得一个数值的自然对数。自然对数e约2.718282。 |
例子:Log(3+5) 结果:2.075944 |
| LTrim(字串运算式) | 除去字串左边的空白字。Rtrim函数除去字串右边的空白字,Trim函数除去字串左右两边的空白字。 |
例子:LTrim(456 + " abc 123 ") 结果:456 abc 123 |
| Mid(字串运算式, start[, length]) |
取字串中的几个字 start为从第几个字取起,length为取几个字,若省略length则从star起取到最右底。由Len函数可得知字串的长度。 |
例子:Mid("ABC123",2,3) 结果:B12 |
| Minute(时间的字串或运算式) | 传回时间的「分钟」部份。 |
例子:Minute("12:30:54") 结果:30 |
| Month(日期的字串或运算式) | 传回日期的「月」部份。 |
例子:Month("12/1/2001") 结果:12 |
| MonthName(month[, abbreviate]) |
传回月的名称。 month:待传回月名称的数字1~12。譬如,1代表一月,7代表七月。 abbreviate:是(True)否(False)为缩写,譬如March,缩写为Mar。预设值为False。中文的月名称无缩写。 |
例子:MonthName(7) 结果:七月 |
| Now() | 传回系统的日期时间。 |
例子:Now 结果:2001/12/30 10:35:59 AM |
| Replace(字串运算式, find, replacewith[, start[, count[, compare]]]) |
将一个字串取代部份字串。寻找待取代的原字串(find),若找到则被取代为新字串(replacewith)。 find:待寻找取代的原字串。 replacewith:取代後的字串。 start:从第几个字开始寻找取代,若未设定则由第一个字开使寻找。 count:取代的次数。若未设定则所有寻找到的取代字串全部被取代。 compare:寻找比较的方法,compare=0表二进位比较法,compare=1表文字比较法,compare=2表根据比较的资料型态而定,若省略compare则为预设的二进位比较法。 |
例子:Replace("ABCD123ABC","AB","ab") 结果:abCD123abC |
| Right(字串运算式, length) | 取字串右边的几个字,length为取几个字。由Len函数可得知字串的长度。 |
例子:Right("ABC123",3) 结果:123 |
| Rnd[(number)] | 0~1的随机乱数值。number是任何有效的数值运算式。若number小於0表示每次得到相同的随机乱数值。number大於0或未提供时表示依序得到下一个的随机乱数值。number=0表示得到最近产生的随机乱数值。为了避免得到相同的随机乱数顺序,可以於Rnd函数前加Randomize。 |
例子:Rnd 结果:0.498498 |
| Round(数值运算式[, D]) |
四舍五入。 D:为四舍五入到第几位小数,若省略则四舍五入到整数。 |
例子:Round(3.635,1) 结果:3.6 |
| RTrim(字串运算式) | 除去字串右边的空白字。Ltrim函数除去字串左边的空白字,Trim函数除去字串左右两边的空白字。 |
例子:RTrim(" abc 123 ") + "456" 结果:abc123456 |
| ScriptEngine() | 传回使用中script engine的script名称。 |
例子:ScriptEngine 结果:VBScript |
| ScriptEngineBuild Version() | 传回使用中script engine的版本。 |
例子:ScriptEngine BuildVersion 结果:1125 |
| ScriptEngineMajor Version() | 传回使用中script engine的主要版本。 |
例子:ScriptEngine MajorVersion 结果:2 |
| ScriptEngineMinor Version() | 传回使用中script engine的次版本。 |
例子:ScriptEngine MinorVersion 结果:0 |
| Second(时间的字串或运算式) | 传回时间的「秒」部份。 |
例子:Second("12:30:54") 结果:54 |
| Sgn(数字或运算式) | 传回一个数字的正负符号值。若大於0则传回1,若等於0则传回0,若小於0则传回-1。 |
例子:Sgn(-5) 结果:-1 |
| Sin(数字) | 正弦值(sine)。数字为角的弧度,角度乘以(/180为弧度。结果的范围是-1到1。 |
例子:Sin(3.14159) 结果:2.6549811 |
| Space(重复次数) | 得到重复相同的空白字串。 |
例子:A"+Space(5)+"B 结果:A B A和B中间加入五个空白字。 |
| Split(字串运算式[, D[, N[, C]]]) |
将一个字串分割成一个字串阵列,以delimiter分割成各元素。与Join函数的动作恰好相反,将一个字串阵列的所有元素连接成一个字串,各元素中间以delimiter分隔之。 D:将一个字串分割成一个字串阵列时,以delimiter分割成各元素。若省略delimiter,则以空白" "分割成各元素。若delimiter为长度为0的空字串,则分割成与expression相同的一个阵列元素。 N:分割後的阵列元素数目。若设定为-1,表示依据delimiter分割成应有的阵列元素数目。 C:寻找比较的方法,C =0表二进位比较法,C =1表文字比较法,C=2表根据比较的资料型态而定,若省略C则为二进位比较法。 |
例子:Join(Split("ABC 12345 DEF")) 结果:ABC 12345 DEF 说明:字串「ABC 12345 DEF」先经Split 函数,分割成一个字串阵列,再经Join函数,将此字串阵列的所有元素连接成一个字串,结果为还原成原来的字串「ABC 12345 DEF」。 |
| Sqr(大於或等於0的数字运算式) | 平方根值。 |
例子:Sqr(3+6) 结果:3 |
| StrComp(string1, string2[, compare]) |
两字串比较。 string1为待比较的字串运算式,string2为比较的字串运算式,compare为比较的方法,compare=0表二进位比较法,compare=1表文字比较法,若省略compare则为预设的二进位比较法。 若比较的结果string1小於string2则传回-1,若string1等於string2则传回0,若string1大於string2则传回1。 |
例子:StrComp("abc", "abcd") 结果:-1 |
| String(重复次数, 待重复的字) | 得到重复相同的字串。 |
例子:String(5, 71) 结果:GGGGG |
| StrReverse(String(10, 71)) | 将一个字串顺序颠倒。 |
例子:StrReverse("ABC") 结果:CBA |
| Tan(角度) | 正切值(tangent)。结果的范围是-(/2到(/2 |
例子:Tan(3.14159) 结果:-2.6535 |
| Time() | 传回系统的时间。 |
例子:Time 结果:10:35:59 PM |
| TimeSerial(hour, minute, second) | 转换指定的(hour, minute, second)成时间变数型态。 |
例子:TimeSerial(10, 31, 59) 结果:10:31:59 |
| TimeValue(日期的字串或运算式) |
转换成时间变数型态。 日期的字串或运算式从0:00:00 (12:00:00 A.M.)到23:59:59 (11:59:59 P.M.)。 |
例子:TimeValue("11:59:59") 结果:11:59:59 |
| Trim(字串运算式) | 除去字串左右两边的空白字。Ltrim函数除去字串左边的空白字,Rtrim函数除去字串右边的空白字。 |
例子:Time Value(”11:59:59”) 结果:abc 123 |
| TypeName(变数) | 传回一个变数的类型名称。与VarType函数相同,VarType传回变数类型的代码,TypeName传回变数类型的名称。 |
例子:TypeName(3.5) 结果:Double |
| UBound(阵列的名称,[第几维]) | 传回一个阵列的维中的最大指标值。因阵列的指标值系由0编起,最大指标值Ubound为此维的大小减一,譬如LBound(A(6,4,3), 1)=5,LBound(A(6,4,3), 2)=3,LBound(A(6,4,3), 3)=2。由Lbound与Ubound函数可决定阵列的大小。 |
例子:LBound(A(6,4,3) 结果:5 |
| UCase() | 转换字串成大写。将小写字母的部份转换成大写,字串其馀的部份不变。 |
例子:UCase("abc123") 结果:ABC123 |
| VarType(变数) | 传回一个变数的类型。与TypeName函数相同,VarType传回变数类型的代码,TypeName传回变数类型的名称。 |
例子:VarType("I love you!") 结果:8 |
| Weekday(日期运算式, [FW]) |
传回星期几的数字。 FW:设定一周的第一天是星期几。若省略则表1(星期日)。Firstdayofweek设定值为0(使用NLS API设定)、1(星期日)、2(星期一)、3(星期二)、4(星期叁)、5(星期四)、6(星期五)、7(星期六)。 |
例子:Weekday("1/1/2000") 结果:7 |
| WeekDayName(W, A, FW) |
传回星期几的名称。 W:是(True)否(False)为缩写,譬如March,缩写为Mar。预设值为False。中文的星期几名称无缩写。 FW:设定一周的第一天是星期几。若省略则表1(星期日)。设定待传回星期几名称,为一周的中的第几天。 A:为0(使用NLS API设定)、1(星期日)、2(星期一)、3(星期二)、4(星期叁)、5(星期四)、6(星期五)、7(星期六)。 |
例子:Weekday("1/1/2000") 结果:星期六 |
| Year() | 传回日期的「年」部份。 例子:Year("12/1/2000") |
例子:Year("12/1/2000") 结果:2000 |