6/15/2006

使用模板实现ASP代码与页面分离

每个进行过较大型的ASP-Web应用程序设计的开发人员大概都有如下的经历:ASP代码与页面HTML混淆难分,业务逻辑与显示方式绞合,使得代码难以理解、难以修改;程序编写必须在美工之后,成为项目瓶颈;整合的程序代码和HTML静态页面时,花费大量的时间才能得到理想的效果,兼作了美工。的确,用脚本语言开发Web应用不容易将数据的处理和数据的显示分开,但在多人合作的情况下,如果无法将数据和显示分开,将大大影响开发的效率,专业分工的发挥。
  其它的脚本语言,如JSP、PHP都有自己的解决方案,ASP的后一代产品ASP.NET也实现了代码与页面,似乎直接过渡到ASP是不错的选择。但是总有这样或那样的原因让我们不能或暂时不能放弃ASP直奔.NET大营。从公司角度来看,转换语言是一笔不少的投资,包括雇佣熟手.NET程序员、培训原有程序员、开发工具的转型、开发风格的转型、界面风格转变、接口风格、软件架构、文档、开发流程等等;这还意味着原有的代码必须在新语言环境里重写以实现最佳的效果和稳定性;同时将直接影响这段时间内项目的进度,更有可能导致个别程序员出走。由此看来在您决定转换语言之前,在原基础上寻求一种解决方案,才是最好的选择。
  PHP通过模板实现代码与页面,可供选择的有FastTemplate、PHPLIB、Smarty等多种,其中PHPLIB 的影响最大、使用最多。既然如此,我们直接把它搬到ASP来,对于同时使用PHP和ASP的公司还有很有好处:一、美工处理页面时,不管将要套用PHP还是ASP,处理方式是一样,无须经过培训;二、程序员编写代码时,两种语言间的思路接近或一致,相同功能在两种语言实现时,只需拷贝过来略作修改即可,保证了工作效率和项目进度。
  1、模板类的设计
  实现代码封装成为模板类,即是为了与PHPLIB兼容,也使得代码方便管理与扩展。
  模板类要实现的目标为:从模板文件中读入显示的HTML代码,将这些显示代码中需要动态数据的地方替换为ASP程序运算所得出的数据,然后按照一定的顺序输出。其中,替换的部分可以自由的设定。因此它必须完成如下任务:
  * 从模板文件中读取显示用的HTML代码。  * 将模板文件和实际生成的数据结合,生成输出的结果。  * 允许同时处理多个模板。  * 允许模板的嵌套。  * 允许对模板中的某个单独的部分进行处理。
  实现方法:
  * 采用FSO读取模板文件  * 采用正则替换实现模板文件和数据的结合  * 处理多个模板用数组存储来实现。  * 模板的嵌套的实现主要的想法是:将模板和输出(任何中间的分析结果)一视同仁,都可拿来做替换,即可实现。  * 单独部分的处理的通过在模板文件中设定标注,然后在正则替换中结合标注来控制,实现部分替换。
  2、模板类的实现
  给出具体代码之前,先把主要函数列出,用过PHPLIB的朋友应该对此很熟悉了:    1)Public Sub set_root(ByVal Value) 设定模板默认目录  2)Public Sub set_file(ByVal handle,ByVal filename) 读取文件  3)Public Sub set_var(ByVal Name, ByVal Value, ByVal Append) 设置映射数据-替换变量  4)Public Sub unset_var(ByVal Name) 取消数据映射  5)Public Sub set_block(ByVal Parent, ByVal BlockTag, ByVal Name) 设置数据块  6)Public Sub set_unknowns(ByVal unknowns) 设定未指定映射的标记处理方式  7)Public Sub parse(ByVal Name, ByVal BlockTag, ByVal Append) 执行模板文件与数据的结合  8)Public Sub p(ByVal Name) 输出处理结果
  实现代码:
