服务器端文件包含及类似方法
1. Include关键字:- 语法:
<!-- #include file="./1.asp" --> File属性值对应着文件的相对地址。被包含的文件路径,不能是虚拟目录,路径中不能有变量。 可以使用 “../”代表代表父目录,此时要求在IIS配置中选中了“启用父路径”,默认为不启用。允许使用多个“../”返回到更高的目录。 可以使用“./”代表当前目录,也可以什么都不加,此时也代表当前目录。 不允许使用“/”根目录,不能使用两个“//”,也不能以“/”开始。 <!-- #include virtual="/1.asp" --> Virtual 属性对应的是虚拟地址。可以使用虚拟目录,路径中不能有变量。 可以使用“/”代表根目录,与不加意义相同,但为与其它语言习惯性兼容,应该加上。 不能使用“../”和“./”,可以在开始位置使用两个或两个以上的"//",意思与一个相同。
- 原理:
- 在ASP进行语法校验前,将被包含的文件(1.asp)的内容完全复制到当前页面。包含文件与被包含文件中的信息是可以交互使用的。
- 注意:
- 包含语句应放到 <%和%>语法标识外面;
- 被包含文件可以有执行能力,或是进行了各类定义的库文件,被包含文件可以为空;
- 如果文件不存在或没有读取权限将出错;
- 由于是将内容复制过来,如果在逻辑上出现对同一变量的重复定义(即对同一变量名多次使用了Dim关键字),是不允许的;
- “
<%@language="vbscript" CODEPAGE="936"%> ”、“Respnse.Buffer ”、“Option Explicit ”等语句有其放置特殊性,最好不要在被包含文件中使用。如果使用,应将这些信息放到统一的文件中,并使这个文件一页面的第一行被包含引用,而其它文件不要再有类似定义。
2. Server.Transfer方法:- 语法:
Server.Transfer(filePath)
filePath 可以是相对路径,也可是虚拟路径,可以存在有变量,如站点根目录配置。
- 原理:
- 停止当前文件的运行,后面的代码不再执行,并将控制权交给
filePath 的指定文件。两个文件中的信息不能互相使用,但使用相同的缓存。
- 注意:
filePath 应该对应一个有独立执行能力的文件,并且不能是0字节文件; - 由于调用本方法时,本页后面的代码不再执行,调用之前应关闭必要的对象;
- 只有在程序逻辑执行时,条件符合时,才会用到这个页面,并在此时检查页面是否存在;
- 如果前面的页面已经向客户输出内容,将不能再使用
Reponse.Buffer 等那些要求在输出前进行定义的属性,也不能使用Response.Redirect 方法;
3. Server.Execute方法:- 语法:
Server.Execute(filePath)
filePath 可以是相对路径,也可是虚拟路径,可以存在变量,如站点根目录配置。
- 原理:
- 用于停止当前文件运行,并将控制权交给作为一个参数传递的URL的限定文件,当该文件完成后,控制权会交给原始文件,继续执行Execute方法后面的语句。两个文件共用同一缓存,但不共用对方定义的变量和创建的对象。
- 注意:
- 与 Tansfer方法的注意事项相同,只是第二条不再适用,包含文件在被包含文件执行前使用的对象或变量,在 Execute方法执行后继续可用;
- 如果前面的页面已经向客户输出内容,将不能再使用
Reponse.Buffer 等那些要求在输出前进行定义的属性,也不能使用 Response.Redirect 方法; - 在被包含文件中,如果遇到
Response.End 或 Response.Redirect 方法,响应结束,包含文件中其它代码将不再执行,所以如果被包含文件存在这样的语句,就不要在包含文件中过早地建立对象,以防止无法关闭或释放。
4. 公共特性:- 被包含文件中所用的Request对象与当前文件完全一致;
- 无论是包含或跳转页再次包含或跳转其它任何页面,其对应的目录都是以首次被执行文件所在目录为当前目录;
- 在客户端看不到是否请求了被包含文件;
- 路径中的/ 与 \ 作用相同;
- 如果可以使用“../”或“./”,则可以出现在路径的中部,但这很不规范,似乎也没有必要;
- 多个“../”,会向上无限次寻找父目录;
- 不能路径中部出现连续的 /,后两种方法调用
Server.MapPath 方法解析地址; - 被包含文件必须有确定的文件名;
- 路径中不能有参数信息;
- 扩展名任意,都是调用ASP解析引擎进行解析;
- 被包含文件的扩展名任意,被包含文件中希望在服务器端进行解析执行的内容,要放到
<% %> 或<script runat="server"></script> 标记之间; - 文件路径中不能含有Querystring参数;
- 需要被包含的文件有Guest组中成员的读取权限;
- 任何文件中调用了
Response.End 方法,后面的代码将都不再执行。 - 任何文件调用
Response.Redirect 方法,都以第一个被请求文件所在目录为准;
5. 方法区别及使用建议:- 区别:只有在一个文件[A]中使用Include关键字的File属性时,包含的文件路径才以[A]文件所在目录为当前目录;
- 区别:在一个文件中使用Include关键字的Virtual属性时,包含的文件路径以根目录为准;
- 区别:Server.Transfer 或 Server.Execute 方法,以请求文件或最后一个通过File属性被包含的文件所在目录为当前目录 ;
- 区别:Server.Transfer 或 Server.Execute 方法,可以用来隐匿路径;
- 区别:Server.Transfer 或 Server.Execute 方法,可使用变量做路径参数;
- 区别:Server.Transfer 或 Server.Execute 方法,逻辑执行到此语句时才检察文件是否存在;
- 区别:Server.Transfer 或 Server.Execute 方法,页面级变量不再被共享;
- 建议:因为一些网站并不是放到根目录下,所以,最好使用Include关键字的File属性进行文件包含,特殊情况下才使用其它。
6. Response.Redirect方法:(用于页面间跳转,此方法与上面的三个的应用有本质的区别。) - 语法:
Response.Redirect(toURL) toURL参数可以是任意网站的任意页面,甚至是目录,但不能为空; 多个“../”,如果超出了根目录,以根目录为准;
- 原理:
- 告知浏览器转而请求另一个页面,其下面的代码将不被执行。
- 注意:
- 相当于调用了
Response.End 方法,所以在使用此方法前,应关闭必要的对象; - 在调用此方法前,应保证没有向客户端输出任何信息,所以尽可能在页首设置
Response.Buffer 属性为True,IIS6.0默认为True; - 目标文件扩展名任意,可以通过Querystring传递参数;
- toURL对应的文件使用全新的Request对象,并且是通过GET方法请求的,原来通过POST方法提交的信息不再可用,只是
Request.ServerVariables("HTTP_REFERER") 与首次请求的页面使用相同的值; - 在客户端的地址栏中显示的是toURL对应的地址;
- 如果目标文件属于本服务器,需要有Guests组中成员的读取权限;
|