关于ASP中脚本履行顺序的讲授
核心提示:假设机房马上要关门了,或你急着要和MM约会,请直接跳到第4个自然段...
假设机房马上要关门了,或你急着要和MM约会,请直接跳到第4个自然段。
以下叙述的脚本包括服务器端脚本和客户真个脚本,服务器端脚本指在服务器上运行的那部份脚本,比如常见的Response.Write明显是在服务器上运行的,服务器端脚本可使用VBScript和JScript语言书写,在本文中全部使用VBScript,Jscript1个道理。
客户端脚本也能够以为包括VBScript和JavaScript两种语言,是在客户端浏览器上运行的脚本语言。比如我们访问1个网页,弹出1个消息框,这个就是用客户端脚本做的(alert, msgbox, etc),而且明显不是服务器端脚本能做到的。客户端脚本与服务器端脚本还有1个很大的辨别(在IE、Firefox等浏览器中),就是客户真个脚本可以访问文档对象模型(DOM),可以操纵页面中的对象(比如修改页面标题、修改1个div的innerHTML属性之类)。
首先我们先来了解1下ASP页面履行的流程
1.IIS找到ASP文件,提交给ASP引擎(1般是ASP.DLL)处理。
2.引擎打开这个ASP文件,找出<%和%>之间的内容,固然还有之间的内容,这些内容称为脚本块。只有脚本块里的内容被引擎解析,其他内容不管,作为没故意义的字符插在脚本块之间。有必要说明1下的是,实在被解析的内容还不止这些,类的服务器端包括文件也是由引擎包括进来并加以处理的。假设你读的程序比较多,你还会知道有的runAt属性标注为"Server"的
3.引擎履行脚本块中的脚本,这些服务器真个脚本是作为1个整体被履行的,也就是说,可以写出以下的代码:
以下为援用的内容:
<% |
引擎其实不会将这些脚本块分开解析,而使两个脚本块都产生语法毛病。所以我们得到以下结论:并非所有非服务器脚本的代码都会被发送到客户端,有可能这段非服务器脚本的代码被脚本块限制了。服务器是1定不会操心客户端脚本的履行题目的,但是可以通过服务器真个脚本输出不同的客户端脚本。
4.终极引擎产生了1个文本流,或说是脚本的履行结果,可以以为这是1个字符串,就是发送到客户端浏览器的网页的代码。客户端浏览器将页面显示出来,此时页面的源代码(源文件)是不包括服务器真个脚本的,但包括了服务器端脚本的履行结果(这是明显的)。
<% … %> 与
它们都是服务器真个脚本,同时被处理履行。他们履行时是作为1个整体的。
<% … %> 与
前者是服务器端脚本,后者是客户端脚本。前者先履行,后者后履行。
实在也不尽然,2者的脚本是有可能在同时被履行的,但空间不同,依然是:前者在服务器上履行,后者在客户端浏览器里履行。前者在逻辑上1定提早于后者履行。同时我们也得到结论:在同1个页面的履行中,客户端脚本不管如何不能反馈给服务器端脚本,也就是说,客户端浏览你的留言本并且提交新留言或是任何客户端脚本获得的值都不可能在同1次服务器响应中被处理。
关于组件的调用
留意服务器端脚本和客户端脚本都是脚本,自然都可以创建xmlhttp组件、ADODB.Connection组件等,但是其实不是放在哪里都可以的。
xmlhttp假设用于服务器的抓取网页(比如收集)就要在服务器脚本里创建了,而假设是用于客户真个ajax无刷新而后台访问服务器真个页面,那末就是运行于客户真个了,自然在客户端创建。
ADODB.Connection组件用于访问数据库,1般来讲在服务器端创建,究竟是服务器真个asp程序在跑数据库的数据,但假设你的数据库真的是在客户端连接的(比如这个http://bbs.bccn.net/thread⑵24966⑴⑵.html),那末就毫无疑问在客户端脚本里创建了。
总之,矛盾着的事物及其每1个侧面各有其特点。不同事物有不同的矛盾;同1事物在发展的不同进程和不同阶段上有不同的矛盾;同1事物中的不同矛盾、同1矛盾的两个不同方面各有其特殊性(看不懂的可以略往不看……)。这1原理要求我们坚持具体题目具体分析原则,在矛盾普遍性原理的指导下,具体分析矛盾的特殊性,并找出解决矛盾的正确方法。反对千篇1律地采取1种方法解决不同事物的矛盾。“1把钥匙开1把锁,到甚么山唱甚么歌”讲的就是这个道理。
服务器端VBScript脚本创建对象使用Server.CreateObject(className)方法,客户端VBScript脚本创建对象使用CreateObject(className)方法。
典型毛病
以下为援用的内容:
<% |
毛病分析:
混淆了服务器端脚本和客户端脚本的辨别。实际履行时我们会发现,客户端根本没有收到甚么TSize之类的代码,由于TSize是服务器真个程序,被引擎处理以后(留意引擎对函数的处理,纯洁是给服务器端脚本调用的,不会发回到客户端)就消失了,不可能在客户端起作用。这就是说,客户端脚本没法直接调用服务器端脚本的函数。
事实上,这个程序是有语法毛病的,引擎处理这段内容的时候先找到了<%和%>之间的内容,也就是<%TSize('变量')%>,明显这段内容不符合VBScript的语法规则。嗯,改成<%=TSize("变量")%>在服务器端脚本就没有语法毛病了,这时候TSize函数可以正常返回值"中国",因而客户端收到的href属性是这样写的:"javascript:中国",是没法履行的。
服务器端脚本对客户端脚本的影响
前面已说过了,服务器端脚本在逻辑上是提早于客户端脚本的履行的,因此这样的代码是可行的:
以下为援用的内容:
<% 关于Response.Redirect与javascript的履行题目 |
这是1种常见的毛病,编写者常常以为,这样写代码可使客户端先弹出“密码毛病”的提示然后转向到index.asp,事实上这不可能产生,即使将两行代码顺序交换,也不可能到达这类效果。
究其缘由,和服务器对两行代码的处理方式有关。这两行代码不可能同时起作用。
Response.Write是向客户端发送1段文本,这段文本的内容可以是1段脚本,那末客户端浏览器收到后可以履行这段脚本,留意,要收到以后才能履行。
而Response.Redirect是向客户端发送了1个HTTP头信息(甚么是HTTP头信息?这么说吧,比如对客户端Cookies的写进是HTTP头信息,HTTP头信息在HTTP的主体之前发回客户端浏览器,这就是为甚么有时我们把服务器的缓冲封闭以后修改Cookies会出错的缘由,由于主体已开始传送,不答应发送HTTP头信息了。),信息的内容告知客户端浏览器应当跳转页面浏览,留意,这个Redirect信息是立即起作用的,也就是说这个Redirect信息具有排他性,在缓冲打开的情况下,不管已使用Response.Write向缓冲里写进了多少内容,1旦调用Response.Redirect,将会清空缓冲,并且向客户端浏览器发送这个头指令。假设动态跟踪1下程序的履行,我们还会发现,在调用了Response.Redirect以后,程序停止履行了,所以留意服务器端程序在调用Response.Redirect之前要做好数据连接的封闭等操纵。
那末上面的例子应当怎样修改呢?假设你不愿意修改那个index.asp以加进脚本提示的话,那末只能将转向指令放到客户端脚本中履行,就像这样:
以下为援用的内容:
<% |
TAG:内容,服务器,脚本,客户端,服务器端
评论加载中...
|