Class kktTemplate
Private m_FileName, m_Root, m_Unknowns, m_LastError, m_HaltOnErrPrivate m_ValueList, m_BlockListPrivate m_RegExp’ 构造函数Private Sub Class_InitializeSet m_ValueList = CreateObject("Scripting.Dictionary")Set m_BlockList = CreateObject("Scripting.Dictionary")set m_RegExp = New RegExpm_RegExp.IgnoreCase = Truem_RegExp.Global = Truem_FileName = ""m_Root = ""m_Unknowns = "remove"m_LastError = ""m_HaltOnErr = trueEnd Sub
’ 析构函数Private Sub Class_TerminateSet m_RegExp = NothingSet m_BlockMatches = NothingSet m_ValueMatches = nothingEnd Sub
Public Property Get ClassName()ClassName = "kktTemplate"End Property
Public Property Get Version()Version = "1.0"End Property
Public Sub About()Response.Write("kktTemplate ASP页面模板类<br>" & vbCrLf &_"程序设计:彭国辉 2004-07-05<br>" & vbCrLf &_"个人网站:<a href=’http://kacarton.yeah.net’>http://kacarton.yeah.net/<;/a><br>" & vbCrLf &_"电子邮件:<a href=’mailto:kacarton@sohu.com’>kacarton@sohu.com</a><br>")End Sub
’检查目录是否存在Public Function FolderExist(ByVal path)Dim fsoSet fso = CreateObject("Scripting.FileSystemObject")FolderExist = fso.FolderExists(Server.MapPath(path))Set fso = NothingEnd Function’读取文件内容Private Function LoadFile()Dim Filename, fso, hndFileFilename = m_RootIf Right(Filename, 1)<>"/" And Right(Filename, 1)<>"\" Then Filename = Filename & "/"Filename = Server.MapPath(Filename & m_FileName)Set fso = CreateObject("Scripting.FileSystemObject")If Not fso.FileExists(Filename) Then ShowError("模板文件" & m_FileName & "不存在!")set hndFile = fso.OpenTextFile(Filename)LoadFile = hndFile.ReadAllSet hndFile = NothingSet fso = NothingIf LoadFile = "" Then ShowError("不能读取模板文件" & m_FileName & "或文件为空!")End Function
’处理错误信息Private Sub ShowError(ByVal msg)m_LastError = msgResponse.Write "<font color=red style=’font-size;14px’><b>模板错误:" & msg & "</b></font><br>"If m_HaltOnErr Then Response.EndEnd Sub
’设置模板文件默认目录’Ex: kktTemplate.set_root("/tmplate")’ kktTemplate.Root = "/tmplate"’ root = kktTemplate.get_root()’ root = kktTemplate.Root’使用类似set_root这样的命名方法是为了兼容phplib,以下将不再重复说明Public Sub set_root(ByVal Value)If Not FolderExist(Value) Then ShowError(Value & "不是有效目录或目录不存在!")m_Root = ValueEnd SubPublic Function get_root()get_root = m_RootEnd FunctionPublic Property Let Root(ByVal Value)set_root(Value)End PropertyPublic Property Get Root()Root = m_RootEnd Property
’设置模板文件’Ex: kktTemplate.set_file("hndTpl", "index.htm")’本类不支持多模板文件,handle为兼容phplib而保留Public Sub set_file(ByVal handle,ByVal filename)m_FileName = filenamem_BlockList.Add Handle, LoadFile()End SubPublic Function get_file()get_file = m_FileNameEnd Function’ Public Property Let File(handle, filename)’ set_file handle, filename’ End Property’ Public Property Get File()’ File = m_FileName’ End Property
’设置对未指定的标记的处理方式,有keep、remove、comment三种Public Sub set_unknowns(ByVal unknowns)m_Unknowns = unknownsEnd SubPublic Function get_unknowns()get_unknowns = m_UnknownsEnd FunctionPublic Property Let Unknowns(ByVal unknown)m_Unknowns = unknownEnd PropertyPublic Property Get Unknowns()Unknowns = m_UnknownsEnd Property
Public Sub set_block(ByVal Parent, ByVal BlockTag, ByVal Name)Dim Matchesm_RegExp.Pattern = "<!--\s+BEGIN " & BlockTag & "\s+-->([\s\S.]*)<!--\s+END " & BlockTag & "\s+-->"If Not m_BlockList.Exists(Parent) Then ShowError("未指定的块标记" & Parent)set Matches = m_RegExp.Execute(m_BlockList.Item(Parent))For Each Match In Matchesm_BlockList.Add BlockTag, Match.SubMatches(0)m_BlockList.Item(Parent) = Replace(m_BlockList.Item(Parent), Match.Value, "{" & Name & "}")Nextset Matches = nothingEnd Sub
Public Sub set_var(ByVal Name, ByVal Value, ByVal Append)Dim ValIf IsNull(Value) Then Val = "" Else Val = ValueIf m_ValueList.Exists(Name) ThenIf Append Then m_ValueList.Item(Name) = m_ValueList.Item(Name) & Val _Else m_ValueList.Item(Name) = ValElsem_ValueList.Add Name, ValueEnd IfEnd Sub
Public Sub unset_var(ByVal Name)If m_ValueList.Exists(Name) Then m_ValueList.Remove(Name)End Sub
Private Function InstanceValue(ByVal BlockTag)Dim keys, iInstanceValue = m_BlockList.Item(BlockTag)keys = m_ValueList.KeysFor i=0 To m_ValueList.Count-1InstanceValue = Replace(InstanceValue, "{" & keys(i) & "}", m_ValueList.Item(keys(i)))NextEnd Function
Public Sub parse(ByVal Name, ByVal BlockTag, ByVal Append)If Not m_BlockList.Exists(BlockTag) Then ShowError("未指定的 块标记" & Parent)If m_ValueList.Exists(Name) ThenIf Append Then m_ValueList.Item(Name) = m_ValueList.Item(Name) & InstanceValue(BlockTag) _Else m_ValueList.Item(Name) = InstanceValue(BlockTag)Elsem_ValueList.Add Name, InstanceValue(BlockTag)End IfEnd Sub
Private Function finish(ByVal content)Select Case m_UnknownsCase "keep" finish = contentCase "remove"m_RegExp.Pattern = "\{[^ \t\r\n}]+\}"finish = m_RegExp.Replace(content, "")Case "comment"m_RegExp.Pattern = "\{([^ \t\r\n}]+)\}"finish = m_RegExp.Replace(content, "<!-- Template Variable $1 undefined -->")Case Else finish = contentEnd SelectEnd Function
Public Sub p(ByVal Name)If Not m_ValueList.Exists(Name) Then ShowError("不存在的标记" & Name)Response.Write(finish(m_ValueList.Item(Name)))End SubEnd Class%>
  3、使用例子
  下面举三个例子进行说明。
  1)简单的值替换
  模板文件为myTemple.tpl,内容:
