ASP精华

2020 年 4 月 29 日2050

收集:TTXS(Fcbu.Com)  

来源:互联网  

时间:2006-06-25 

[视频>如何调试跟踪ASP程序

很多初学者在调试ASP程序的时候不知道如何跟踪,一看见”该页无法显示“、”内部服务器错误”就没招了。

其实,我们可以利用调试工具来查看具体出错原因,并可以在不改变源代码的情况下控制程序的执行流程。

为此,特意做了一个简单的视频教程,有兴趣的朋友可以看一下:

在线观看:http://http://www.zjjv.com///asp/aspdebug.htm

相关文件:(如果在线看很慢的话,把以下文件下载下来,然后双击aspdebug.htm即可)

1. http://http://www.zjjv.com///asp/aspdebug.htm

2. http://http://www.zjjv.com///asp/aspdebug.swf

3. http://http://www.zjjv.com///asp/aspdebug_config.xml

4 .http://http://www.zjjv.com///asp/aspdebug_controller.swf   

ASP漏洞分析和解决方法

ASP漏洞分析和解决方法(1)

有人说一台不和外面联系的电脑是最安全的电脑,一个关闭所有端口,不提供任何服务的电脑也是最安全的。黑客经常利用我们所开放的端口实施攻击,这些攻击最常见的是DDOS(拒绝服务攻击).

下面我会列出ASP的二十几个漏洞,每个漏洞都会有漏洞描述和解决方法。

1 在ASP程序后加个特殊符号,能看到ASP源程序 

 受影响的版本:  win95 pws  IIS3.0  98 pws4 不存在这个漏洞。  IIS4.0以上的版本也不存在这个漏洞。 

 问题描述:  这些特殊符号包括小数点,, ::$DATA。

比如:http://someurl/somepage.asp.http:// someurl/somepage.asp乭ttp:// someurl/somepage.asp::$DATAhttp:// someurl/somepage.asp .http:// someurl/somepage .Asphttp:// someurl/somepage.%asp http:// someurl/somepage.asp .http://someurl/msadc/samples/selector/showcode.asp?source=/msadc/samples/../../../../../../boot.ini (可以看到boot.ini的文件内容)  

那么在安装有IIS3.0和win95 PWS的浏览中就很容易看到somepage.asp的源程序。究竟是什么原因造成了这种可怕的漏洞呢?究其根源其实是 Windows NT 特有的文件系统在做怪。

有一点常识的人都知道在 NT 提供了一种完全不同于 FAT 的文件系统:NTFS,这种被称之为新技术文件系统的技术使得 NT 具有了较高的安全机制,但也正是因为它而产生了不少令人头痛的隐患。大家可能不知道, NTFS 支持包含在一个文件中 的多数据流,而这个包含了所有内容的主数据流被称之为"DATA",因此使得在浏览器 里直接访问 NTFS 系统的这个特性而轻易的捕获在文件中的脚本程序成为了可能。然而 直接导致 ::$DATA 的原因是由于 IIS 在解析文件名的时候出了问题,它没有很好地规范文件名。 

 解决方法和建议:  如果是Winodws NT用户,安装IIS4.0或者IIS5.0,Windows2000不存在这个问题。如果是win95用户,安装WIN98和PWS4.0。2 ACCESS mdb 数据库有可能被下载的漏洞  

问题描述:  在用ACCESS做后台数据库时,如果有人通过各种方法知道或者猜到了服务器的ACCESS数据库的路径和数据库名称,那么他能够下载这个ACCESS数据库文件,这是非常危险的。

比如:如果你的ACCESS数据库book.mdb放在虚拟目录下的database目录下,那么有人在浏览器中打入:http:// someurl/database/book.mdb  如果你的book.mdb数据库没有事先加密的话,那book.mdb中所有重要的数据都掌握在别人的手中。 

 解决方法:  

(1) 为你的数据库文件名称起个复杂的非常规的名字,并把他放在几目录下。所谓"非常规",打个比方:比如有个数据库要保存的是有关书籍的信息,可不要把他起个"book.mdb"的名字,起个怪怪的名称,比如d34ksfslf.mdb,再把他放在如./kdslf/i44/studi/ 的几层目录下,这样黑客要想通过猜的方式得到你的ACCESS数据库文件就难上加难了。  

(2)不要把数据库名写在程序中。有些人喜欢把DSN写在程序中,比如: DBPath = Server.MapPath("cmddb.mdb")conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & DBPath   假如万一给人拿到了源程序,你的ACCESS数据库的名字就一览无余。因此建议你在ODBC里设置数据源,再在程序中这样写:conn.open "shujiyuan"  

(3)使用ACCESS来为数据库文件编码及加密。首先在选取"工具->安全->加密/解密数据库,选取数据库(如:employer.mdb),然后接确定,接着会出现"数据库加密后另存为"的窗口,存为:employer1.mdb。接着employer.mdb就会被编码,然后存为employer1.mdb..  要注意的是,以上的动作并不是对数据库设置密码,而只是对数据库文件加以编码,目的是为了防止他人使用别的工具来查看数据库文件的内容。  接下来我们为数据库加密,首先以打开经过编码了的employer1.mdb,在打开时,选择"独占"方式。然后选取功能表的"工具->安全->设置数据库密码",接着输入密码即可。  

为employer1.mdb设置密码之后,接下来如果再使用ACCEES数据库文件时,则ACCESS会先要求输入密码,验证正确后才能够启动数据库。 

 不过要在ASP程序中的connection对象的open方法中增加PWD的参数即可,

例如:param="driver={Microsoft Access Driver (*.mdb)};Pwd=yfdsfs"param=param&";dbq="&server.mappath("employer1.mdb")conn.open param  这样即使他人得到了employer1.mdb文件,没有密码他是无法看到employer1.mdb的。  

>>上篇文章:一个基于ASP的标题广告管理系统(三)

  >>下篇文章:ASP漏洞分析和解决方法(2)  

ASP漏洞分析和解决方法(3)

6、ASP程序密码验证漏洞  

漏洞描述:  很多网站把密码放到数据库中,在登陆验证中用以下sql,(以asp为例) sql="select * from user where username=';"&username&"';and pass=';"& pass &';"   此时,您只要根据sql构造一个特殊的用户名和密码,如:ben'; or ';1';=';1 就可以进入本来你没有特权的页面。

再来看看上面那个语句吧: sql="select * from user where username=';"&username&"';and pass=';"& pass&';"   此时,您只要根据sql构造一个特殊的用户名和密码,

如:ben'; or ';1';=';1 这样,程序将会变成这样: sql="select*from username where username="&ben';or';1';=1&"and pass="&pass&" or 是一个逻辑运算符,作用是在判断两个条件的时候,只要其中一个条件成立,那么等式将会成立.而在语言中,是以1来代表真的(成立).那么在这行语句中,原语句的"and"验证将不再继续,而因为"1=1"和"or"令语句返回为真值.。 

 另外我们也可以构造以下的用户名: username=';aa'; or username<>';aa';pass=';aa'; or pass<>';aa';  相应的在浏览器端的用户名框内写入:aa'; or username<>';aa 口令框内写入:aa'; or pass<>';aa,注意这两个字符串两头是没有';的。这样就可以成功的骗过系统而进入。  后一种方法理论虽然如此,但要实践是非常困难的,下面两个条件都必须具备。 

 1. 你首先要能够准确的知道系统在表中是用哪两个字段存储用户名和口令的,只有这样你才能准确的构造出这个进攻性的字符串。实际上这是很难猜中的。 

 2.系统对你输入的字符串不进行有效性检查。 

 问题解决和建议:   对输入的内容验证和"';"号的处理。

7、IIS4或者IIS5中安装有INDEX SERVER服务会漏洞ASP源程序 

 问题描述:  在运行IIS4或者IIS5的Index Server,输入特殊的字符格式可以看到ASP源程序或者其它页面的程序。甚至以及添打了最近关于参看源代码的补丁程序的系统,或者没有.htw文件的系统,一样存在该问题。获得asp程序,甚至global.asa文件的源代码,无疑对系统是一个非常重大的安全隐患。往往这些代码中包含了用户密码和ID,以及数据库的源路径和名称等等。这对于攻击者收集系统信息,进行下一步的入侵都是非常重要的。通过构建下面的特殊程序可以参看该程序源代码:http://202.116.26.38/null.htw?CiWebHitsFile=/default.asp&CiRestriction=none&CiHiliteType=Full 

 这样只是返回一些html格式的文件代码,但是当你添加 到CiWebHitsFile的参数后面,如下:http://someurl/null.htw?CiWebHitsFile=/default.asp &CiRestriction=none&CiHiliteType=Full  这将获得该程序的源代码。

  (注意:/default.asp是以web的根开始计算。如某站点的http:///welcome/welcome.asp那么对应就是:http://someurl/null.htw?CiWebHitsFile=/welcome/welcome.asp &CiRestriction=none&CiHiliteType=Full)  由于';null.htw';文件并非真正的系统映射文件,所以只是一个储存在系统内存中的虚拟文件。哪怕你已经从你的系统中删除了所有的真实的.htw文件,但是由于对null.htw文件的请求默认是由webhits.dll来处理。所以,IIS仍然收到该漏洞的威胁。  

问题解决或者建议:  如果该webhits提供的功能是系统必须的,请下载相应的补丁程序。如果没必要,请用IIS的MMC管理工具简单移除.htw的映象文件。补丁程序如下:Index Server 2.0:Intel:http://http://www.zjjv.com///downloads/release.asp?ReleaseID=17727Alpha:http://http://www.zjjv.com///downloads/release.asp?ReleaseID=17728Indexing Services for Windows 2000:Intel:http://http://www.zjjv.com///downloads/release.asp?ReleaseID=17726   

ASP漏洞分析和解决方法(2)

  3 code.asp文件会泄漏ASP代码 

 问题描述:  举个很简单的例子,在微软提供的 ASP1.0 的例程里有一个 .asp 文件,专门用来查看其它 .asp 文件的源代码,该文件为ASPSamp/Samples/code.asp。

如果有人把这个程序上传到服务器,而服务器端没有任何防范措施的话,他就可以很容易地查看他人的程序。

例如 :   code.asp?source=/directory/file.asp  不过这是个比较旧的漏洞了,相信现在很少会出现这种漏洞。 

 下面这命令是比较新的:http://someurl/iissamples/exair/howitworks/code.asp?/lunwen/soushuo.asp=xxx.asp  最大的危害莫过于asa文件可以被上述方式读出;数据库密码以明文形式暴露在黑客眼前;  

 问题解决或建议:  对于IIS自带的show asp code的asp程序文件,删除该文件或者禁止访问该目录即可4、filesystemobject 组件篡改下载 fat 分区上的任何文件的漏洞 

 问题描述:  IIS3、 IIS4 的 ASP 的文件操作都可以通过 filesystemobject 实现,包括文本文件的读写目录操作、文件的拷贝改名删除等,但是这个强大的功能也留下了非常危险的 "后门"。利用 filesystemobjet 可以篡改下载 fat 分区上的任何文件。即使是 ntfs 分区,如果权限没有设定好的话,同样也能破坏,一不小心你就可能遭受"灭顶之灾 "。遗憾的是很多 webmaster 只知道让 web 服务器运行起来,很少对 ntfs 进行权限 设置,而 NT 目录权限的默认设置偏偏安全性又低得可怕。因此,如果你是 Webmaster,建议你密切关注服务器的设置,尽量将 web 目录建在 ntfs 分区上,目录不要设定 everyone full control,即使是是管理员组的成员一般也没什么必要 full control,只要有读取、更改权限就足够了。 也可以把filesystemobject的组件删除或者改名。5、输入标准的HTML语句或者javascript语句会改变输出结果   

问题描述:  在输入框中打入标准的HTML语句会得到什么相的结果呢?  比如一个留言本,我们留言内容中打入:<font size=10>你好!</font>  如果你的ASP程序中没有屏蔽html语句,那么就会改变"你好"字体的大小。在留言本中改变字体大小和贴图有时并不是什么坏事,反而可以使留言本生动。但是如果在输入框中写个 javascript 的死循环,比如:<a herf="http://someurl" onMouseover="while(1){window.close(';/';)}">特大新闻</a>   那么其他查看该留言的客人只要移动鼠标到"特大新闻",上就会使用户的浏览器因死循环而死掉。

  解决方法和建议:  编写类似程序时应该做好对此类操作的防范,譬如可以写一段程序判断客户端的输入,并屏蔽掉所有的 HTML、 Javascript 语句。

>>上篇文章:ASP漏洞分析和解决方法(1)

>>下篇文章:ASP漏洞分析和解决方法(3)   

ASP中正则表达式的应用

<TABLE  borderColor=#ffffff cellSpacing=0 cellPadding=6 width="98%" bgColor=#f7f7f7 border=1>

<TR>

<TD class=chinese background=../images/btbg.gif bgColor=#cccccc colSpan=2>

<DIV align=center><B>ASP中正则表达式的应用</B></DIV>

<P ><FONT color=#808080></FONT></P></TD>

<TR>

<TD align=middle bgColor=#ffffff></TD></TR>

<TR>

<TD vAlign=top width=554 bgColor=#ffffff>

  一、正则表达式概述

  二、正则表达式在VBScript中的应用

  三、正则表达式在VavaScript中的应用

  四、示例

  五、总结

<P>  一、正则表达式概述

  如果原来没有使用过正则表达式,那么可能对这个术语和概念会不太熟悉。不过,它们并不是您想象的那么新奇。

  请回想一下在硬盘上是如何查找文件的。您肯定会使用 ? 和 * 字符来帮助查找您正寻找的文件。? 字符匹配文件名中的单个字符,而 * 则匹配一个或多个字符。一个如 data?.dat 的模式可以找到下述文件:data1.dat、data2.dat等等。如果使用 * 字符代替 ? 字符,则将扩大找到的文件数量。data*.dat 可以匹配下述所有文件名:data.dat、data1.dat、data12.dat等等,尽管这种搜索文件的方法肯定很有用,但也十分有限。? 和 * 通配符的有限能力可以使你对正则表达式能做什么有一个概念,不过正则表达式的功能更强大,也更灵活。

  在我们编写ASP程序时,经常会判断一个字符串的有效性,如;一个串是否是数字、是否是有效的Email地址等等。如果不使用正则表达式,那么判断的程序会很长,并且容易出错,如果使用正则表达式,这些判断就是一件很轻松的工作了。后面我们将介绍如何判断数字和Email地址的有效性。

  在典型的搜索和替换操作中,必须提供要查找的确切文字。这种技术对于静态文本中的简单搜索和替换任务可能足够了,但是由于它缺乏灵活性,因此在搜索动态文本时就有困难了,甚至是不可能的。

  使用正则表达式,能完成些什么事情呢?

  测试字符串的某个模式。例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式。这称为数据有效性验证。

  替换文本。可以在文档中使用一个正则表达式来标识特定文字,然后可以全部将其删除,或者替换为别的文字。

  根据模式匹配从字符串中提取一个子字符串。可以用来在文本或输入字段中查找特定文字。

  例如,如果需要搜索整个 web 站点来删除某些过时的材料并替换某些HTML 格式化标记,则可以使用正则表达式对每个文件进行测试,看在该文件中是否存在所要查找的材料或 HTML 格式化标记。用这个方法,就可以将受影响的文件范围缩小到包含要删除或更改的材料的那些文件。然后可以使用正则表达式来删除过时的材料,最后,可以再次使用正则表达式来查找并替换那些需要替换的标记。

  那么,正则表达式语法的语法是如何呢?

  一个正则表达式就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。

  这里有一些可能会遇到的正则表达式示例:

  /^\[ \t>*$/ "^\[ \t>*$" 匹配一个空白行。

  /\d{2}-\d{5}/ "\d{2}-\d{5}" 验证一个ID 号码是否由一个2位数字,一个连字符以及一个5位数字组成。

  /<(.*)>.*<\/\1>/ "<(.*)>.*<\/\1>" 匹配一个 HTML 标记。 </P>

<P>  二、正则表达式在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 & "Match found at position "

RetStr = RetStr & Match.FirstIndex & ". Match value is "

RetStr = RetStr & Match.value & "." & "<BR>"

Next

RegExpTest = RetStr

End Function

response.write RegExpTest("[ij>s.", "IS1 Js2 IS3 is4")

%>

在这个例子中,我们查找字符串中有无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 = "The quick brown fox jumped over the lazy dog."

Set regEx = New RegExp 建立正则表达式。

regEx.Pattern = patrn 设置模式。

regEx.IgnoreCase = True 设置是否区分大小写。

ReplaceTest = regEx.Replace(str1, replStr) 作替换。

End Function

Response.write ReplaceTest("fox", "cat") & "<BR>" 将 fox 替换为 cat。

Response.write ReplaceTest("(\S )(\s )(\S )", "$3$2$1") 交换词对.

%>

  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 = "找到一个或多个匹配。"

Else

RegExpTest = "未找到匹配。"

End If

End Function

Response.write RegExpTest("is.", "IS1 is2 IS3 is4")

%>

  3、Execute 方法

  对指定的字符串执行正则表达式搜索。正则表达式搜索的设计模式是通过 RegExp 对象的 Pattern 来设置的。

  Execute 方法返回一个 Matches 集合,其中包含了在 string 中找到的每一个匹配的 Match 对象。如果未找到匹配,Execute 将返回空的 Matches 集合。 </P>

<P>  三、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. </P></TD></TR></TABLE>

<P>  四、示例

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

%> </P>

<P>

  五、总结

  上面我们介绍了正则表达式的基本概念,以及在VBScript和javascript中如何使用正则表达式,同时,通过一些实例让大家有了感性的认识。正则表达式的应用范围很广,能为大家解决很多实际中的问题。本文介绍的内容只是一些初步的知识,还有很多语法规则需要大家继续学习,在实践中发现问题,解决问题。</P>

[推荐>ASP初学者常用的代码

1.获得系统时间:

<%=now()%>

2.取得来访用的IP:

<%=request.serverVariables("remote_host")%>

3.获得系统,浏览器版本:

<script>

window.document.write("版本:" navigator.appName navigator.appVersion " browser.")

</script>

4.去除IE混动条:

<body scroll="no">

<body style="overflow-y:hidden">

5.进入网站,跳出广告:

<script language="javascript">

<!--

<!-- 注意更改文件所在路径-->

window.open(';';http://http://www.zjjv.com//'';,';';';';,';';height=200,width=300,top=0,left=30';';);

// -->

</script>

6.随机数:

<%randomize%>

<%=(int(rnd()*n) 1)%>

N为可改变数

7.向上混动代码:

<marquee direction="up" scrolldelay="200" style="font-size: 9pt; color: #FF0000; line-height: 150%; font-style:italic;

font-weight:bold" scrollamount="2" width="206" height="207" bgcolor="#FFFF00">hhhhhhhhhhhhhhhhhhh</marquee>

8.自动关闭网页:

<script LANGUAGE="javascript">

<!--

setTimeout(';';window.close();';';, 10000); //60秒后关闭

// -->

</script>

<p align="center">本页10秒后自动关闭,请注意刷新页面</p>

9.随机背景音乐:

<%randomize%>

<bgsound src="mids/<%=(int(rnd()*60) 1)%>.mid" loop="-1">   

 

可以修改数字,限制调用个数,我这里是60个.

10.自动刷新本页面:

<script>

<!--  

var limit="0:10"  

if (document.images){

var parselimit=limit.split(":")

parselimit=parselimit[0>*60 parselimit[1>*1

}

function beginrefresh(){

if (!document.images)

return

if (parselimit==1)

window.location.reload()

else{

parselimit-=1

curmin=Math.floor(parselimit/60)

cursec=parselimit`

if (curmin!=0)

curtime=curmin "分" cursec "秒后重刷本页!"

else

curtime=cursec "秒后重刷本页!"

window.status=curtime

setTimeout("beginrefresh()",1000)

}

}  

window.onload=beginrefresh

文件://-->

</script>

11.ACCESS数据库连接:

<%

option explicit

dim startime,endtime,conn,connstr,db

startime=timer()

';更改数据库名字

db="data/dvBBS5.mdb"

Set conn = Server.CreateObject("ADODB.Connection")

connstr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(db)

';如果你的服务器采用较老版本Access驱动,请用下面连接方法

';connstr="driver={Microsoft Access Driver (*.mdb)};dbq=" & Server.MapPath(db)

conn.Open connstr

function CloseDatabase

Conn.close

Set conn = Nothing

End Function

%>

12.SQL数据库连接:

<%

option explicit

dim startime,endtime,conn,connstr,db

startime=timer()

connstr="driver={SQL Server};server=HUDENQ-N11T33NB;uid=sa;pwd=xsfeihu;database=dvbbs"

Set conn = Server.CreateObject("ADODB.Connection")

conn.Open connstr

function CloseDatabase

Conn.close

Set conn = Nothing

End Function

%>

13.用键盘打开网页代码:

<script language="javascript">

function ctlent(eventobject)

{

if((event.ctrlKey && window.event.keyCode==13)||(event.altKey && window.event.keyCode==83))

{

window.open(';网址';,';';,';';)

}

}

</script> 

这里是Ctrl Enter和Alt S的代码 自己查下键盘的ASCII码再换就行

14.让层不被控件复盖代码:

<div z-Index:2><object ***></object></div> # 前面

<div z-Index:1><object ***></object></div> # 后面

<div id="Layer2" style="position:absolute; top:40;width:400px; height:95px;z-index:2"><table height=100% width=100%

bgcolor="#ff0000"><tr><td height=100% width=100%></td></tr></table><iframe width=0 height=0></iframe></div>

<div id="Layer1" style="position:absolute; top:50;width:200px; height:115px;z-index:1"><iframe height=100% width=100%>

</iframe></div>

15.动网FLASH广告代码:

<object classid="clsid27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http:

//download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0" width="468" height="60">

<param name=movie value="images/yj16d.swf"><param name=quality value=high>

<embed src="images/dvbanner.swf" quality=high pluginspage="http://http://www.zjjv.com///shockwave/download/index.cgi?

P1_Prod_Version=ShockwaveFlash";;;; type="application/x-shockwave-flash" width="468" height="60"></embed></object>

16.VBS弹出窗口小代码:

<script language=vbscript>

msgbox"你还没有注册或登陆论坛","0","精品论坛"

location.href = "login.asp"

</script>

16.使用FSO修改文件特定内容的函数

function FSOchange(filename,Target,String)

Dim objFSO,objCountFile,FiletempData

Set objFSO = Server.CreateObject("Scripting.FileSystemObject")

Set objCountFile = objFSO.OpenTextFile(Server.MapPath(filename),1,True)

FiletempData = objCountFile.ReadAll

objCountFile.Close

FiletempData=Replace(FiletempData,Target,String)

Set objCountFile=objFSO.CreateTextFile(Server.MapPath(filename),True)

objCountFile.Write FiletempData

objCountFile.Close

Set objCountFile=Nothing

Set objFSO = Nothing

End Function

17.使用FSO读取文件内容的函数

function FSOFileRead(filename)

Dim objFSO,objCountFile,FiletempData

Set objFSO = Server.CreateObject("Scripting.FileSystemObject")

Set objCountFile = objFSO.OpenTextFile(Server.MapPath(filename),1,True)

FSOFileRead = objCountFile.ReadAll

objCountFile.Close

Set objCountFile=Nothing

Set objFSO = Nothing

End Function

18.使用FSO读取文件某一行的函数

function FSOlinedit(filename,lineNum)

if linenum < 1 then exit function

dim fso,f,temparray,tempcnt

set fso = server.CreateObject("scripting.filesystemobject")

if not fso.fileExists(server.mappath(filename)) then exit function

set f = fso.opentextfile(server.mappath(filename),1)

if not f.AtEndofStream then

tempcnt = f.readall

f.close

set f = nothing

temparray = split(tempcnt,chr(13)&chr(10))

if lineNum>ubound(temparray) 1 then

exit function

else

FSOlinedit = temparray(lineNum-1)

end if

end if

end function

19.使用FSO写文件某一行的函数

function FSOlinewrite(filename,lineNum,Linecontent)

if linenum < 1 then exit function

dim fso,f,temparray,tempCnt

set fso = server.CreateObject("scripting.filesystemobject")

if not fso.fileExists(server.mappath(filename)) then exit function

set f = fso.opentextfile(server.mappath(filename),1)

if not f.AtEndofStream then

tempcnt = f.readall

f.close

temparray = split(tempcnt,chr(13)&chr(10))

if lineNum>ubound(temparray) 1 then

exit function

else

temparray(lineNum-1) = lineContent

end if

tempcnt = join(temparray,chr(13)&chr(10))

set f = fso.createtextfile(server.mappath(filename),true)

f.write tempcnt

end if

f.close

set f = nothing

end function

20.使用FSO添加文件新行的函数

function FSOappline(filename,Linecontent)

dim fso,f

set fso = server.CreateObject("scripting.filesystemobject")

if not fso.fileExists(server.mappath(filename)) then exit function

set f = fso.opentextfile(server.mappath(filename),8,1)

f.write chr(13)&chr(10)&Linecontent

f.close

set f = nothing

end function

21.读文件最后一行的函数

function FSOlastline(filename)

dim fso,f,temparray,tempcnt

set fso = server.CreateObject("scripting.filesystemobject")

if not fso.fileExists(server.mappath(filename)) then exit function

set f = fso.opentextfile(server.mappath(filename),1)

if not f.AtEndofStream then

tempcnt = f.readall

f.close

set f = nothing

temparray = split(tempcnt,chr(13)&chr(10))

FSOlastline = temparray(ubound(temparray))

end if

end function

利用FSO取得BMP,JPG,PNG,GIF文件信息(大小,宽、高等)

<%

';::: BMP, GIF, JPG and PNG ::: 

';::: This function gets a specified number of bytes from any :::

';::: file, starting at the offset (base 1) :::

';::: :::

';::: Passed: :::

';::: flnm => Filespec of file to read :::

';::: offset => Offset at which to start reading :::

';::: bytes => How many bytes to read :::

';::: :::

';:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

function GetBytes(flnm, offset, bytes)

Dim objFSO

Dim objFTemp

Dim objTextStream

Dim lngSize

on error resume next

Set objFSO = CreateObject("Scripting.FileSystemObject") 

'; First, we get the filesize

Set objFTemp = objFSO.GetFile(flnm)

lngSize = objFTemp.Size

set objFTemp = nothing

fsoForReading = 1

Set objTextStream = objFSO.OpenTextFile(flnm, fsoForReading)

if offset > 0 then

strBuff = objTextStream.Read(offset - 1)

end if

if bytes = -1 then '; Get All!

GetBytes = objTextStream.Read(lngSize) ';ReadAll

else

GetBytes = objTextStream.Read(bytes)

end if

objTextStream.Close

set objTextStream = nothing

set objFSO = nothing

end function 

';:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

';::: :::

';::: Functions to convert two bytes to a numeric value (long) :::

';::: (both little-endian and big-endian) :::

';::: :::

';:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

function lngConvert(strTemp)

lngConvert = clng(asc(left(strTemp, 1)) ((asc(right(strTemp, 1)) * 256)))

end function

function lngConvert2(strTemp)

lngConvert2 = clng(asc(right(strTemp, 1)) ((asc(left(strTemp, 1)) * 256)))

end function 

';:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

';::: :::

';::: This function does most of the real work. It will attempt :::

';::: to read any file, regardless of the extension, and will :::

';::: identify if it is a graphical image. :::

';::: :::

';::: Passed: :::

';::: flnm => Filespec of file to read :::

';::: width => width of image :::

';::: height => height of image :::

';::: depth => color depth (in number of colors) :::

';::: strImageType=> type of image (e.g. GIF, BMP, etc.) :::

';::: :::

';:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

function gfxSpex(flnm, width, height, depth, strImageType)

dim strPNG

dim strGIF

dim strBMP

dim strType

strType = ""

strImageType = "(unknown)"

gfxSpex = False

strPNG = chr(137) & chr(80) & chr(78)

strGIF = "GIF"

strBMP = chr(66) & chr(77)

strType = GetBytes(flnm, 0, 3)

if strType = strGIF then '; is GIF

strImageType = "GIF"

Width = lngConvert(GetBytes(flnm, 7, 2))

Height = lngConvert(GetBytes(flnm, 9, 2))

Depth = 2 ^ ((asc(GetBytes(flnm, 11, 1)) and 7) 1)

gfxSpex = True

elseif left(strType, 2) = strBMP then '; is BMP

strImageType = "BMP"

Width = lngConvert(GetBytes(flnm, 19, 2))

Height = lngConvert(GetBytes(flnm, 23, 2))

Depth = 2 ^ (asc(GetBytes(flnm, 29, 1)))

gfxSpex = True

elseif strType = strPNG then '; Is PNG

strImageType = "PNG"

Width = lngConvert2(GetBytes(flnm, 19, 2))

Height = lngConvert2(GetBytes(flnm, 23, 2))

Depth = getBytes(flnm, 25, 2)

select case asc(right(Depth,1))

case 0

Depth = 2 ^ (asc(left(Depth, 1)))

gfxSpex = True

case 2

Depth = 2 ^ (asc(left(Depth, 1)) * 3)

gfxSpex = True

case 3

Depth = 2 ^ (asc(left(Depth, 1))) ';8

gfxSpex = True

case 4

Depth = 2 ^ (asc(left(Depth, 1)) * 2)

gfxSpex = True

case 6

Depth = 2 ^ (asc(left(Depth, 1)) * 4)

gfxSpex = True

case else

Depth = -1

end select 

else

strBuff = GetBytes(flnm, 0, -1) '; Get all bytes from file

lngSize = len(strBuff)

flgFound = 0

strTarget = chr(255) & chr(216) & chr(255)

flgFound = instr(strBuff, strTarget)

if flgFound = 0 then

exit function

end if

strImageType = "JPG"

lngPos = flgFound 2

ExitLoop = false

do while ExitLoop = False and lngPos < lngSize 

do while asc(mid(strBuff, lngPos, 1)) = 255 and lngPos < lngSize

lngPos = lngPos 1

loop

if asc(mid(strBuff, lngPos, 1)) < 192 or asc(mid(strBuff, lngPos, 1)) > 195 then

lngMarkerSize = lngConvert2(mid(strBuff, lngPos 1, 2))

lngPos = lngPos lngMarkerSize 1

else

ExitLoop = True

end if

loop

';

if ExitLoop = False then

Width = -1

Height = -1

Depth = -1

else

Height = lngConvert2(mid(strBuff, lngPos 4, 2))

Width = lngConvert2(mid(strBuff, lngPos 6, 2))

Depth = 2 ^ (asc(mid(strBuff, lngPos 8, 1)) * 8)

gfxSpex = True

end if 

end if

end function 

';:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

';::: Test Harness :::

';::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 

'; To test, we';ll just try to show all files with a .GIF extension in the root of C:

Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objF = objFSO.GetFolder("c:\")

Set objFC = objF.Files

response.write "<table border=""0"" cellpadding=""5"">"

For Each f1 in objFC

if instr(ucase(f1.Name), ".GIF") then

response.write "<tr><td>" & f1.name & "</td><td>" & f1.DateCreated & "</td><td>" & f1.Size & "</td><td>"

if gfxSpex(f1.Path, w, h, c, strType) = true then

response.write w & " x " & h & " " & c & " colors"

else

response.write " "

end if

response.write "</td></tr>"

end if

Next

response.write "</table>"

set objFC = nothing

set objF = nothing

set objFSO = nothing 

%>

24.点击返回上页代码:

<form>

<p><input TYPE="button" value="返回上一步" onCLICK="history.back(-1)"></p>

</form>

24.点击刷新代码:

<form>

<p><input TYPE="button" value="刷新按钮一" onCLICK="ReloadButton()"></p>

</form>

<script language="javascript"><!--

function ReloadButton(){location.href="allbutton.htm";}

// --></script> 

24.点击刷新代码2:

<form>

<p><input TYPE="button" value="刷新按钮二" onClick="history.go(0)"> </p>

</form> 

<form>

<p><input TYPE="button" value="打开一个网站" onCLICK="HomeButton()"></p>

</form>

<script language="javascript"><!--

function HomeButton(){location.href="http://http://www.zjjv.com//";;;;}

// --></script> 

25.弹出警告框代码:

<form>

<p><input TYPE="button" value="弹出警告框" onCLICK="AlertButton()"></p>

</form>

<script language="javascript"><!--

function AlertButton(){window.alert("要多多光临呀!");}

// --></script> 

26.状态栏信息

<form>

<p><input TYPE="button" value="状态栏信息" onCLICK="StatusButton()"></p>

</form>

<script language="javascript"><!--

function StatusButton(){window.status="要多多光临呀!";}

// --></script> 

27.背景色变换

<form>

<p><input TYPE="button" value="背景色变换" onClick="BgButton()"></p>

</form>

<script>function BgButton(){

if (document.bgColor==';#00ffff';)

{document.bgColor=';#ffffff';;}

else{document.bgColor=';#00ffff';;}

}

</script> 

28.点击打开新窗口

<form>

<p><input TYPE="button" value="打开新窗口" onCLICK="NewWindow()"></p>

</form>

<script language="javascript"><!--

function NewWindow(){window.open("http://http://www.zjjv.com//";;;,"","height=240,width=

340,status=no,location=no,toolbar=no,directories=no,menubar=no");}

// --></script></body>

29.分页代码:

<%';';本程序文件名为:Pages.asp%>

<%';';包含ADO常量表文件adovbs.inc,可从"\Program Files\Common Files\System\ADO"目录下拷贝%>

<!--#Include File="adovbs.inc"-->

<%';';*建立数据库连接,这里是Oracle8.05数据库

Set conn=Server.CreateObject("ADODB.Connection")

conn.Open "Provider=msdaora.1;Data Source=YourSrcName;User ID=YourUserID;Password=YourPassword;"  

Set rs=Server.CreateObject("ADODB.Recordset") ';';创建Recordset对象

rs.CursorLocation=adUseClient ';';设定记录集指针属性

';';*设定一页内的记录总数,可根据需要进行调整

rs.PageSize=10  

';';*设置查询语句

StrSQL="Select ID,姓名,住址,电话 from 通讯录 Order By ID"

rs.Open StrSQL,conn,adOpenStatic,adLockReadOnly,adCmdText

%>

<HTML>

<HEAD>

<title>分页示例</title>

<script language=javascript>

//点击"[第一页>"时响应:

function PageFirst()

{

document.MyForm.CurrentPage.selectedIndex=0;

document.MyForm.CurrentPage.onchange();

}

//点击"[上一页>"时响应:

function PagePrior()

{

document.MyForm.CurrentPage.selectedIndex--;

document.MyForm.CurrentPage.onchange();

}

//点击"[下一页>"时响应:

function PageNext()

{

document.MyForm.CurrentPage.selectedIndex ;

document.MyForm.CurrentPage.onchange();

}

//点击"[最后一页>"时响应:

function PageLast()

{

document.MyForm.CurrentPage.selectedIndex=document.MyForm.CurrentPage.length-1;

document.MyForm.CurrentPage.onchange();

}

//选择"第?页"时响应:

function PageCurrent()

{ //Pages.asp是本程序的文件名

document.MyForm.action=';Pages.asp?Page='; (document.MyForm.CurrentPage.selectedIndex 1)

document.MyForm.submit();

}

</Script>

</HEAD>

<BODY bgcolor="#ffffcc" link="#008000" vlink="#008000" alink="#FF0000""> 

<%IF rs.Eof THEN

Response.Write("<font size=2 color=#000080>[数据库中没有记录!></font>")

ELSE

';';指定当前页码

If Request("CurrentPage")="" Then

rs.AbsolutePage=1

Else

rs.AbsolutePage=CLng(Request("CurrentPage"))

End If  

';';创建表单MyForm,方法为Get

Response.Write("<form method=Get name=MyForm>")

Response.Write("<p align=center><font size=2 color=#008000>")

';';设置翻页超链接

if rs.PageCount=1 then

Response.Write("[第一页> [上一页> [下一页> [最后一页> ")

else

if rs.AbsolutePage=1 then

Response.Write("[第一页> [上一页> ")

Response.Write("[<a href=java script:PageNext()>下一页</a>> ")

Response.Write("[<a href=java script:PageLast()>最后一页</a>> ")

else

if rs.AbsolutePage=rs.PageCount then

Response.Write("[<a href=java script:PageFirst()>第一页</a>> ")

Response.Write("[<a href=java script:PagePrior()>上一页</a>> ")

Response.Write("[下一页> [最后一页> ")

else

Response.Write("[<a href=java script:PageFirst()>第一页</a>> ")

Response.Write("[<a href=java script:PagePrior()>上一页</a>> ")

Response.Write("[<a href=java script:PageNext()>下一页</a>> ")

Response.Write("[<a href=java script:PageLast()>最后一页</a>> ")

end if

end if

end if 

';';创建下拉列表框,用于选择浏览页码

Response.Write("第<select size=1 name=CurrentPage onchange=PageCurrent()>")

For i=1 to rs.PageCount

if rs.AbsolutePage=i then

Response.Write("<option selected>"&i&"</option>") ';';当前页码

else

Response.Write("<option>"&i&"</option>")

end if

Next

Response.Write("</select>页/共"&rs.PageCount&"页 共"&rs.RecordCount&"条记录</font><p>")

Response.Write("</form>") 

';';创建表格,用于显示

Response.Write("<table align=center cellspacing=1 cellpadding=1 border=1")

Response.Write(" bordercolor=#99CCFF bordercolordark=#b0e0e6 bordercolorlight=#000066>") 

Response.Write("<tr bgcolor=#ccccff bordercolor=#000066>")  

Set Columns=rs.Fields  

';';显示表头

For i=0 to Columns.Count-1

Response.Write("<td align=center width=200 height=13>")

Response.Write("<font size=2><b>"&Columns(i).name&"</b></font></td>")

Next

Response.Write("</tr>")

';';显示内容

For i=1 to rs.PageSize

Response.Write("<tr bgcolor=#99ccff bordercolor=#000066>")

For j=0 to Columns.Count-1

Response.Write("<td><font size=2>"&Columns(j)&"</font></td>")

Next

Response.Write("</tr>") 

rs.movenext

if rs.EOF then exit for

Next 

Response.Write("</table>")  

asp表单验证

表单验证

一般的动态网站需要通过表单来收集用户信息,或者实现与用户的交互,虽然我们相信绝大多数人士既然选择了填写

表单就会认真的完成,但是亦不能避免无聊人士乱填表单,况且即使一个正常用户在填写过程中也会无意识的出现一些

填写错误,或者他们忘记了填某些选项。通常为了避免这种情况,开发者会给表单加一个验证的过程,在表单数据提交

到服务器之前或者服务器之后对用户填写的数据进行验证,若遇到错误的填写则返回要求用户进行更正。

在ASP中程序员们一般是这样做的:

1、用javascript在客户端进行验证。

2、用vbscript在客户端进行验证。

3、用vbscript在服务器端进行验证。

上面提到了两个不同的环境,服务器端和客户端,客户端验证实际上就是包含在已下载的页面中,当用户提交表单时

候,它直接在已下载到本地的页面中调用script来进行验证,这样可以减少服务器端的运算。而服务器端的验证则是将

页面提交到服务器处理,服务器上的另一个ASP页面先执行对表单的验证,然后再返回结果到客户端。这样的缺点是每

一次验证都要经过服务器,消耗时间较长。但是利用服务器端验证却可以达到较好的验证功能。

本文就是主要讲述ASP中在服务器端的验证。

在了解以下介绍方法之前,你需要想想在表单验证问题中会遇到哪些需要值得我们控制的地方。就像软件工程思想一

样,先分析一下要在哪些方面进行验证。

1、要求用户的输入必须是中文(英文或数字)。

2、要求用户的输入必须是有效的邮件地址。

3、对用户输入的数据进行各种不同的限制。

4、限制用户输入的数据量。

5、....

实际上我们在网站设计中还会因情况不同而遇到其他很多不同的问题,需要我们自己去定义一些规定和限制。

下面我们以实例来讲述验证方法。

1、验证输入的数字

假设一个文本框

<form name="form1" method="post" action="">

<input type="text" name="textfield">

</form>

';要求用户必须输入数字

if not isnumeric(Request.Form("textfield")) then

response.write "重新填写"

end if

';要求限制数字长度,如你要用户输入oicq号码

';此例限制了用户的输入只有为4到10位数字才有效

if len(Request.Form("textfield"))>10 or len(Request.Form("textfield"))<4 then

response.write "重新填写"

end if

当然上面用Request.Form和Request是一样的,随便你怎么写了。

2、验证用户输入的邮件地址

';引用一段通用检测函数来说明

';由于检验程序较长,将其定义为一函数来调用

function IsValidEmail(email)

dim names, name, i, c

';Check for valid syntax in an email address.

IsValidEmail = true

names = Split(email, "@")

if UBound(names) <> 1 then

IsValidEmail = false

exit function

end if

for each name in names

if Len(name) <= 0 then

IsValidEmail = false

exit function

end if

for i = 1 to Len(name)

c = Lcase(Mid(name, i, 1))

if InStr("abcdefghijklmnopqrstuvwxyz_-.", c) <= 0 and not IsNumeric(c) then

IsValidEmail = false

exit function

end if

next

if Left(name, 1) = "." or Right(name, 1) = "." then

IsValidEmail = false

exit function

end if

next

if InStr(names(1), ".") <= 0 then

IsValidEmail = false

exit function

end if

i = Len(names(1)) - InStrRev(names(1), ".")

if i <> 2 and i <> 3 then

IsValidEmail = false

exit function

end if

if InStr(email, "..") > 0 then

IsValidEmail = false

end if

end function

';上面的这段函数大家应该都看的懂,当然你可以修改这段代码,使得即使用户输入XXX@CCC.DDD是错误的邮件地址

,因为DDD不是一个有效域名。

';引用的时候可以这样写

if IsValidEmail(trim(request("textfield")))=false then

response.write "重新填写"

end if

3、验证为空的表单单元

有的信息是要求用户必须填写的,所以不允许为空,因此当用户输入为空的时候需要提示。

';对为空单元的处理

if Request.Form("textfield")="" then

Response.write "填写为空"

end if

4、判断用户输入的是不是一个日期

首先明白日期值格式2002-11-19

';直接判断一个值是否是日期

if not isdate(Request.Form("textfield")) then

Response.write "日期填写出错"

end if

而我们在设计网站时候往往用三个下拉框来实现年、月、日三个不同选项,如何将这三个值联系起来,并且进行验证

呢?

首先当然要建立三个下拉框了,分别命名表单名为date,month,year,然后就是后台的处理了,因为先前我们在前台

获取了date,month,year这三个传递过来的值,所以我们必须把他们连接起来合成一个变量才能验证和存入数据库。连

接成标准日期格式表达式可以这么写:

birthday=trim(Request.Form("year"))&"-"&trim(Request.Form("month"))&"-"&trim(Request.Form("date"))

验证已经转换的输入是否为合法日期可以使用isdate函数:

if not isdate(birthday) then

response.write "错误"

end if

5、不允许用户输入某些特殊字符

在这里我们假设传递的值是content,我们不允许输入的值是=和%

if Instr(request("content"),"=")>0 or Instr(request("content"),"%")>0

then

response.write "不能输入=和%"

end if

  asp错误代码大全

MicrosoftVBScript语*错误(0x800A03E9)-->内存不足

MicrosoftVBScript语*错误(0x800A03EA)-->语*错误

MicrosoftVBScript语*错误(0x800A03EB)-->缺少 ';:';

MicrosoftVBScript语*错误(0x800A03ED)-->缺少 ';(';

MicrosoftVBScript语*错误(0x800A03EE)-->缺少 ';)';

MicrosoftVBScript语*错误(0x800A03EF)-->缺少 ';>';

MicrosoftVBScript语*错误(0x800A03F2)-->缺少标识符

MicrosoftVBScript语*错误(0x800A03F3)-->缺少 ';=';

MicrosoftVBScript语*错误(0x800A03F4)-->缺少 ';If';

MicrosoftVBScript语*错误(0x800A03F5)-->缺少 ';To';

MicrosoftVBScript语*错误(0x800A03F6)-->缺少 ';End';

MicrosoftVBScript语*错误(0x800A03F7)-->缺少 ';Function';

MicrosoftVBScript语*错误(0x800A03F8)-->缺少 ';Sub';

MicrosoftVBScript语*错误(0x800A03F9)-->缺少 ';Then';

MicrosoftVBScript语*错误(0x800A03FA)-->缺少 ';Wend';

MicrosoftVBScript语*错误(0x800A03FB)-->缺少 ';Loop';

MicrosoftVBScript语*错误(0x800A03FC)-->缺少 ';Next';

MicrosoftVBScript语*错误(0x800A03FD)-->缺少 ';Case';

MicrosoftVBScript语*错误(0x800A03FE)-->缺少 ';Select';

MicrosoftVBScript语*错误(0x800A03FF)-->缺少表达式

MicrosoftVBScript语*错误(0x800A0400)-->缺少语句

MicrosoftVBScript语*错误(0x800A0401)-->语句未结束

MicrosoftVBScript语*错误(0x800A0402)-->缺少整型常数

MicrosoftVBScript语*错误(0x800A0403)-->缺少 ';While'; 或 ';Until';

MicrosoftVBScript语*错误(0x800A0404)-->缺少 ';While';, ';Until'; 或语句未结束

MicrosoftVBScript语*错误(0x800A0405)-->缺少 ';With';

MicrosoftVBScript语*错误(0x800A0406)-->标识符过长

MicrosoftVBScript语*错误(0x800A0407)-->无效数字

MicrosoftVBScript语*错误(0x800A0408)-->无效字符

MicrosoftVBScript语*错误(0x800A0409)-->未结束的字符串常量

MicrosoftVBScript语*错误(0x800A040A)-->注释未结束

MicrosoftVBScript语*错误(0x800A040D)-->无效使用 ';Me'; 关键字

MicrosoftVBScript语*错误(0x800A040E)-->';loop'; 语句缺少 ';do';

MicrosoftVBScript语*错误(0x800A040F)-->无效的 ';exit'; 语句

MicrosoftVBScript语*错误(0x800A0410)-->循环控制变量 ';for'; 无效

MicrosoftVBScript语*错误(0x800A0411)-->名称重定义

MicrosoftVBScript语*错误(0x800A0412)-->必须是行中的第一个语句

MicrosoftVBScript语*错误(0x800A0413)-->不能为 non-ByVal 参数赋值

MicrosoftVBScript语*错误(0x800A0414)-->调用子程序时不能使用括号

MicrosoftVBScript语*错误(0x800A0415)-->缺少文字常数

MicrosoftVBScript语*错误(0x800A0416)-->缺少 ';In';

MicrosoftVBScript语*错误(0x800A0417)-->缺少 ';Class';

MicrosoftVBScript语*错误(0x800A0418)-->必须在一个类的内部定义

MicrosoftVBScript语*错误(0x800A0419)-->在属性声明中缺少 Let , Set 或 Get

MicrosoftVBScript语*错误(0x800A041A)-->缺少 ';Property';

MicrosoftVBScript语*错误(0x800A041B)-->在所有属性的规范中,变量的数目必须一致

MicrosoftVBScript语*错误(0x800A041C)-->在一个类中不允许有多个缺省的属性/方*

MicrosoftVBScript语*错误(0x800A041D)-->类的初始化或终止程序没有参数

MicrosoftVBScript语*错误(0x800A041E)-->属性的 set 或 let 必须至少有一个参数

MicrosoftVBScript语*错误(0x800A041F)-->错误的 ';Next';

MicrosoftVBScript语*错误(0x800A0420)-->';Default'; 只能在 ';Property'; , ';Function'; 或 ';Sub'; 中指定

MicrosoftVBScript语*错误(0x800A0421)-->指定 ';Default'; 时必须同时指定 ';Public'; ")

MicrosoftVBScript语*错误(0x800A0422)-->只能在 Property Get 中指定 ';Default';

MicrosoftVBScript 运行时错误(0x800A0005)-->无效的过程调用或参数

MicrosoftVBScript 运行时错误(0x800A0006)-->溢出

MicrosoftVBScript 运行时错误(0x800A0007)-->内存不足

MicrosoftVBScript 运行时错误(0x800A0009)-->下标越界

MicrosoftVBScript 运行时错误(0x800A000A)-->该数组为定长的或临时被锁定

MicrosoftVBScript 运行时错误(0x800A000B)-->被零除

MicrosoftVBScript 运行时错误(0x800A000D)-->类型不匹配

MicrosoftVBScript 运行时错误(0x800A000E)-->字符串空间不够

MicrosoftVBScript 运行时错误(0x800A0011)-->不能执行所需的操作

MicrosoftVBScript 运行时错误(0x800A001C)-->堆栈溢出

MicrosoftVBScript 运行时错误(0x800A0023)-->未定义过程或函数

MicrosoftVBScript 运行时错误(0x800A0030)-->加载 DLL 时出错

MicrosoftVBScript 运行时错误(0x800A0033)-->内部错误

MicrosoftVBScript 运行时错误(0x800A0034)-->错误的文件名或号码

MicrosoftVBScript 运行时错误(0x800A0035)-->文件未找到

MicrosoftVBScript 运行时错误(0x800A0036)-->错误的文件模式

MicrosoftVBScript 运行时错误(0x800A0037)-->文件已经打开

MicrosoftVBScript 运行时错误(0x800A0039)-->设备 I/O 错误

MicrosoftVBScript 运行时错误(0x800A003A)-->文件已存在

MicrosoftVBScript 运行时错误(0x800A003D)-->磁盘已满

MicrosoftVBScript 运行时错误(0x800A003E)-->输入超出了文件尾

MicrosoftVBScript 运行时错误(0x800A0043)-->文件过多

MicrosoftVBScript 运行时错误(0x800A0044)-->设备不可用

MicrosoftVBScript 运行时错误(0x800A0046)-->没有权限

MicrosoftVBScript 运行时错误(0x800A0047)-->磁盘没有准备好

MicrosoftVBScript 运行时错误(0x800A004A)-->重命名时不能带有其他驱动器符号

MicrosoftVBScript 运行时错误(0x800A004B)-->路径/文件访问错误

MicrosoftVBScript 运行时错误(0x800A004C)-->路径未找到

MicrosoftVBScript 运行时错误(0x800A005B)-->对象变量未设置

MicrosoftVBScript 运行时错误(0x800A005C)-->For 循环未初始化

MicrosoftVBScript 运行时错误(0x800A005E)-->无效使用 Null

MicrosoftVBScript 运行时错误(0x800A0142)-->不能创建所需的临时文件

MicrosoftVBScript 运行时错误(0x800A01A8)-->缺少对象

MicrosoftVBScript 运行时错误(0x800A01AD)-->ActiveX 部件不能创建对象

MicrosoftVBScript 运行时错误(0x800A01AE)-->类不能支持 Automation 操作

MicrosoftVBScript 运行时错误(0x800A01B0)-->Automation 操作中文件名或类名未找到

MicrosoftVBScript 运行时错误(0x800A01B6)-->对象不支持此属性或方*

MicrosoftVBScript 运行时错误(0x800A01B8)-->Automation 操作错误

MicrosoftVBScript 运行时错误(0x800A01BD)-->对象不支持此操作

MicrosoftVBScript 运行时错误(0x800A01BE)-->对象不支持已命名参数

MicrosoftVBScript 运行时错误(0x800A01BF)-->对象不支持当前区域设置

MicrosoftVBScript 运行时错误(0x800A01C0)-->未找到已命名参数

MicrosoftVBScript 运行时错误(0x800A01C1)-->参数是必选项

MicrosoftVBScript 运行时错误(0x800A01C2)-->错误的参数个数或无效的参数属性值

MicrosoftVBScript 运行时错误(0x800A01C3)-->对象不是一个集合

MicrosoftVBScript 运行时错误(0x800A01C5)-->未找到指定的 DLL 函数

MicrosoftVBScript 运行时错误(0x800A01C7)-->代码资源锁定错误

MicrosoftVBScript 运行时错误(0x800A01CA)-->变量使用了一个 VBScript 中不支持的 Automation 类型

MicrosoftVBScript 运行时错误(0x800A01CE)-->远程服务器不存在或不可用

MicrosoftVBScript 运行时错误(0x800A01E1)-->无效图片

MicrosoftVBScript 运行时错误(0x800A01F4)-->变量未定义

MicrosoftVBScript 运行时错误(0x800A01F5)-->非*赋值

MicrosoftVBScript 运行时错误(0x800A01F6)-->对象不能安全地使用 Script 编程

MicrosoftVBScript 运行时错误(0x800A01F7)-->对象不能安全初始化

MicrosoftVBScript 运行时错误(0x800A01F8)-->对象不能安全创建

MicrosoftVBScript 运行时错误(0x800A01F9)-->无效的或无资格的引用

MicrosoftVBScript 运行时错误(0x800A01FA)-->类没有被定义

MicrosoftVBScript 运行时错误(0x800A01FB)-->出现一个意外错误

MicrosoftVBScript 运行时错误(0x800A1398)-->缺少常规表达式对象

MicrosoftVBScript 运行时错误(0x800A1399)-->常规表达式语*错误

MicrosoftVBScript 运行时错误(0x800A139A)-->错误的数量词

MicrosoftVBScript 运行时错误(0x800A139B)-->常规表达式中缺少 ';>';

MicrosoftVBScript 运行时错误(0x800A139C)-->常规表达式中缺少 ';)';

MicrosoftVBScript 运行时错误(0x800A139D)-->字符集越界

MicrosoftVBScript 运行时错误(0x800A802B)-->未找到元素

ActiveServerPages,ASP0126(0x80004005)-->找不到包含文件

MicrosoftOLEDBProviderforODBCDrivers(0x80040E14)-->sql语句出错(字段名错误,或数据类型不匹配)

MicrosoftOLEDBProviderforODBCDrivers(0x80040E07)-->sql语句出错(要插入或更新的字段的类型与变量数据类型不匹配)

MicrosoftOLEDBProviderforODBCDrivers(0x80040E57)-->sql语句出错(要插入或更新的数据溢出)

MicrosoftOLEDBProviderforODBCDrivers(0x80040E10)-->sql语句出错(update字段名或要更新的数据类型错误)

MicrosoftOLEDBProviderforODBCDrivers(0x80004005)-->sql语句出错(要插入或更新的字段的数值不能为空值)

MicrosoftOLEDBProviderforODBCDrivers(0x80004005)-->打开数据库出错,没有在指定目录发现数据库

MicrosoftOLEDBProviderforODBCDrivers(0x80040E37)-->没有发现表

ODBCDrivers(0x80040E21)-->sql语句出错(数据类型不匹配或表/字段错误或处于编辑状态,或不存在于conn打开的数据库中)

ADODB.Recordset(0x800A0BB9)-->sql语句出错(sql语句或conn语句未定义或对一个rs属性进行赋值时发生错误)

ADODB.Recordset(0x800A0CC1)-->rs对像出错(rs对像本身不存在或错误地引用了一个不存在的字段名)

ADODB.Recordset(0x800A0BCD)-->rs对像出错(记录集中没有记录却对记录集进行操作)

ADODB.Recordset(0x800A0E78)-->rs对像出错(记录集不存在,缺少rs.open语句)

ADODB.Recordset(0x800A0CC1)-->rs对像出错(引用了一个不存在的字段名)

ADODB.Recordset(0x800A0E7D)-->conn定义错误

ADODB.Recordset(0x800A0CB3)-->数据库以只读方式打开,无*更新数据

ADODB.Recordset(0x800A000D)-->错误引用rs变量(rs对像已关闭或未定义)

关于ASP智能搜索

  引擎的功能是一件很方便的事,可是,如何实现类似3721的智能搜索呢?比如,当在搜索条件框内输入“中国人民”时,自动从中提取“中国”、“人民”等关键字并在数据库内进行搜索。看完本文后,你就可以发现,这个功能实现起来竟然是如此的简单。OK,Follow Me!

第一步,我们要建立一个名为db_sample.mdb的数据库(本文以Access2000数据库为例),并在其中建立表T_Sample。表T_Sample包括如下字段:

ID 自动编号

U_Name 文本

U_Info 备注

第二步,我们开始设计搜索页面Search.asp。该页面包括一个表单(Frm_Search),表单内包括一个文本框和一个提交按钮。并将表单的method属性设为“get” ,action属性设为“Search.asp",即提交给网页自身。代码如下:

<!-- Search.asp -->

<form name="frm_Search" method="get" action="Search.asp">

请输入关键字:

<input type="text" name="key" size="10">

<input type="submit" value="搜索">

</form>

下面,就进入了实现智能搜索的关键部分。

首先,建立数据库连接。在Search.asp的开始处加入如下代码:

<%

Dim strProvider,CNN

strProvider="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="

strProvider=strProvider & Server.MapPath("\") & "\data\db_Sample.mdb" ';假设数据库存放在主页根目录下的data目录下

Set CNN = Server.CreateObject("ADODB.connection")

CNN.Open strProvider ';打开数据库连接

%>

接下来,判断 ASP页所接收到的数据,并在数据库中进行搜索。

<%

Dim S_Key,RST,StrSQL

S_Key = Trim(Request("key")) ';得到搜索关键字的值

If S_Key <>"" then

Set RST=Server.CreateObject("ADODB.RecordSet")

StrSQL=AutoKey(S_Key) ';此处使用自定义函数 AutoKey(),该函数为实现智能搜索的核心

RST.Open StrSQL,CNN,3,2 ';得到搜索后的记录

If RST.BOF And RST.EOF Then

%>

<font color="#FF0000">未找到任何结果!!!</font>

<%

Else

%>

搜索名称为“<font color="#FF0000"><%= S_Key %></font>”的项,共找到 <font color="#FF0000"><%= RST.RecordCount %></font> 项:<p>

<%

While Not RST.EOF ';遍历整个记录集,显示搜索到的信息并设置链接

%>

<!-- 此处可设为你所需要的链接目标 -->

<font style="font: 12pt 宋体"><a href="info.asp?ID=<%= RST("ID") %>" target="_blank"><%= RST("U_Name") %></a></font>

<!-- 显示部分详细内容 -->

<font style="font: 9pt 宋体"><%= Left(RST("U_Info"),150) %></font><p>

<%

RST.MoveNext

Wend

RST.Close

Set RST=Nothing

End If

End If

%>

在上面的代码中,有一个自定义函数 AutoKey ,该函数是实现智能搜索的核心所在。代码如下:

<%

Function AutoKey(strKey)

CONST lngSubKey=2

Dim lngLenKey, strNew1, strNew2, i, strSubKey

';检测字符串的合法性,若不合法则转到出错页。出错页你可以根据需要进行设定。

if InStr(strKey,"=")<>0 or InStr(strKey,"`")<>0 or InStr(strKey,"';")<>0 or InStr(strKey," ")<>0 or InStr(strKey," ")<>0 or InStr(strKey,"';")<>0 or InStr(strKey,chr(34))<>0 or InStr(strKey,"\")<>0 or InStr(strKey,",")<>0 or InStr(strKey,"<")<>0 or InStr(strKey,">")<>0 then

Response.Redirect "error.htm"

End If

lngLenKey=Len(strKey)

Select Case lngLenKey

Case 0 ';若为空串,转到出错页

Response.Redirect "error.htm"

Case 1 ';若长度为1,则不设任何值

strNew1=""

strNew2=""

Case Else ';若长度大于1,则从字符串首字符开始,循环取长度为2的子字符串作为查询条件

For i=1 To lngLenKey-(lngSubKey-1)

strSubKey=Mid(strKey,i,lngSubKey)

strNew1=strNew1 & " or U_Name like ';%" & strSubKey & "%';"

strNew2=strNew2 & " or U_Info like ';%" & strSubKey & "%';"

Next

End Select

';得到完整的SQL语句

AutoKey="Select * from T_Sample where U_Name like ';%" & strKey & "%'; or U_Info like ';%" & strKey & "%';" & strNew1 & strNew2

End Function

%>

要实现智能搜索,其核心就是将搜索关键字进行自动分组。在此处,我们使用了循环取长度为2的子串的方法。为什么不将子串长度定为1、3、4或其他呢?这是因为若子串长度小于2即为1时,会失去将关键字分组的功能,而若子串长度大于2,则会丢失一些词组。大家可以将 CONST lngSubKey=2改为其他数字试一试,孰优孰劣自见分晓。

最后,别忘了将数据连接关闭,以释放资源。

<%

CNN.Close

Set CNN=Nothing

%>

至此,这个智能搜索引擎已经完成了。你还可以将其继续完善,比如添加分页、突出显示等功能。

呵呵,支持一下,,,~~

Asp中代码与页面的分离

为了避免ASP程序和HTML代码混写造成维护困难的情况,本文介绍了一种方法,利用模板来分离程序和页面,使程序设计更加轻松。

    在使用ASP制作一个站点的时候,常常会出现一个ASP文件中,程序代码和HTML代码混合的情况。这样子做有许多缺点:

    1. 且不说编程时就要对页面布局进行设计和编排,造成代码混乱难懂,不规范;

    2. 当需要改变页面外观时,你不仅要改变HTML部份,也需要改变ASP代码,不易维护。

   

    那么,要如何才能避免这些麻烦呢?

    答案就是使用模板文件,将ASP代码和HTML页面分开,一切问题就都解决了。使用模板有以下好处:

    1. 在很短的时间内可以替换整个站点的外观;

    2. 使程序员可以抽象编程,而无须接触HTML代码;

    3. 可以重复利用以前的模板。

    使用过PHP的程序就会知道,PHP有个模板程序(FastTemplate),现在的问题是如何在ASP中实现类似的功能。

    Microsoft的ASP带有两种脚本:VBScript和JScript。它们都带有一个 "正则表达式对象" (RegExp),利用字符串对象和RegExp对象,就可以轻松的实现模板功能。沐枫以此编写了一个 "Template.JScript.INC" 文件,此文件的内容附在文章后面。有能力的读者可以根据自己的需要进行改进。

    下面介绍一下使用方法。由于此文件是使用JScript编写的(当然要转成VBScript也很容易),因此,缺省脚本语言要设为JScript,即ASP程序第一行应为:<%@Language=JScript%>,然后再包含模板程序文件:<!--#include file="Template.JScript.INC"-->。

    先介绍一下Template类的使用:

    1. 建立Template对象:Template(Path)

       参数:Path(字符串类型)  HTML模板文件的存放路径。

       使用new 操作符建立Template对象。

      

       例子:

       var tpl = new Template("c:\\template");

       在程序中可以用tpl.TplPath来取得模板路径,也可以通过tpl.TplPath来改变模板路径。

       如:

       tpl.TplPath = "d:\\template";

    2. 装载模板文件:Template.Load(Name, File)

       参数:Name(字符串类型)  是一个模板变量名。

             File(字符串类型)  模板文件名。此文件存放在HTML模板路径下。

       读取文件File到模板变量Name中。

       例子:

       tpl.Load("Main", "TEST.HTM");

      

       此时,模板变量Main就包含了文件TEST.HTM的内容。

       你可以用tpl.Main来访问模板变量"Main"。

       例子:

       <%=tpl.Main%>

       将显示刚才读进来的TEST.HTM文件内容。

3. 模板分拆:Template.Split(Name)

       参数:Name(字符串类型)  是一个模板变量名。

       将Name中的子模板分解。

       例子:

       先假设上例中的TEST.HTM内容为:

       -------------------

       这是主模板。接下来是:<!--#TPLDEF SUB-->SUB子模板,还有

         <!--#TPLDEF THIRD-->THIRD模板。<!--#TPLEND THIRD-->

       <!--#TPLEND SUB-->

       -------------------

       那么:

       tpl.Split("Main");

       执行以后,就会生成新的模板变量"SUB",和"THIRD",它们的内容就是<!--#TPLDEF SUB-->和<!--#TPLEND SUB-->之间语句。

       而且"Main"模板变量的内容也会发生改变:

       tpl.Main  的内容为:"这是主模板。接下来是{SUB}"

       tpl.SUB   的内容为:"SUB子模板,还有{THIRD}"

       tpl.THIRD 的内容为:"THIRD模板。"

       TPLDEF 和 TPLEND 定义的语句块充许多重嵌套。

    4. 模板处理:Template.Parse(Name)

       参数:Name(字符串类型)  是一个模板变量。

       将模板中用花括号括起来的字串用同名的模板变量的内容替换。

      

       例子:续上例

       <%=tpl.Parse("Main")%>

       显示:"这是主模板。接下来是SUB子模板,还有{THIRD}"

      

       由例子可知,Parse只替换"Main"模板中的{SUB}变量,而不能嵌套替换下去。这是为了增加程序灵活性而故意设计的。那么该怎么样完整显示"Main"模板呢?

       例子:

       tpl.SUB = tpl.Parse("SUB");  //先处理SUB变量,再处理Main变量。

       Response.write(tpl.Parse("Main"));

5. 自定义模板变量。

       自定义模板变量很简单,可以直接用赋值语句来定义和修改任何变量:

       例子:

       tpl.Hahaha = "这是自定义变量";

       tpl.THIRD = "改变原模板中的THIRD变量";

   

    需要注意的是,由于JScrip是区分大小写的,因此一定要注意大小写的拼写。一般来说,HTML模板中定义的模板变量都用大写。

    另外,模板中使用的"TplPath","Load","Parse","Split"变量是内部使用的,不要挪做它用,否则程序将可能发生异常。

    下面举个完整的例子:

    第一步:先建立Html模板文件。

    这里先说明HTML模板文件的组成。首先,它和普通的HTML文件几乎没有区别,只不过多了几个标记。

    模板的标记有两种。让我们先看一个例子:

    TEST.HTM

    -----------------

    <!--文件名:TEST.HTM-->

    <HTML>

    <TITLE>范例</TITLE>

    <HEADER>

    </HEADER>

    <BODY>

    这是一个表格范例。

    <TABLE>

    <!--#TPLDEF MAXX-->10<!--#TPLEND MAXX-->

      <!--...注意,此处使用了一个技巧即定义了MAXX模板变量并赋值为10。-->

      <TR>

     <TD>X</TD><TD>X的平方</TD>

      </TR>

  <!--#TPLDEF ROW-->

      <TR>

     <TD>{X}</TD><TD>{XX}</TD>

      </TR>

  <!--#TPLEND ROW-->

    </TABLE>

    以上共有{COUNT}行数据。

   </BODY>

   </HTML>

   -----------------

   从上面可以看出,象{X},{XX},{COUNT}之类的记号是定义模板变量。它们将会在ASP程序中被替代。

   而<!--#TPLDEF ROW-->...<!--#TPLEND ROW-->是定义一个语句块"ROW"。在ASP程序中就可以将"ROW"块重复多次。

第二步:设计ASP程序。

   

   TEST.ASP

   -------------------

   <%@Language=JScript%>

   <!--#include file="Template.JScript.INC"-->

   <%

  var tpl = new Template("c:\\Inetpub\\wwwroot");

  var str="";

  var i;

  tpl.Load("Main","TEST.HTM");

  tpl.Split("Main");

  tpl.COUNT = 0;

 

  for(i=1;i<=tpl.MAXX;i )   //tpl.MAXX在模板中定义为10。

  {

       tpl.X = i;  

       tpl.XX = i*i;

       str =tpl.Parse("ROW");

       tpl.COUNT ;

  }

  tpl.ROW = str;

  tpl.MAXX ="";  //清空此模板变量,以避免被显示出来。

   %>

   <%=tpl.Parse("Main")%>

   -------------------

    上面的程序将显示一个1到10的平方表。

    通常在使用模板的情况下,都只要在最后一行加上显示页面的语句。因此整个程序显得十分清晰。此时,只要对模板文件进行编辑,就可以改变整个页面的外观。

    至于模板文件,它可以是任何文件,如HTML文件、ASP文件,甚至是程序本身!,而且在一个程序中可以装载多个模板配合使用,这样,不仅具有极大灵活性,而且模板文件与ASP程序的相关性可减到最低程度。

    好好利用模板,将会使你的工作更加轻松。

附:Template 源程序

------------------------------------

<!--文件名:Template.JScript.INC-->

<%

/*********************************************************/

/* Template Class                                        */

/* Author: 沐枫 (lin.y@263.net)                       */

/* Date:   2000-6-09                                     */

/*********************************************************/

//Template Method Define

function Template_Parse(name)

{

  if(this[name>==null)

    return "";

  var reg = new RegExp("{(\\w*)}","ig");

  var str = new String(this[name>);

  var arr = str.match(reg);

  var i;

  

  if(arr != null)  

    for(i=0;i<arr.length;i )

    {

      key = arr.slice(1,-1);

      reg = new RegExp(arr,"ig");

      if(this[key>!=null)

     str = str.replace(reg,this[key>);

    }

  return str;

}

function Template_Split(name)

{

  var len = 0;

  var arr;

  

  if(this[name>==null)

    return;

   

  var Template_Exp = new RegExp("<!--#TPLDEF (\\w*) *-->((.|\\n)*)<!--#TPLEND \\1 *-->","i");

  while(this[name>.search(Template_Exp)!=-1)

  {

    arr = this[name>.match(Template_Exp);

   

    this[arr[1} = arr[2>;

    this[name> = this[name>.replace(Template_Exp,"{" arr[1> "}");

    this.Split(arr[1>);

  }

}

function Template_Load(name,filename)

{

  var fso = new ActiveXObject("Scripting.FileSystemObject");

  var file = fso.BuildPath(this.TplPath, filename);

  if(fso.FileExists(file))

  {

    var f = fso.OpenTextFile(file, 1);

    this[name> = f.ReadAll();

  }

}

//Template Constructor

function Template(path)

{

  //Property

  this.TplPath = path;

  

  //Method

  this.Parse = Template_Parse;

  this.Split = Template_Split;

  this.Load = Template_Load;

}

%>

0 0