分页: 151/196 第一页 上页 146 147 148 149 150 151 152 153 154 155 下页 最后页 [ 显示模式: 摘要 | 列表 ]
Jun 25
Array()
  FUNCTION: 返回一个数组
  SYNTAX: Array(list)
  ARGUMENTS: 字符,数字均可
  EXAMPLE: <%
  Dim myArray()
  For i = 1 to 7
  Redim Preserve myArray(i)
  myArray(i) = WeekdayName(i)
  Next
  %>
  RESULT: 建立了一个包含7个元素的数组myArray
  myArray("Sunday","Monday", ... ... "Saturday")

CInt()
  FUNCTION: 将一个表达式转化为数字类型
  SYNTAX: CInt(expression)
  ARGUMENTS: 任何有效的字符均可
  EXAMPLE: <%
  f = "234"
  response.write cINT(f) + 2
  %>
  RESULT: 236
  转化字符"234"为数字"234",如果字符串为空,则返回0值

CreateObject()
  FUNCTION: 建立和返回一个已注册的ACTIVEX组件的实例。
  SYNTAX: CreateObject(objName)
  ARGUMENTS: objName 是任何一个有效、已注册的ACTIVEX组件的名字.
  EXAMPLE: <%
  Set con = Server.CreateObject("ADODB.Connection")
  %>
  RESULT:

CStr()
  FUNCTION: 转化一个表达式为字符串.
  SYNTAX: CStr(expression)
  ARGUMENTS: expression 是任何有效的表达式。
  EXAMPLE: <%
  s = 3 + 2
  response.write "The result is: " & cStr(s)
  %>
  RESULT: 转化数字“5”为字符“5”。

Date()
  FUNCTION: 返回当前系统日期.
  SYNTAX: Date()
  ARGUMENTS: None.
  EXAMPLE: <%=Date%>
  RESULT: 8/4/99

DateAdd()
  FUNCTION: 返回一个被改变了的日期。
  SYNTAX: DateAdd(timeinterval,number,date)
  ARGUMENTS: timeinterval is the time interval to add; number is amount of time intervals to add; and date is the starting date.
  EXAMPLE: <%
  currentDate = #8/4/99#
  newDate = DateAdd("m",3,currentDate)
  response.write newDate
  %>

  <%
  currentDate = #12:34:45 PM#
  newDate = DateAdd("h",3,currentDate)
  response.write newDate
  %>
  RESULT: 11/4/99
  3:34:45 PM

  "m" = "month";
  "d" = "day";

  If currentDate is in time format then,
  "h" = "hour";
  "s" = "second";