<html><title>ASP模板简单替换</title><body>祝贺!你赢了一辆{some_color}法拉利!</body>
  下面是ASP代码(kktTemplate.inc.asp就是上面给出的模板类):
<!--#INCLUDE VIRTUAL="kktTemplate.inc.asp"--><%dim my_color, kktmy_color = "红色的"set kkt = new kktTemplate ’创建模板对象kkt.set_file "hndKktTemp", "myTemple.tpl" ’设置并读取模板文件myTemple.tplkkt.set_var "some_color", my_color, false ’设置模板变量 some_color = my_color的值kkt.parse "out", "hndKktTemp", false ’模板变量 out = 处理后的文件kkt.p "out" ’输出out的内容set kkt = nothing ’销毁模板对象%>
  执行后输出为:
<html><title>ASP模板简单替换</title><body>祝贺!你赢了一辆红色的法拉利!</body>
  2)循环块演示例子
  模板文件myTemple2.tpl:
<html><title>ASP模板-块的演示</title><body><table cellspacing="2" border="1"><tr><td>下面的动物您喜欢哪一种</td></tr><!-- BEGIN AnimalList --><tr><td><input type="radio" name="chk">{animal}</td></tr><!-- END AnimalList --></table></body>
  ASP代码:
<!--#INCLUDE VIRTUAL="kktTemplate.inc.asp"--><%dim animal, kkt, ianimal = Array("小猪","小狗","小强")set kkt = new kktTemplatekkt.set_file "hndKktTemp", "myTemple2.tpl"kkt.set_block "hndKktTemp", "AnimalList", "list"for i=0 to UBound(animal)kkt.set_var "animal", animal(i), falsekkt.parse "list", "AnimalList", truenextkkt.parse "out", "hndKktTemp", falsekkt.p "out"set kkt = nothing%>
  执行结果:
<html><title>ASP模板-块的演示</title><body><table cellspacing="2" border="1"><tr><td>下面的动物您喜欢哪一种</td></tr><tr><td><input type="radio" name="chk">小猪</td></tr><tr><td><input type="radio" name="chk">小狗</td></tr><tr><td><input type="radio" name="chk">小强</td></tr></table></body>
  3)嵌套块演示
  模板文件myTemple3.tpl:
<html><title>ASP模板-嵌套块演示</title><body><table width="400" border="1" bordercolor="#000000"><tr><td><div align="center">{myname}测试</div></td></tr><tr><td>我的动植物园:</td> </tr><!-- BEGIN animalList --><tr><td>{animal}</td></tr><!-- BEGIN plantList --><tr><td> {plant}</td></tr><!-- END plantList --><!-- END animalList --></table></body></html>
  ASP代码:
<!--#INCLUDE VIRTUAL="kktTemplate.inc.asp"--><%dim my_color, kkt, myname, animal, plantset kkt = new kktTemplatemyname = "kktTemplate block test..."animal = array("动物", "植物")plant = array(array("小猪","小白","小强"), array("玫瑰","向日葵"))
kkt.set_file "hndKktTemp", "myTemple3.tpl"kkt.set_var "myname", myname, falsekkt.set_block "hndKktTemp", "animalList", "a"kkt.set_block "animalList", "plantList", "p"
for i=0 to UBound(animal)kkt.set_var "animal", animal(i), Falsekkt.unset_var "p"’kkt.set_var "p", "", falsefor j=0 to UBound(plant(i))kkt.set_var "plant", plant(i)(j), falsekkt.parse "p", "plantList", truenextkkt.parse "a", "animalList", truenextkkt.parse "out", "hndKktTemp", falsekkt.p "out"%>
  执行结果:
<html><title>ASP模板-嵌套块演示</title><body><table width="400" border="1" bordercolor="#000000"><tr><td><div align="center">kktTemplate block test...测试</div></td></tr><tr><td>我的动植物园:</td> </tr><tr><td>动物</td></tr><tr><td> 小猪</td></tr><tr><td> 小白</td></tr><tr><td> 小强</td></tr><tr><td>植物</td></tr><tr><td> 玫瑰</td></tr><tr><td> 向日葵</td></tr></table></body></html>

6/11/2006

ASP常见问题及解答

1.关于<table>折行: <table style="TABLE-LAYOUT: fixed" width="200" border="0" cellspacing="0" cellpadding="7" bgcolor="#f7f7f7"> <tr> <td style="LEFT: 0px; WIDTH: 100%; WORD-WRAP: break-word"> dffadfdaqqqqqqqqq</font></td> </tr> </table>
重点是"WORD-WRAP: break-word"把它去掉再看看就知道了.

