ASP 3.0高级编程(十四)

编程|高级

4.3.3 执行其他的网页
ASP 3.0和IIS 5.0的新特性之一就是引入了可编程的服务器端重定向(server-side redirection)的概念。这意味着,可以把一个网页的控制和执行转到另外一个网页,而不需要在客户端使用Response.Rdedirect方法。
1. 客户端重定向带来的问题
ASP编程人员通常使用Response.Redirect语句把一个页面载入到当前正在执行的网页。然而,许多人没有意识到这条语句不会自动地使服务器立即装入和执行新的网页。其真正做的是把一个HTTP重定向报头(redirection header)增加到由Web服务器发送给客户的输出流中。这个报头如下:
HTTP/1.1 302 Object Moved
Location newpage.asp
在这个报头中的标准HTTP状态信息“302 Object Moved”,告知浏览器所要求的资源已经发生移动。Location报头提供相应的网页地址。当然这个地址不一定是真实的,现在正在做的事情就是“欺骗”浏览器,使浏览器认为可在另一个位置上找到所需要的网页。实际发生的是,服务器将执行所请求的网页,但是通知浏览器需要的网页已经发生移动。这就是在发送任何页面的内容到浏览器之前必须执行Redirect方法的原因。
当一个浏览器接受到“302 Object Moved”信息时,中断当前的请求并为Location值中指定的网页发送一个新的请求。这与在网页的<HEAD>段使用一个META HTTP-EQUIV标记时的工作方式相同,前面给出的HTTP报头还可写为:
<META HTTP-EQUIV=”REFRESH” CONTENT=”0;URL=newpage.asp”>
因此重定向实际上发生在客户机端,而不是在服务器上。如果在这个连接的客户端有一个代理服务器在使用的话,可能会引起显示虚假消息。这就是在使用Response.Redirect时,“The object you requested has been moved and can be found here”消息经常在客户机上显示的原因,正确地使用缓冲通常可以防止这个问题。
在IIS 4.0或更早的版本中使用Response.Redirect时,应该在ASP网页的开头打开缓冲,然后在执行Response.Redirect方法之前调用Response.Clear。当然,在ASP 3.0中网页缓冲的缺省状态为打开,因此这不成问题。只要在执行该语句之前使用Response.Clear,以前产生的输出将不会发送给客户。
2. 在ASP 3.0中服务器端的重定向
在ASP 3.0和IIS 5.0中,在几乎所有情况下,通过使用两个新的Server对象方法Execute和Transfer,可以避免使用客户端重定向。这两个方法使控制立即转到另一个网页,该网页可以是一个ASP网页或者是任何其他的资源,例如一个HTTP网页、压缩文件或其他类型的文件。
它们之间的不同之处是:Execute方法“调用”另一个的网页,与在脚本代码中调用一个子程序或函数非常相似。当另一个网页或资源已经执行完毕或传送到客户端时,控制返回到原网页中调用Execute方法的语句的下一条语句,并继续执行。而使用Transfer方法时,控制不再返回到原页面中,在控制传送到的网页或资源的末尾处,执行过程停止。
当前网页的环境也传送给了目标网页或资源,因此这两个方法更有用。网页环境包含了原有的ASP对象中的所有变量的值,例如Request、Response和Session对象的集合以及它们的所有属性。即使该网页不在同一个虚拟应用程序中,也将传送Application对象的环境。
结果是浏览器认为它仍在接收原先的页面,它并不了解服务器所做的事情。浏览器的地址栏一直显示相同的URL,并且Back、Forward和Refresh按钮正常地工作。在使用客户端重定向时,尤其是使用HTML META元素时,情况通常不是这样的。
传送到新的页面或资源的环境包括所有现存的事务状态(transaction state)。当前网页的环境用ASP的ObjectContext对象(在第1章中已经讨论过)进行封装。如果需要将这个对象作为一个正在进行的事务的一部分,可以在传送控制的目的页面中使用这个对象。
(1) Server对象的Execute和Transfer方法的使用
在前面的示例页面中,可以试验使用Excute和Transfer方法。该页面包含了在示例中已经提供的另一个文件名字another_page.asp,它作为这两个方法的缺省参数值,如图4-13所示:

图4-13 使用Execute和Transfer方法的屏幕
单击Server.Execute和Server.Transfer方法的按钮,提交到此窗体并重新装载该窗体。在这个页面顶部的脚本代码查看是哪个按扭被单击。如果是cmdExecute或cmdTransfer按钮,则把当前网页的路径写入到输出流中,然后调用相应的方法,并传送与该按钮相联系的文本框中的值,然后再把当前页面的路径写到输出流中。

If Len(Request.Form("cmdExecute")) Then
strPath = Request.Form("txtExecPath")
Response.Write "Currently executing the page: <B>" _
& Request.ServerVariables("SCRIPT_NAME") & "</B><BR>"
Server.Execute (strPath)
Response.Write "Currently executing the page: <B>" _
& Request.ServerVariables("SCRIPT_NAME") & "</B><BR>"
End If

If Len(Request.Form("cmdTransfer")) Then
strPath = Request.Form("txtTransferPath")
Response.Write "Currently executing the page: <B>" _
& Request.ServerVariables("SCRIPT_NAME") & "</B><BR>"
Server.Transfer (strPath)
End If

当单击Server.Excute方法的按钮时,会看到当前页面的路径,这是由上面代码中的第一条Response.Write语句创建并显示的。后面接着的内容是来自被执行的网页(another_page.asp)的一些输出内容。在这之后是第二个Response.Write语句的输出内容,这表明控制又回到了原先的网页,屏幕如图4-14所示:

图4-14 Server.Excute方法的演示
页面的两条水平线之间的段落(显示当前执行的网页为show_server.asp)来自原先的网页。在接下来的段落来自被执行的网页another_page.asp。下面是该页面的完整代码:
<%@ LANGUAGE=VBSCRIPT %>
<HR>
Currently executing the page: <B>another_page.asp</B><BR>
However the value of <B>Request.ServerVariables("SCRIPT_NAME")</B> is still <BR>
<B><% = Request.ServerVariables("SCRIPT_NAME") %></B>
because the <B>Request</B> collections hold<BR>
the same values as they had in the page that executed thi

时间: 2024-08-02 23:29:31

ASP 3.0高级编程(十四)的相关文章

ASP 3.0高级编程(四十)

编程|高级 8.5.1 Errors集合Errors集合包含由单个ADO命令的执行而引起的每一个错误的Error对象.使用Errors集合的原因是由于在一个命令的执行过程中,可能会引起多个错误,OLE DB提供者需要提供一种方式通知客户方已有多个错误发生.关于Errors集合有两个重要的地方需要注意:· 每次执行ADO命令,如果发生错误,就清空错误集,同时代之以新的错误内容.当然,如果没有错误发生,Errors集合不会受到影响.所以,即使ADO命令成功执行,这个集合中也可能含有错误信息.· OL

ASP 3.0高级编程(四十二)

编程|高级 5. 返回值对函数返回值的处理不同于存储过程返回值的处理,这常常导致混淆.在函数中,经常是返回一个布尔值来表明函数运行的成功与否.If SomeFunctionName() = True Then' Function succeeded但在调用一个存储过程时,却不能使用同样的方法,因为存储是用Execute方法运行的,同时返回一个记录集.Set rsAuthors = cmdAuthors.Execute如果得不到一个返回值,如何确定是否已正确执行存储过程?当发生错误时,会报告错误,

ASP 3.0高级编程(四十四)

编程|高级 第10章 ASP与客户端数据 在一本ASP专著中讨论客户端数据,这与服务器端的ASP编程是否矛盾?情况并非如此,因为我们至今尚未碰到只从事服务器端编程的ASP程序员.虽然ASP是一项服务器端技术,但可以想象,编程人员不可能仅仅使用ASP进行编程.从事ASP编程的Web开发人员,仍然需要与客户端数据进行交互.因此,围绕着ASP构建一个应用程序时必须考虑整个应用程序的情况,这也意味着必须考虑客户端.为了获得一个运行良好.快速响应的应用程序,需要很好地使用客户端数据.本章将讨论如何在客户端

ASP 3.0高级编程(四十五)

编程|高级 异步执行是指在后台检索数据,可以在全部数据返回之前在Web页面上使用已经得到的数据.虽然可能需要的是全部的数据,但异步工作至少可提前开始处理数据.也可让用户先看到某些内容,这使得Web站点看上去响应能力更强.与TDC类似,RDS数据控件可以通过设置OBJECT标记的参数或编写代码来设置其属性.下面举一个例子:<OBJECT CLASSID="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"ID="dsoAuthors&q

ASP 3.0高级编程(四十六)

编程|高级 表10-5 支持数据绑定的HTML元素HTML元素 绑定属性 可否更新数据 可否表格绑定 可否作为HTML显示 A href 不可 不可 不可 APPLET PARAM 可以 不可 不可 BUTTON innerText和innerHTML 不可 不可 可以 DIV innerText和innerHTML 不可 不可 可以 FRAME src 不可 不可 不可 IFRAME src 不可 不可 不可 IMG src 不可 不可 不可 INPUT checked 可以 不可 不可 TY

ASP 3.0高级编程(四十一)

编程|高级 9.2.3 存储过程存储过程的使用是Command对象得到应用的一个领域.存储过程(有时也称存储查询)是存储在数据库中预先定义的SQL查询语句.为什么应该创建和使用存储过程而不是在代码中直接使用SQL字符串呢?主要有以下几个理由:· 存储过程被数据库编译过.这样可以产生一个"执行计划",因此数据库确切地知道它将做什么,从而加快了过程的执行速度.· 存储过程通常被数据库高速缓存,这样使它们运行得更快,因为此时不需要从磁盘中读取它们.并非所有的数据库都支持这种缓存机制,比如微软

ASP 3.0高级编程(四十三)

编程|高级 9.3.5 数据高速缓存首先需要注意的是,数据高速缓存与记录集高速缓存虽然都用于改善性能,但两者是无关的.数据高速缓存是临时的数据存储区,允许使用高速缓存中的数据,而不是重新生成新的数据.这只适用于那些不经常改动但多次被访问的数据.在ASP中一个最简单的缓存数据的方法是使用Application和Session范围的变量.例如,假设有一些需要选择书类型的网页.正常情况下,可能会创建一个含有以下函数的包含文件.<%Function BookTypes() Dim rsBookTypes

ASP 3.0高级编程(四)

使用ServerVariables集合当讨论Request对象内容时,要研究的集合之一就是ServerVariables集合.这个集合包含了两种值的结合体,一种是随同页面请求从客户端发送到服务器的HTTP报头中的值,另外一种是由服务器在接收到请求时本身所提供的值.为显示ServerVariables集合中值的使用方式,在Request Object页面(Show_request.asp)中,点击"ServerVariables Examples"链接,打开另外一个页面,如下图所示:&l

ASP 3.0高级编程(二十九)

编程|高级 6.3.2 SA-FileUP组件在很多Web网站上,一个常规要求是,服务器接受客户机发送的文件的能力如何?在IIS 4.0里,Microsoft提供了一个名为Posting Acceptor组件完成这项工作,IIS 5.0和ASP 3.0的标准安装中没有该组件,如果安装Site Server Express的话,则需要包含这一组件.可以从Microsoft Web网站http://www.microsoft.com/windows/software/webpost/post_acc