DateDiff()
  FUNCTION: 返回两个日期之间的差值 。
  SYNTAX: DateDiff(timeinterval,date1,date2 [, firstdayofweek [, firstweekofyear>>)
  ARGUMENTS: timeinterval 表示相隔时间的类型,如“M“表示“月”。
  EXAMPLE: <%
  fromDate = #8/4/99#
  toDate = #1/1/2000#
  response.write "There are " & _
  DateDiff("d",fromDate,toDate) & _
  " days to millenium from 8/4/99."
  %>
  RESULT: 从8/4/99 到2000年还有 150 天.

Day()
  FUNCTION: 返回一个月的第几日 .
  SYNTAX: Day(date)
  ARGUMENTS: date 是任何有效的日期。
  EXAMPLE: <%=Day(#8/4/99#)%>
  RESULT: 4

FormatCurrency()
  FUNCTION: 返回表达式,此表达式已被格式化为货币值
  SYNTAX: FormatCurrency(Expression [, Digit [, LeadingDigit [, Paren [, GroupDigit>>>>)
  ARGUMENTS: Digit 指示小数点右侧显示位数的数值。默认值为 -1,指示使用的是计算机的区域设置;   LeadingDigit 三态常数,指示是否显示小数值小数点前面的零。
  EXAMPLE: <%=FormatCurrency(34.3456)%>
  RESULT: $34.35

FormatDateTime()
  FUNCTION: 返回表达式,此表达式已被格式化为日期或时间
  SYNTAX: FormatDateTime(Date, [, NamedFormat>)
  ARGUMENTS: NamedFormat 指示所使用的日期/时间格式的数值,如果省略,则使用 vbGeneralDate.
  EXAMPLE: <%=FormatDateTime("08/4/99", vbLongDate)%>
  RESULT: Wednesday, August 04, 1999

FormatNumber()
  FUNCTION: 返回表达式,此表达式已被格式化为数值.
  SYNTAX: FormatNumber(Expression [, Digit [, LeadingDigit [, Paren [, GroupDigit>>>>)
  ARGUMENTS: Digit 指示小数点右侧显示位数的数值。默认值为 -1,指示使用的是计算机的区域设置。; LeadingDigit i指示小数点右侧显示位数的数值。默认值为 -1,指示使用的是计算机的区域设置。; Paren 指示小数点右侧显示位数的数值。默认值为 -1,指示使用的是计算机的区域设置。; GroupDigit i指示小数点右侧显示位数的数值。默认值为 -1,指示使用的是计算机的区域设置。.
  EXAMPLE: <%=FormatNumber(45.324567, 3)%>
  RESULT: 45.325

FormatPercent()
  FUNCTION: 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 (%)
  SYNTAX: FormatPercent(Expression [, Digit [, LeadingDigit [, Paren [, GroupDigit>>>>)
  ARGUMENTS: 同上.
  EXAMPLE: <%=FormatPercent(0.45267, 3)%>
  RESULT: 45.267%

Hour()
  FUNCTION: 以24时返回小时数.
  SYNTAX: Hour(time)
  ARGUMENTS:
  EXAMPLE: <%=Hour(#4:45:34 PM#)%>
  RESULT: 16
  (Hour has been converted to 24-hour system)

Instr()
  FUNCTION: 返回字符或字符串在另一个字符串中第一次出现的位置.
  SYNTAX: Instr([start, > strToBeSearched, strSearchFor [, compare>)
  ARGUMENTS: Start为搜索的起始值,strToBeSearched接受搜索的字符串 strSearchFor要搜索的字符compare 比较方式(详细见ASP常数)
  EXAMPLE: <%
  strText = "This is a test!!"
  pos = Instr(strText, "a")
  response.write pos
  %>
  RESULT: 9

InstrRev()
  FUNCTION: 同上,只是从字符串的最后一个搜索起
  SYNTAX: InstrRev([start, > strToBeSearched, strSearchFor [, compare>)
  ARGUMENTS: 同上.
  EXAMPLE: <%
  strText = "This is a test!!"
  pos = InstrRev(strText, "s")
  response.write pos
  %>
  RESULT: 13

Int()
  FUNCTION: 返回数值类型,不四舍五入。
  SYNTAX: Int(number)
  ARGUMENTS:
  EXAMPLE: <%=INT(32.89)%>
  RESULT: 32

IsArray()
  FUNCTION: 判断一对象是否为数组,返回布尔值 .
  SYNTAX: IsArray(name)
  ARGUMENTS:
  EXAMPLE: <%
  strTest = "Test!"
  response.write IsArray(strTest)
  %>
  RESULT: False

IsDate()
  FUNCTION: 判断一对象是否为日期,返回布尔值
  SYNTAX: IsDate(expression)
  ARGUMENTS: expression is any valid expression.
  EXAMPLE: <%
  strTest = "8/4/99"
  response.write IsDate(strTest)
  %>
  RESULT: True

IsEmpty()
  FUNCTION: 判断一对象是否初始化,返回布尔值.
  SYNTAX: IsEmpty(expression)
  ARGUMENTS:
  EXAMPLE: <%
  Dim i
  response.write IsEmpty(i)
  %>
  RESULT: True

IsNull()
  FUNCTION: 判断一对象是否为空,返回布尔值.
  SYNTAX: IsNull(expression)
  ARGUMENTS:
  EXAMPLE: <%
  Dim i
  response.write IsNull(i)
  %>
  RESULT: False

IsNumeric()
  FUNCTION: 判断一对象是否为数字,返回布尔值.
  SYNTAX: IsNumeric(expression)
  ARGUMENTS:
  EXAMPLE: <%
  i = "345"
  response.write IsNumeric(i)
  %>
  RESULT: True
  就算数字加了引号,ASP还是认为它是数字。

IsObject()
  FUNCTION: 判断一对象是否为对象,返回布尔值.
  SYNTAX: IsObject(expression)
  ARGUMENTS:
  EXAMPLE: <%
  Set con = Server.CreateObject("ADODB.Connection")
  response.write IsObject(con)
  %>
  RESULT: True

LBound()
  FUNCTION: 返回指定数组维的最小可用下标.
  SYNTAX: Lbound(arrayname [, dimension>)
  ARGUMENTS: dimension 指明要返回哪一维下界的整数。使用 1 表示第一维,2 表示第二维,以此类  推。如果省略 dimension 参数,默认值为 1.
  EXAMPLE: <%
  i = Array("Monday","Tuesday","Wednesday")
  response.write LBound(i)
  %>
  RESULT: 0
Jun 25
三、JavaScript中正则表达式的使用
  在JavaScript 1.2版以后,JavaScript也支持正则表达式。
  1、replace
  replace在一个字符串中通过正则表达式查找替换相应的内容。replace并不改变原来的字符串,只是重新生成了一个新的字符串。如果需要执行全局查找或忽略大小写,那么在正则表达式的最后添加g和i。
例:
<SCRIPT>
re = /apples/gi;
str = "Apples are round, and apples are juicy.";
newstr=str.replace(re, "oranges");
document.write(newstr)
</SCRIPT>
结果是:"oranges are round, and oranges are juicy."
例:
<SCRIPT>
str = "Twas the night before Xmas...";
newstr=str.replace(/xmas/i, "Christmas");
document.write(newstr)
</SCRIPT>
结果是:"Twas the night before Christmas..."
例:
<SCRIPT>
re = /(\w+)\s(\w+)/;str = "John Smith";
newstr = str.replace(re, "$2, $1");
document.write(newstr)
</SCRIPT>
结果是:"Smith, John".
  2、search
search通过正则表达式查找相应的字符串,只是判断有无匹配的字符串。如果查找成功,search返回匹配串的位置,否则返回-1。
search(regexp)
<SCRIPT>
function testinput(re, str){
if (str.search(re) != -1)
midstring = " contains ";
else
midstring = " does not contain ";
document.write (str + midstring + re.source);
}
testinput(/^[1-9]/i,"123")
</SCRIPT>
  3、match
  match方法执行全局查找,查找结果存放在一个数组里。
例一:
<SCRIPT>
str = "For more information, see Chapter 3.4.5.1";
re = /(chapter \d+(\.\d)*)/i;
found = str.match(re);
document.write(found);
</SCRIPT>
显示结果:Chapter 3.4.5.1,Chapter 3.4.5.1,.1
例二:
<SCRIPT>
str = "abcDdcba";
newArray = str.match(/d/gi);
document.write(newArray);
</SCRIPT>
显示结果D, d.

  四、示例
1 、判断数字的正确性
<%@ Language=VBScript %>
<script language="javascript" runat="server">
function isNumeric(strNumber) {
return (strNumber.search(/^(-|\+)?\d+(\.\d+)?$/) != -1);
}
function isUnsignedNumeric(strNumber) {
return (strNumber.search(/^\d+(\.\d+)?$/) != -1);
}
function isInteger(strInteger) {
return (strInteger.search(/^(-|\+)?\d+$/) != -1);
}
function isUnsignedInteger(strInteger) {
return (strInteger.search(/^\d+$/) != -1);
}
</script>
<HTML>
<BODY>
<b>判断数字的正确性</b>
<%
Dim strTemp
strTemp = CStr(Request.Form("inputstring"))
If strTemp = "" Then strTemp = "0"
%>
<TABLE BORDER="1" CELLPADDING="4" CELLSPACING="2">
<TR>
<TD ALIGN="right"><B>原始字符串</B></TD>
<TD><%= strTemp %></TD>
</TR>
<TR>
<TD ALIGN="right"><B>数字</B></TD>
<TD><%=isNumeric(strTemp)%></TD>
</TR>
<TR>
<TD ALIGN="right"><B>非负数字</B></TD>
<TD><%=isUnsignedNumeric(strTemp)%></TD>
</TR>
<TR>
<TD ALIGN="right"><B>整数</B></TD>
<TD><%=isInteger(strTemp)%></TD>
</TR>
<TR>
<TD ALIGN="right"><B>非负整数()</B></TD>
<TD><%=isUnsignedInteger(strTemp)%></TD>
</TR>
</TABLE>
<FORM ACTION="<%=Request.ServerVariables("SCRIPT_NAME")%>" METHOD="post">
请输入一个数字:<BR>
<INPUT TYPE="text" NAME="inputstring" SIZE="50"></INPUT><BR>
<INPUT TYPE="submit" Value="提交"></INPUT><BR>
</FORM>
</BODY>
</HTML>
2、判断Email地址的正确性
<%
Function isemail(strng)
isemail = false
Dim regEx, Match
Set regEx = New RegExp
regEx.Pattern = "^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$"
regEx.IgnoreCase = True
Set Match = regEx.Execute(strng)
if match.count then isemail= true
End Function
%>

  五、总结
  上面我们介绍了正则表达式的基本概念,以及在VBScript和JavaScript中如何使用正则表达式,同时,通过一些实例让大家有了感性的认识。正则表达式的应用范围很广,能为大家解决很多实际中的问题。本文介绍的内容只是一些初步的知识,还有很多语法规则需要大家继续学习,在实践中发现问题,解决问题。
Jun 25
 一、正则表达式概述
  如果原来没有使用过正则表达式,那么可能对这个术语和概念会不太熟悉。不过,它们并不是您想象的那么新奇。
  请回想一下在硬盘上是如何查找文件的。您肯定会使用 ? 和 * 字符来帮助查找您正寻找的文件。? 字符匹配文件名中的单个字符,而 * 则匹配一个或多个字符。一个如 'data?.dat' 的模式可以找到下述文件:data1.dat、data2.dat等等。如果使用 * 字符代替 ? 字符,则将扩大找到的文件数量。'data*.dat' 可以匹配下述所有文件名:data.dat、data1.dat、data12.dat等等,尽管这种搜索文件的方法肯定很有用,但也十分有限。? 和 * 通配符的有限能力可以使你对正则表达式能做什么有一个概念,不过正则表达式的功能更强大,也更灵活。
  在我们编写ASP程序时,经常会判断一个字符串的有效性,如;一个串是否是数字、是否是有效的Email地址等等。如果不使用正则表达式,那么判断的程序会很长,并且容易出错,如果使用正则表达式,这些判断就是一件很轻松的工作了。后面我们将介绍如何判断数字和Email地址的有效性。
  在典型的搜索和替换操作中,必须提供要查找的确切文字。这种技术对于静态文本中的简单搜索和替换任务可能足够了,但是由于它缺乏灵活性,因此在搜索动态文本时就有困难了,甚至是不可能的。
  使用正则表达式,能完成些什么事情呢?
  测试字符串的某个模式。例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式。这称为数据有效性验证。
  替换文本。可以在文档中使用一个正则表达式来标识特定文字,然后可以全部将其删除,或者替换为别的文字。
  根据模式匹配从字符串中提取一个子字符串。可以用来在文本或输入字段中查找特定文字。
  例如,如果需要搜索整个 web 站点来删除某些过时的材料并替换某些HTML 格式化标记,则可以使用正则表达式对每个文件进行测试,看在该文件中是否存在所要查找的材料或 HTML 格式化标记。用这个方法,就可以将受影响的文件范围缩小到包含要删除或更改的材料的那些文件。然后可以使用正则表达式来删除过时的材料,最后,可以再次使用正则表达
式来查找并替换那些需要替换的标记。
  那么,正则表达式语法的语法是如何呢?
  一个正则表达式就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文
字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
  这里有一些可能会遇到的正则表达式示例:
  /^[ ]*$/ &#34;^[ ]*$&#34; 匹配一个空白行。
  /d{2}-d{5}/ &#34;d{2}-d{5}&#34; 验证一个ID 号码是否由一个2位数字,一个连字符以及一个5位数字组成。
  /<(.*)>.*</1>/ &#34;<(.*)>.*</1>&#34; 匹配一个 HTML 标记。

  二、正则表达式在VBScript中的应用
  VBScript使用RegExp对象、Matches集合以及Match对象提供正则表达式支持功能。我们还是先看一个例子。
<%
Function RegExpTest(patrn, strng)
Dim regEx, Match, Matches   '建立变量。
Set regEx = New RegExp   '建立正则表达式。
regEx.Pattern = patrn  '设置模式。
regEx.IgnoreCase = True   '设置是否区分字符大小写。
regEx.Global = True   '设置全局可用性。
Set Matches = regEx.Execute(strng)  '执行搜索。
For Each Match in Matches  '遍历匹配集合。
RetStr = RetStr &amp; &#34;Match found at position &#34;
RetStr = RetStr &amp; Match.FirstIndex &amp; &#34;. Match Value is '&#34;
RetStr = RetStr &amp; Match.Value &amp; &#34;'.&#34; &amp; &#34;<BR>&#34;
Next
RegExpTest = RetStr
End Function
response.write RegExpTest(&#34;[ij]s.&#34;, &#34;IS1 Js2 IS3 is4&#34;)
%>
在这个例子中,我们查找字符串中有无is或者js这两个词,忽略大小写。运行的结果如下:
Match found at position 0. Match Value is 'IS1'.
Match found at position 4. Match Value is 'Js2'.
Match found at position 8. Match Value is 'IS3'.
Match found at position 12. Match Value is 'is4'.
下面我们就介绍这三个对象和集合。
  1、RegExp对象 是最重要的一个对象,它有几个属性,其中:
  ○Global 属性,设置或返回一个 Boolean 值,该值指明在整个搜索字符串时模式是全部匹配还是只匹配第一个。如果搜索应用于整个字符串,Global 属性的值为 True,否则其值为 False。默认的设置为 False。
  ○IgnoreCase 属性,设置或返回一个Boolean值,指明模式搜索是否区分大小写。如果搜索是区分大小写的,则IgnoreCase 属性为 False;否则为 True。缺省值为 False。
  ○Pattern 属性,设置或返回被搜索的正则表达式模式。必选项。总是一个 RegExp 对象变量。
  2、Match 对象
  匹配搜索的结果是存放在Match对象中,提供了对正则表达式匹配的只读属性的访问。 Match 对象只能通过 RegExp 对象的 Execute 方法来创建,该方法实际上返回了 Match 对象的集合。所有的 Match 对象属性都是只读的。在执行正则表达式时,可能产生零个或多个 Match 对象。每个 Match 对象提供了被正则表达式搜索找到的字符串的访问、字符串的长度,以及找到匹配的索引位置等。
  ○FirstIndex 属性,返回在搜索字符串中匹配的位置。FirstIndex 属性使用从零起算的偏移量,该偏移量是相对于
搜索字符串的起始位置而言的。换言之,字符串中的第一个字符被标识为字符 0
  ○Length 属性,返回在字符串搜索中找到的匹配的长度。
  ○Value 属性,返回在一个搜索字符串中找到的匹配的值或文本。
  3、Matches 集合
  正则表达式 Match 对象的集合。Matches 集合中包含若干独立的 Match 对象,只能使用 RegExp 对象的 Execute 方法来创建之。与独立的 Match 对象属性相同,Matches `集合的一个属性是只读的。在执行正则表达式时,可能产生零个或多个 Match 对象。每个 Match 对象都提供了与正则表达式匹配的字符串的访问入口、字符串的长度,以及标识匹配位置的索引。
  学习了这三个对象和集合,如何应用于字符串的判断和替换呢?regExp对象的三个方法正好解决了这个问题,它们是Replace方法、Test方法和Execute方法。
  1、Replace 方法
  替换在正则表达式查找中找到的文本。我们还是先看个例子:下面的例子说明了 Replace 方法的用法。
<%
Function ReplaceTest(patrn, replStr)
Dim regEx, str1 ' 建立变量。
str1 = &#34;The quick brown fox jumped over the lazy dog.&#34;
Set regEx = New RegExp ' 建立正则表达式。
regEx.Pattern = patrn ' 设置模式。
regEx.IgnoreCase = True ' 设置是否区分大小写。
ReplaceTest = regEx.Replace(str1, replStr) ' 作替换。
End Function
Response.write ReplaceTest(&#34;fox&#34;, &#34;cat&#34;) &amp; &#34;<BR>&#34; ' 将 'fox' 替换为 'cat'。
Response.write ReplaceTest(&#34;(S+)(s+)(S+)&#34;, &#34;$3$2$1&#34;) ' 交换词对.
%>
  2、Test 方法
  对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。正则表达式搜索的实际模式是通过RegExp对象的Pattern属性来设置的。RegExp.Global属性对Test方法没有影响。
  如果找到了匹配的模式,Test方法返回True;否则返回False。下面的代码说明了Test 方法的用法。
<%
Function RegExpTest(patrn, strng)
Dim regEx, retVal ' 建立变量。
Set regEx = New RegExp ' 建立正则表达式。
regEx.Pattern = patrn ' 设置模式。
regEx.IgnoreCase = False ' 设置是否区分大小写。
retVal = regEx.Test(strng) ' 执行搜索测试。
If retVal Then
RegExpTest = &#34;找到一个或多个匹配。&#34;
Else
RegExpTest = &#34;未找到匹配。&#34;
End If
End Function
Response.write RegExpTest(&#34;is.&#34;, &#34;IS1 is2 IS3 is4&#34;)
%>
  3、Execute 方法
  对指定的字符串执行正则表达式搜索。正则表达式搜索的设计模式是通过 RegExp 对象的 Pattern 来设置的。
  Execute 方法返回一个 Matches 集合,其中包含了在 string 中找到的每一个匹配的 Match 对象。如果未找到匹配,Execute 将返回空的 Matches 集合。

Jun 25
 技巧 21:启用浏览器和代理缓存
默认情况下,ASP 禁用浏览器和代理中的缓存。这将很有意义,因为 ASP 生来就是动态的,具有潜在地对时间敏感的信息。如果有一个不需要对每次查看进行刷新的页,则应该启用浏览器和代理缓存。这使得浏览器和代理能在某一段时间内,使用某一页的缓存副本,这时间的长短可以控制。缓存能明显减轻服务器负荷,使用户的感受好一些。
哪种动态页可以缓存?举例说明:
天气页,每 5 分钟更新一次。
列出新闻的主页或新闻发布的主页,每天更新 2 次。
公共基金运营列表,基本的统计数小时更新 1 次。
请注意,使用浏览器或代理缓存,只有很少的命中被记录到 Web 服务器上。如果想精确测量所有页面查看或者张贴广告,也许不喜欢使用浏览器和代理缓存。
浏览器缓存是由 Web 服务器发往浏览器的 HTTP 截至期限标题控制的。ASP 提供了两种发送标题的机制。要将页面设置为在未来某个分钟数后过期,请设置 Response.Expires 属性。以下的例子通知浏览器:内容在 10 分钟后过期:
<% Response.Expires = 10 %>
设置 Response.Expires 为负数或 0 则禁用缓存。一定要使用较大的负数,例如 -1000 (大于一天),来克服服务器时钟和浏览器时钟之间的差异。第二个属性 Response.ExpiresAbsolute,允许设置内容过期的指定时间:
<% Response.ExpiresAbsolute = #May 31,2001 13:30:15# %>
如果不想使用 Response 对象设置过期时间,可以将 <META> 标记写入 HTML,通常写在 HTML 文件的 <HEAD> 内部。一些浏览器会响应这条指令,但代理不会。
<META HTTP-EQUIV="Expires" VALUE="May 31,2001 13:30:15">
最后,可以标识内容对 HTTP 代理缓存是否有效,请使用 Response.CacheControl 属性。设置属性为“Public”,允许代理缓存内容。
<% Response.CacheControl = "Public" %>
默认情况下,该属性设置为“Private”。注意,不应当为显示某用户专用数据的页启用代理缓存,因为代理也许为属于其他用户的用户页面服务。

技巧 22:尽可能使用 Server.Transfer 替代 Response.Redirect
Response.Redirect 通知浏览器,请求一个不同的页面。该函数经常用于重定向用户到登录或错误页面。既然重定向强制一个新页请求,浏览器就必须做两次到 Web 服务器的往返,而且 Web 服务器必须处理额外的请求。IIS 5.0 引入一个新的函数,Server.Transfer,该函数执行传送到相同服务器上的不同 ASP 页。这样避免了额外的、从浏览器到 Web 服务器的往返,从而改善了整体系统性能,同时改善了对用户的响应时间。请查看重定向中的新方向(英文),它讨论了 Server.Transfer 和 Server.Execute。
也可以查看Leveraging ASP in IIS 5.0中有关 IIS 5.0 和 ASP 3.0 新功能的完全列表。(英文)

技巧 23:在目录 URL 尾部加斜线
相关的技巧是,一定要定在指向目录的 URL 尾部加斜线 (/)。如果省略了斜线,浏览器将向服务器提出请求,仅通知它正寻找一个目录。然后浏览器发出第二个请求,在 URL 末尾添加斜线,然后服务器将那个目录的默认文档作为响应,或者如果没有默认文档并且目录浏览已被启用,就以目录列表作为响应。添加了斜线便省去了第一个没用的往返。出于对用户的友好,也许想要在显示的名称的末尾省略斜线。
例如,写:
<a href="http://msdn.microsoft.com/workshop/" title="MSDN Web
Workshop">http://msdn.microsoft.com/workshop</a>
它还适用于指向在 Web 站点主页的 URL:请使用下面的: <a href="http://msdn.microsoft.com/">,不要用 <a href="http://msdn.microsoft.com">.

技巧 24:避免使用服务器变量
访问服务器变量将引起 Web 站点向服务器提出特殊的请求,然后收集所有的服务器变量,并不止是需要的那个。这好像从发霉的阁楼中的文件夹中检索某条特殊的信息一样。当想要某条信息时,在访问该信息之前必须先上阁楼取得文件夹。这与请求服务器变量时,性能访问出现第一次请求服务器变量所发生的一样。后续的对其他服务器变量的访问不会引起性能访问。
从不访问不合格的 Request 对象(例如,Request("Data"))。对于不在 Request.Cookies、Request.Form、Request.QueryString 或 Request.ClientCertificate 中的项,有对 Request.ServerVariables 的隐含调用。Request.ServerVariables 集合比其他集合慢很多。

技巧 25:升级为最新的和最好的版本
系统组件常常升级,建议升级为最新的和最好的版本。最好升级到 Windows 2000(还有,IIS 5.0、ADO 2.5、MSXML 2.5、Internet Explorer 5.0、VBScript 5.1 和 JScript 5.1)。IIS 5.0 和 ADO 2.5 在多处理器计算机上实现了非常好的性能。在 Windows 2000 下,ASP 能良好地扩展到四个处理器或者更多,但是在 IIS 4.0,ASP 不能扩展为超过两个处理器。在应用程序中使用的脚本和 ADO 越多,升级到 Windows 2000 后获得的性能提高就越大。
如果您还无法升级到 Windows 2000 ,可以升级为最新版本的 SQL Server、ADO、VBScript 和 JScript、MSXML、Internet Explorer 和 NT 4 Service Packs。它们都改进了性能并增强了可靠性。

技巧 26:调整 Web 服务器
有许多 IIS 调节参数可以改进站点性能。例如,使用 IIS 4.0,我们经常发现增加 ASP 的 ProcessorThreadMax 参数(请参阅 IIS 文档)能获得很大的好处,尤其是在经常等待后端资源,例如数据库或其他中间层产品,例如 screen-scrapers,的站点上。在 IIS 5.0 中也许会发现,打开 ASP Thread Gating 比试图为 AspProcessorThreadMax 找一个最佳的设置更为有效。
下面的调整 IIS(英文),是一篇很好的资料。
最佳的配置取决于(在其他因素中)应用程序代码、在其上运行的硬件以及客户端的工作负荷。发现最佳设置的唯一方法是运行性能测试,它将我们带入下一个技巧。

技巧 27:进行性能测试
如上所述,性能是一种指标。如果您正努力改进站点的性能,请先设置性能目标,然后提高性能直到达到目标为止。请不要将所有的性能测试放在项目的最后。往往到了项目的最后,再做非做不可的体系结构改动已为时太晚,并使客户失望。性能测试是日常测试的一部分。性能测试可以针对独立组件进行,例如 ASP 页面或 COM 对象,也可以将站点作为一个整体进行。
许多人使用单一的浏览器请求页面来测试他们 Web 站点的性能。这将使您对站点的响应有很好的感觉,但对于站点在有负荷下的性能却一无所知。
通常,要准确地测量性能,需要专用的测试环境。这个环境应该由那些,在处理器速度、处理器个数、内存、硬盘、网络配置等方面,能模拟产品硬件的硬件组成。然后,需要定义客户端的工作负荷:有多少并发用户;他们提出请求的频率;他们将访问的页面类型等等。如果您无法从站点获得实际的使用数据,则需要估计它们。最后,需要一个能模拟预期客户端工作负荷的工具。在这些工具的帮助下,可以开始回答一些问题,例如,如果我有 N 个并发用户,需要多少台服务器?您还能找出瓶颈和优化的目标。
下面列出了一些好的 Web 强度测试工具。极力推荐“Microsoft Web 应用程序强度测试 (WAS)”工具包。WAS 允许记录测试脚本,然后模拟成百或上千个访问 Web 服务器的用户。WAS 报告大量统计结果,包括每秒请求数、响应时间的分布和错误计数。WAS 具有增强客户端和基于 Web 的接口;Web 接口允许进行远程测试。
请务必阅读 IIS 5.0 调试指南(英文)。
Jun 25
技巧 16:在开始长时间的任务之前先使用 Response.IsClientConnected
  如果用户失去耐心,他们可以在开始执行他们的请求之前放弃 ASP 页。如果他们单击了 Refresh 或跳转到服务器的其他页上,在 ASP 请求队列的末尾将有一个新的请求,而在队列的中间有一个断开连接的请求。这通常发生在服务器处于高负荷的情况下(它有一个很长的请求队列,相应的响应时间也很长),这只能使情况更糟。如果用户不再连接,将没有执行 ASP 页的点(特别是低速、重量级的 ASP 页)。可以使用 Response.IsClientConnected 属性检查这种情况。如果它返回 False,则应调用 Response.End 并放弃该页的剩余内容。实际上,每当 ASP 要执行新的请求时,IIS 5.0 便将该方法编码,来检查队列中的请求有多长。如果在那里超过了 3 秒钟,ASP 会检查客户是否仍然连接着,如果客户已断开连接,就立即结束该请求。您可以使用 metabase 中的 AspQueueConnectionTestTime 设置,调整这 3 秒的超时时间。
  如果有某页执行了很长时间,您可能还想按一定的时间间隔检查 Response.IsClientConnected。在启用响应缓冲之后,按一定的时间间隔执行 Response.Flush,告诉用户正在进行的是哪些事情,是个好办法。
  注意 在 IIS 4.0 中,Response.IsClientConnected 将不能正常工作,除非首先执行 Response.Write。如果启用了缓冲,也需要执行 Response.Flush。在 IIS 5.0 中则不必如此 - Response.IsClientConnected 工作得很好。在任何情况下,Response.IsClientConnected 都要有些开销,所以,只有在执行至少要用 500 毫秒(如果想维持每秒几十页的吞吐量,这是一个很长的时间了)的操作前才使用它。作为通常的规则,不要在紧密循环的每次迭代中调用它,例如当绘制表中的行,可能每 20 行或每 50 行调用一次。
  
  技巧 17:使用 <OBJECT> 标记实例化对象
  如果需要引用不能在所有代码路径中使用的对象(尤其是服务器 - 或应用程序 - 作用域的对象),则使用 Global.asa 中的 <object runat=server id=objname> 标记来声明它们,而不是使用 Server.CreateObject 方法。Server.CreateObject 立刻创建对象。如果以后不使用那个对象,就不要浪费资源。<object id=objname> 标记声明了 objname,但实际上 objname 此时并没有创建,直到它的方法或属性第一次被使用时才创建。
  这是迟缓计算的另一个例子。
  
  技巧 18:使用 ADO 对象和其他组件的 TypeLib 声明
  当使用 ADO 时,开发人员经常包含 adovbs.txt 来获得对 ADO 不同常量的访问权。该文件必须包含在要使用这些常量的每一页中。该常量文件非常大,给每个 ASP 页增加了很多编译时间和脚本大小方面的开销。
  IIS 5.0 提供了绑定到组件类型库的能力。允许您在每个 ASP 页上引用一次类型库并使用它。每页不需要为编译常量文件付出代价,并且组件开发人员不必为在 ASP 中的使用而生成 VBScript #include 文件。
  要访问 ADO 类型库,请将下列语句之一放入 Global.asa 中。
  <!-- METADATA NAME="Microsoft ActiveX Data Objects 2.5 Library" TYPE="TypeLib" UUID="{00000205-0000-0010-8000-00AA006D2EA4}" -->
  或者
  <!-- METADATA TYPE="TypeLib" FILE="C:\Program Files\Common Files\system\ado\msado15.dll" -->
  
  技巧 19:利用浏览器的验证能力
  流行的浏览器具有对以下功能的高级支持,例如 XML、DHTML、Java 小程序以及远程数据服务。请尽量利用这些功能。所有这些技术,都可以通过执行客户端的验证和数据缓存,减少了与 Web 服务器之间的往返。如果您正在运行智能浏览器,该浏览器可以为您进行一些验证(例如,在运行 POST 之前检查信用卡的校验和否有效)。重申一次,请尽量使用这些功能。由于削减了客户端到服务器的往返路程,将减少对 Web 服务器的压力,并且削减了网络通信量(虽然发送给浏览器的初始页面可能更大),服务器访问的所有后端资源也削减了。而且用户不必经常提取新页,使用户的感受好一些。这并不减轻对服务器端验证的需要。还是应该经常进行服务器端的验证。这样能够防止由于某些原因从客户端来的坏数据,例如黑客,或者不运行客户端验证程序的浏览器。
  许多站点由独立于浏览器创建的 HTML 组成。这一点经常阻碍开发人员利用可以提高性能的流行浏览器功能。对于真正高性能的、必须关心浏览器的站点,良好的策略是针对流行的浏览器优化您的页面。在 ASP 中使用“浏览器性能组件”,很容易检测到浏览器的功能。诸如 Microsoft FrontPage 等工具,能帮助您设计使用所希望的目标浏览器和 HTML 版本的代码。更详细的讨论,请查看 When is Better Worse? Weighing the Technology Trade-Offs(英文)。
  
  技巧 20:在循环中避免字符串串联
  许多人在循环中创建类似这样的字符串:
  s = "<table>" & vbCrLf
  For Each fld in rs.Fields
   s = s & " <th>" & fld.Name & "</th> "
  Next
  While Not rs.EOF
   s = s & vbCrLf & " <tr>"
   For Each fld in rs.Fields
   s = s & " <td>" & fld.Value & "</td> "
   Next
   s = s & " </tr>"
   rs.MoveNext
  Wend
  s = s & vbCrLf & "</table>" & vbCrLf
  Response.Write s
  这种方法有几个问题。首先,重复连接字符串所花费的时间,以二次方曲线的速率增长;粗略地计算,运行循环所花费的时间,与记录数乘以字段数的平方成正比。举一个简单的例子,便能清楚地说明这一点。
  s = ""
  For i = Asc("A") to Asc("Z")
   s = s & Chr(i)
  Next
  在第一次迭代中,得到一个字符的字符串“A”。在第二次迭代中,VBScript 必须重新分配字符串并复制两个字符“AB”到 s。在第三次迭代中,它必须再次重新分配 s,并复制三个字符到 s。在第 N 次(26 次)迭代中,它必须重新分配并复制 N 个字符到 s。就是 1+2+3+...+N 的和,为 N*(N+1)/2 次复制。
  在以上记录集的例子中,如果有 100 条记录和 5个字段,则内部的循环将执行 100*5 = 500 次,并且完成所有复制和重新分配所花费时间,将与 500*500 = 250,000 成正比。对一个大小适度的记录集,将有很多次复制。
  在该例子中,代码可以改进:字符串的连接将被 Response.Write() 或内嵌脚本 (<% = fld.Value %>) 所替代。如果打开响应缓冲,这个操作将会很快,因为 Response.Write 仅仅将数据添加到响应缓冲的末尾。不再重新分配,因而非常有效。
  特别是在将 ADO 记录集转换到 HTML 表时,请考虑使用 GetRows 或 GetString。
  如果用 JScript 连接字符串,强烈建议使用 += 操作符;即用 s += "某字符串", 而不是 s = s + "某字符串"。
分页: 151/196 第一页 上页 146 147 148 149 150 151 152 153 154 155 下页 最后页 [ 显示模式: 摘要 | 列表 ]