2.批量录入在数据库的应用中比较广泛的,关于批量录入的方法也有好多种。 下面我就结合我实际中的应用,谈一下儿我是怎么实现的。 主要用到的是form的集合的概念,通过循环取的所有的集合内数据。 考虑到大家看着方便,我把它集成到了一个页面。 下面是具体的代码: batchInput.asp <% ''##################################### ''File Function:批量录入数据 ''Author:Myhon ''Date:2003-8-19 ''#####################################
''向数据库写入数据 SUB writeData() dim recCnt,i dim fieldName1,fieldName2,fieldName3 dim conn dim sqlStr,connStr connStr="Provider=SQLOLEDB.1;Initial Catalog=myDatabase;Data Source=myhon;User Id=sa;PASSWORD=" set conn=Server.CreateObject("ADODB.Connection") conn.open connStr ''建立数据库连接
recCnt=request.form("stu_num").count ''取得共有多少条记录 ''批量录入数据 for i=1 to recCnt fieldName1=trim(request.form("fieldName1")(i)) fieldName2=trim(request.form("fieldName2")(i)) fieldName3=trim(request.form("fieldName3")(i)) sqlStr="insert into myTable(fieldName1,fieldName2,fieldName3) values(''" sqlStr=sqlStr & fieldName1 & "'',''" sqlStr=sqlStr & fieldName2 & "'',''" sqlStr=sqlStr & fieldName3 & "'')" ''response.write sqlStr conn.execute(sqlStr) next END SUB
''显示成批录入的界面 SUB InputData() dim recCnt,i %> <form name="bathInputData" action="" method="post"> <% recCnt=cint(request.form("recCnt")) for i=1 to recCnt %> <input type="text" name="fieldName1"> <input type="text" name="fieldName2"> <input type="text" name="fieldName3"> <% next %> <br/> <input type="submit" name="action" value="提交"> </form> <% END SUB
''指定要批量录入多少条记录 SUB assignHowMuch() %>
<!------指定要录入多少条记录--------------> <form name="form1" action="" method="post"> 您要录入的记录的条数:<input type="text" name="recCnt"> <input type="submit" name="action" value="下一步>>"> </form> <% END SUB
if request.form("action")="下一步>>" then Call InputData() ''显示成批录入界面 elseif request.form("action")="提交" then Call writeData() ''向数据库批量写入数据 else Call assignHowMuch() ''显示指定录入多少条记录的界面 end if
%>

3.以动感下载系统为例:
打开文件 SoftDown.Asp 在: if request.QueryString("ID")="" then response.write "不能连接或者没有指定下载软件" response.end end if 的上面或者是下面加上下列代码
dim strReferer,domain,splDomain,isHttp isHttp=false
''本站下载系统网址列表,不要带上http:// domain="sron.net,61.156.14.223,61.156.14.227"
splDomain=split(domain,",") strReferer=Request.ServerVariables("HTTP_REFERER") for iii = 0 to ubound(splDomain) if instr(strReferer,trim(splDomain(iii)))>0 then isHttp=True next if isnull(strReferer) or isHttp=false then Response.Write "下载链接来自其他网站,这是不允许的,<a href="/sblog/"./"">请进入本站页面后再进行下载。</a>" CloseDatabase response.end end if
本站下载系统网址列表 就是访问你下载频道网址里的域名,比如你的下载频道可以用多个网址来访问,所以这里用逗号隔开.

4.无法写入cookie的常见问题 1.确定你的response.cookie代码在第一个<html>之前 2.设置cookies的截止日期response.cookie("cookiename").expires = expiresdate;
设置cookie的请求指定路径: 就是说你的cookie写入后,指定路径中的页面才有权得到这个cookie 例如:指定路径response.cookie("cookiename").path = "http://www.domain.com/path" 那么只有path目录中的页面才能得到request.cookie("cookiename")

5.vbscript的错误捕捉:
on error resume next ''打开错误捕捉 ... if err.number<>0 then ''err是vbs内置的对象,类似于try catch的exception err.clear ''错误被处理了就要及时把错误标记清空 ''输出自己的出错信息,或用err.description显示系统出错信息 end if
on error goto 0 ''关闭错误捕捉。

6.ServerVariables集合用于得到系统的环境变量用以下程序可以讲ServerVariables集合的所有内容名称都显示出来 <html> <head></head> <body> <% for each item in request.servervariables response.write("<p><b>"&item&"</b>:") response.write(request.serverVariables(item)) next %> </body> </html> 具体的系统环境变量如下: Auth_Type 当用户访问一个被保护的脚本时,用于判断是否是一个有效用户 Content_Length 客户端所提交的正文的长度 Content_Type 提交的正文数据类型 Gateway_Interface 服务器所使用的CGI修订版本 Login_User 用户是否以Windows NT帐户登陆 Path_Info 客户端路径信息 Query_String 在一个HTTP请求的查询信息 Remote_Addr 发送请求的远程主机的ip地址,利用此地址可以知道访问这的来源 Remote_Host 发送请求的远程主机名,如果远端服务器不包含该信息,则返回空字符串 Request_Method 数据请求的方法 Script_Map url的基本部分 Script_Name 执行脚本的虚拟路径 Server_Name 该服务器的名称DNS的别名,IP地址及其制定的url路径 Server_Port 数据请求所使用的端口号 Server_Software 服务器端运行的软件名称及版本号 Server_Protocol 要求信息的协议及修订版本 URL 系统的URL路径 HTTP_REFERER 当通过链接到大当前页面时,HTTP_REFERER header 保存这个用户的来源

8.HTML文件标记 <html> <head> <!--> <title> <body>
文字排版标记 <br/> <nobr> <p> <pre> 原始文字样式 <center> <blockquote> 向内缩排 <h> 标题 <strong>,<b> 粗体 <em>,<i>,<cite> 斜体 <U> 底线 <strike> 删除线 <blink> 文字闪烁 <big> 大型字体 <small> 小型字体 <sup> 文字上标 <SUB> 文字下标 <basefont> 默认字体设置 <font> 更改字体设置
菜单标记 <menu> 选项菜单 <dir> 目录菜单 <lh> 菜单格式(一) <ul> 菜单格式(二) <dl>,<dt>,<dd> 说明式菜单 <ol>,<li> 标题菜单
直线与表格标记 <hr> <table> <tr> <td> <th> <caption> 表格标题
超链接标记 <a> 锚
图形标记 <IMG> 插入图形
框架标记 <FRAME> 定义框架内容 <NOFRAME> 不支持框架声明
表单标记 <FORM> <INPUT> <TEXTAREA> <SELECT> <OPTION>
SCRIPT <script>
VBSCRIPT标记索引
基本运算 + 数字加法及字符串连接 - 数字减法 * 数字乘法 / 数字除法 Mod 求余数 \ 求商数 & 字符串连接 ^ 次方 = 相等 <> 不相等 >= 大于或等于 > 大于 <= 小于或等于 < 小于 Not 非 And 且 Or 或 Xor 异或
循环及决策 if ....then 若...则... if ...then...else 若...则...非 else if... 非若 select case... 群组选择条件 end select for ... next 计数循环 while...wend 条件循环(一) do while...loop 条件循环(二) do...loop while 条件循环(三) do until...loop 条件循环(四) do...loop until 条件循环(五)
数学函数 Abs 绝对值 Sgn 正负号 Hex 转换成十六进制 Oct 转换成八进制 Sqr 平方根 Int 取整数 Fix 取整数 Round 取整数 Log 以e为底的对数 Sin 正弦函数 Cos 余弦函数 Tan 正切函数
字符串处理函数 Len 字符串长度 Mid 取部分字符串 Left 从字符串开头取部分字符串 Right 从字符串结尾取部分字符串 Lcase 转换成小写 Ucase 转换成大写 Trim 清除字符串开头及结尾的空格符 Ltrim 清除字符串开头空格符 Rtrim 清除字符串结尾空格符 Replace 替换字符串部分字符 Instr 判断是否包含于另一个字符串(从起始搜寻) InstrRev 判断是否包含于另一个字符串(从结尾搜寻) Space 任意字符数的空格符 String 任意字符数的任一字符 StrReverse 反转字符串 Split 以某字符分割字符串
数据类型转换函数 Cint 转换成整形 Cstr 转换成字符串 Clng 转换成常整数 Cbool 转换成布尔函数 Cdate 转换成日期函数 CSng 转换成单精度 CDbl 转换成双精度
日期时间函数 Date 现在日期 Time 现在时间 NOw 现在日期时间 DateAdd 增加日期 DateDiff 两日期差 DateSerial 日期设定 DateValue 日期设定 Year 现在年份 Month 现在月份 Day 现在天 Hour 现在时刻 Minute 现在分钟 Second 现在秒钟 Timer 午夜距现在秒数 TimeSerial 时间设定 TimeValue 时间所属部分 WeekDay 星期名称 MonthName 月份名称
其它函数 Array 产生数组 Asc 字符ASCII码 Chr ASCII码字符 Filter 过滤数组 InputBox 输入窗口 Join 合并数组中的元素 MsgBox 信息窗口 Lbound 数组下界 Ubound 数组上界
指令 Const 设定常数 Dim 定义变量或者数组 Erase 清除数组 ReDim 重新声明数组 Randomize 起始随机数 Rnd 取得随机数
ASP对象
Session对象 IsEmpty 测试Session变量是否存在 TimeOut 设定Session变量生存周期 Abandon 强制清除Session变量
Application对象 IsEmpty 测试Application变量是否存在 Lock 锁定Application变量 Unlock 解除Lock指令的锁定
Cookies对象 Expires 设定Cookies变量的生存周期
Connection对象 Open 打开与数据库的连接 Execute 打开Recordset对象 Close 关闭Connection对象
Recordset对象 movefirst 将记录指针移至第一条 movelast 将记录指针移至最后一条 movenext 将记录指针移至下一条 moveprevious 将记录指针移至上一条 bof 测试是否为recordset的起始 eof 测试是否为recordset的结束 open 打开Recoreset对象 close 关闭recordset对象 fields 读取数据的子对象 fileds.count 字段个数 pagesize 每页记录条数 absolutepage 设定为某页 pagecount 总页数 Absoluteposition 直接跳至某条记录


9.没什么好共享的,但太感动了,把做树型菜单的js函数贴出来, <SCRIPT language="JavaScript"> var lastObj
function expandIt(obj) { if(lastObj != null) { if(obj == lastObj) { if(obj.style.display == "none") { obj.style.display = ""; } else { obj.style.display = "none" } } else { lastObj.style.display = "none"; obj.style.display = ""; } } else { obj.style.display = ""; }
lastObj = obj } </SCRIPT>
<table width="100%" border="0" cellspacing="0" cellpadding="0"> <% dim id id = request("id") dim strsql,rs
strsql="select * from p_type where slanguage=1 and typelevel=1 order by typename" set rs=fgetrslist(strsql) do while not rs.eof
%> <tr> <td height="25" class="LEFTLINKS"><img width="30" height="0" align="absmiddle" /><b><%if rs("isleaf")=0 then%><a href="#" onClick="javascript:expandIt(kb<%=rs("id")%>);return false"><%else%><a href="<%=request.ServerVariables("SCRIPT_NAME")%>?idtree=<%=rs("idtree")%>" ><%end if%><%=server.HTMLEncode(right((rs("typename")&""),len(rs("typename")&"")-2))%></a></b></td> </tr> <% IF clng(id)=clng(rs("id")) then
%> <tr id="kb<%=rs("id")%>"> <% else
%>
<tr id="kb<%=rs("id")%>" style="display:none;"> <% end if %> <td> <table> <% dim rs1 strsql="select * from p_type where parentid="&rs("id")&" and slanguage=1 order by typename" set rs1=fgetrslist(strsql) do while not rs1.eof %> <tr><td height="20" class="LEFTLINKS"> <img width="40" height="0" align="absmiddle" /><a href="<%=request.ServerVariables("SCRIPT_NAME")%>?idtree=<%=rs1("idtree")%>&id=<%=rs("id")%>" ><%=server.HTMLEncode(right((rs1("typename")&""),len(rs1("typename")&"")-2))%></a></td></tr> <% rs1.movenext loop rs1.close set rs1=nothing %> </table> </td> </tr> <% rs.movenext
loop rs.close set rs=nothing %> </table>

10.计算网页文本的汉字字数,去掉了表格以外的所有标识。 Function GetLength(strChinese1) Dim strWord, ascWord, lenTotal strChinese1 = Trim(strChinese1)
If strChinese1 = "" Or Vartype(strChinese1) = vbNull Then GetLength = 0 Exit Function End If
lenTotal = 0 For GetLengthi=1 to Len(strChinese1) strWord = Mid(strChinese1, GetLengthi, 1) ascWord = Asc(strWord) If ascWord < 0 or ascWord > 127 then lenTotal = lenTotal + 1 Elseif ascWord = 63 And strWord <> "?" then lenTotal = lenTotal + 1 Elseif ascWord = 44 And strWord <> "," then lenTotal = lenTotal + 1 Elseif ascWord = 33 And strWord <> "!" then lenTotal = lenTotal + 1 Else lenTotal = lenTotal End If Next
GetLength = lenTotal End Function

11.<table width="95%" cellspacing="1" cellpadding="5" align=center bgcolor=999999> <tr bgcolor=#ffcc00><td colspan="2" height=25><b>服务器有关的变量</b></td></tr> <tr bgcolor=#efefef><td valign=top>显示客户发出的所有HTTP标题</td><td><%=request.ServerVariables("All_Http")%></td></tr> <tr bgcolor=#efefef><td valign=top>检取ISAPIDLL的metabase路径</td><td><%=request.ServerVariables("APPL_MD_PATH")%></td></tr> <tr bgcolor=#efefef><td valign=top>显示站点物理路径</td><td><%=request.ServerVariables("APPL_PHYSICAL_PATH")%></td></tr> <tr bgcolor=#efefef><td valign=top>路径信息</td><td><%=request.ServerVariables("PATH_INFO")%></td></tr> <tr bgcolor=#efefef><td valign=top>显示请求机器IP地址</td><td><%=request.ServerVariables("REMOTE_ADDR")%></td></tr> <tr bgcolor=#efefef><td valign=top>服务器IP地址</td><td><%=Request.ServerVariables("LOCAL_ADDR")%></td></tr> <tr bgcolor=#efefef><td valign=top>显示执行SCRIPT的虚拟路径</td><td><%=request.ServerVariables("SCRIPT_NAME")%></td></tr> <tr bgcolor=#efefef><td valign=top>返回服务器的主机名,DNS别名,或IP地址</td><td><%=request.ServerVariables("SERVER_NAME")%></td></tr> <tr bgcolor=#efefef><td valign=top>返回服务器处理请求的端口</td><td><%=request.ServerVariables("SERVER_PORT")%></td></tr> <tr bgcolor=#efefef><td valign=top>协议的名称和版本</td><td><%=request.ServerVariables("SERVER_PROTOCOL")%></td></tr> <tr bgcolor=#efefef><td valign=top>服务器的名称和版本</td><td><%=request.ServerVariables("SERVER_SOFTWARE")%></td></tr> <tr bgcolor=#efefef><td valign=top>服务器操作系统</td><td><%=Request.ServerVariables("OS")%></td></tr> <tr bgcolor=#efefef><td valign=top>脚本超时时间</td><td><%=Server.ScriptTimeout%> 秒</td></tr> <tr bgcolor=#efefef><td valign=top>服务器CPU数量</td><td><%=Request.ServerVariables("NUMBER_OF_PROCESSORS")%> 个</td></tr> <tr bgcolor=#efefef><td valign=top width=30%>服务器解译引擎</td><td><%=ScriptEngine & "/"& ScriptEngineMajorVersion &"."&ScriptEngineMinorVersion&"."& ScriptEngineBuildVersion %></td></tr> </table>

12.10进制表示,希望actor2222 (优悠) 能看到
MicrosoftVBscript运行时错误列表(10进制表示)
error # 5 无效的过程调用或参数 error # 5 无效的过程调用或参数 error # 6 溢出 error # 7 内存不够 error # 9 下标越界 error # 10 该数组为定长的或临时被锁定 error # 11 被零除 error # 13 类型不匹配 error # 14 字符串空间不够 error # 17 不能执行所需的操作 error # 28 堆栈溢出 error # 35 未定义过程或函数 error # 48 加载 DLL 时出错 error # 51 内部错误 error # 52 错误的文件名或号码 error # 53 文件未找到 error # 54 错误的文件模式 error # 55 文件已经打开 error # 57 设备 I/O 错误 error # 58 文件已存在 error # 61 磁盘已满 error # 62 输入超出了文件尾 error # 67 文件过多 error # 68 设备不可用 error # 70 没有权限 error # 71 磁盘没有准备好 error # 74 重命名时不能带有其他驱动器符号 error # 75 路径/文件访问错误 error # 76 路径未找到 error # 91 对象变量未设置 error # 92 For 循环未初始化 error # 94 无效使用 Null error # 322 不能创建必要的临时文件 error # 424 缺少对象 error # 429 ActiveX 部件不能创建对象 error # 430 类不支持 Automation 操作 error # 432 Automation 操作中文件名或类名未找到 error # 438 对象不支持此属性或方法 error # 440 Automation 操作错误 error # 445 对象不支持此操作 error # 446 对象不支持已命名参数 error # 447 对象不支持当前区域设置选项 error # 448 未找到已命名参数 error # 449 参数是必选项 error # 450 错误的参数个数或无效的参数属性值 error # 451 对象不是一个集合 error # 453 未找到指定的 DLL 函数 error # 455 代码资源锁定错误 error # 457 此键已与该集合的一个元素关联 error # 458 变量使用了一个 VBScript 中不支持的 Automation 类型 error # 462 远程服务器不存在或不可用 error # 481 无效图片 error # 500 变量未定义 error # 501 非法赋值 error # 502 对象不能安全用 Script 编程 error # 503 对象不能安全初始化 error # 504 对象不能安全创建 error # 505 无效的或无资格的引用 error # 506 类没有被定义 error # 507 出现一个意外错误 error # 1001 内存不够 error # 1002 语法错误 error # 1003 缺少 '':'' error # 1005 缺少 ''('' error # 1006 缺少 '')'' error # 1007 缺少 '']'' error # 1010 缺少标识符 error # 1011 缺少 ''='' error # 1012 缺少 ''If'' error # 1013 缺少 ''To'' error # 1014 缺少 ''End'' error # 1015 缺少 ''Function'' error # 1016 缺少 ''Sub'' error # 1017 缺少 ''Then'' error # 1018 缺少 ''Wend'' error # 1019 缺少 ''Loop'' error # 1020 缺少 ''Next'' error # 1021 缺少 ''Case'' error # 1022 缺少 ''Select'' error # 1023 缺少表达式 error # 1024 缺少语句 error # 1025 语句未结束 error # 1026 缺少整型常数 error # 1027 缺少 ''While'' 或 ''Until'' error # 1028 缺少 ''While'' 和 ''Until''或语句未结束 error # 1029 缺少 ''With'' error # 1030 标识符过长 error # 1031 无效数字 error # 1032 无效字符 error # 1033 未结束的字符串常量 error # 1034 注释未结束 error # 1037 无效使用 ''Me'' 关键字 error # 1038 ''loop'' 语句缺少 ''do'' error # 1039 无效的 ''exit'' 语句 error # 1040 循环控制变量 ''for'' 无效 error # 1041 名称重定义 error # 1042 必须是行中的第一个语句 error # 1043 不能为 non-ByVal 参数赋值 error # 1044 调用子程序时不能使用括号 error # 1045 缺少文字常数 error # 1046 缺少 ''In'' error # 1047 缺少 ''Class'' error # 1048 必须在一个类的内部定义 error # 1049 在属性声明中缺少 Let , Set 或 Get error # 1050 缺少 ''Property'' error # 1051 在所有属性的规范中,变量的数目必须一致 error # 1052 在一个类中不允许有多个缺省的属性/方法 error # 1053 类的初始化或终止程序没有变量 error # 1054 属性的 set 或 let 必须至少有一个变量 error # 1055 错误的 ''Next'' error # 1056 ''Default'' 只能在 ''Property'' , ''Function'' 或 ''Sub'' 中指定 error # 1057 指定 ''Default'' 时必须同时指定 ''Public'' error # 1058 只能在 Property Get 中指定 ''Default'' error # 4096 Microsoft VBScript 编译器错误 error # 4097 Microsoft VBScript 运行时错误 error # 5016 缺少正则表达式对象 error # 5017 正则表达式语法错误 error # 5018 错误的数量词 error # 5019 正则表达式中缺少 '']'' error # 5020 正则表达式中缺少 '')'' error # 5021 字符集越界

13.利用ASP获得图象的实际尺寸的示例 <!--#i nclude virtual="/learn/test/lib_graphicdetect.asp"--> <html><head> <TITLE>dbtable.asp</TITLE> </head> <body bgcolor="#FFFFFF"> <% graphic="images/learnaspiconmain.gif" HW = ReadImg(graphic) Response.Write graphic & " Dimensions: " & HW(0) & "x" & HW(1) & "<br/>" response.write "<img src="/sblog/"/" & graphic & """" response.write height=""" & HW(0) & """ response.write width=""" & HW(0) & "">" %> </body></html>
The library that is included is:
<% Dim HW
Function AscAt(s, n) AscAt = Asc(Mid(s, n, 1)) End Function
Function HexAt(s, n) HexAt = Hex(AscAt(s, n)) End Function
Function isJPG(fichero) If inStr(uCase(fichero), ".JPG") <> 0 Then isJPG = true Else isJPG = false End If End Function
Function isPNG(fichero) If inStr(uCase(fichero), ".PNG") <> 0 Then isPNG = true Else isPNG = false End If End Function
Function isGIF(fichero) If inStr(uCase(fichero), ".GIF") <> 0 Then isGIF = true Else isGIF = false End If End Function
Function isBMP(fichero) If inStr(uCase(fichero), ".BMP") <> 0 Then isBMP = true Else isBMP = false End If End Function
Function isWMF(fichero) If inStr(uCase(fichero), ".WMF") <> 0 Then isWMF = true Else isWMF = false End If End Function
Function isWebImg(f) If isGIF(f) Or isJPG(f) Or isPNG(f) Or isBMP(f) Or isWMF(f) Then isWebImg = true Else isWebImg = true End If End Function
Function ReadImg(fichero) If isGIF(fichero) Then ReadImg = ReadGIF(fichero) Else If isJPG(fichero) Then ReadImg = ReadJPG(fichero) Else If isPNG(fichero) Then ReadImg = ReadPNG(fichero) Else If isBMP(fichero) Then ReadImg = ReadPNG(fichero) Else If isWMF(fichero) Then ReadImg = ReadWMF(fichero) Else ReadImg = Array(0,0) End If End If End If End If End If End Function
Function ReadJPG(fichero) Dim fso, ts, s, HW, nbytes HW = Array("","") Set fso = CreateObject("Scripting.FileSystemObject") Set ts = fso.OpenTextFile(Server.MapPath("/" & fichero), 1) s = Right(ts.Read(167), 4) HW(0) = HexToDec(HexAt(s,3) & HexAt(s,4)) HW(1) = HexToDec(HexAt(s,1) & HexAt(s,2)) ts.Close ReadJPG = HW End Function
Function ReadPNG(fichero) Dim fso, ts, s, HW, nbytes HW = Array("","") Set fso = CreateObject("Scripting.FileSystemObject") Set ts = fso.OpenTextFile(Server.MapPath("/" & fichero), 1) s = Right(ts.Read(24), 8) HW(0) = HexToDec(HexAt(s,3) & HexAt(s,4)) HW(1) = HexToDec(HexAt(s,7) & HexAt(s,8)) ts.Close ReadPNG = HW End Function
Function ReadGIF(fichero) Dim fso, ts, s, HW, nbytes HW = Array("","") Set fso = CreateObject("Scripting.FileSystemObject") Set ts = fso.OpenTextFile(Server.MapPath("/" & fichero), 1) s = Right(ts.Read(10), 4) HW(0) = HexToDec(HexAt(s,2) & HexAt(s,1)) HW(1) = HexToDec(HexAt(s,4) & HexAt(s,3)) ts.Close ReadGIF = HW End Function
Function ReadWMF(fichero) Dim fso, ts, s, HW, nbytes HW = Array("","") Set fso = CreateObject("Scripting.FileSystemObject") Set ts = fso.OpenTextFile(Server.MapPath("/" & fichero), 1) s = Right(ts.Read(14), 4) HW(0) = HexToDec(HexAt(s,2) & HexAt(s,1)) HW(1) = HexToDec(HexAt(s,4) & HexAt(s,3)) ts.Close ReadWMF = HW End Function
Function ReadBMP(fichero) Dim fso, ts, s, HW, nbytes HW = Array("","") Set fso = CreateObject("Scripting.FileSystemObject") Set ts = fso.OpenTextFile(Server.MapPath("/" & fichero), 1) s = Right(ts.Read(24), 8) HW(0) = HexToDec(HexAt(s,4) & HexAt(s,3)) HW(1) = HexToDec(HexAt(s,8) & HexAt(s,7)) ts.Close ReadBMP = HW End Function
Function isDigit(c) If inStr("0123456789", c) <> 0 Then isDigit = true Else isDigit = false End If End Function
Function isHex(c) If inStr("0123456789ABCDEFabcdef", c) <> 0 Then isHex = true Else ishex = false End If End Function
Function HexToDec(cadhex) Dim n, i, ch, decimal decimal = 0 n = Len(cadhex) For i=1 To n ch = Mid(cadhex, i, 1) If isHex(ch) Then decimal = decimal * 16 If isDigit(c) Then decimal = decimal + ch Else decimal = decimal + Asc(uCase(ch)) - Asc("A") End If Else HexToDec = -1 End If Next HexToDec = decimal End Function %>