|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
无法实现跨操作系统的应用。当然这也是微软的理由之一,只有这样才能发挥ASP最佳的能力。可是我却认为正是Windows限制了ASP,ASP的概念本就是为一个能让系统运行于一个大的多样化环境而设计的;server|工具
正像在后面看到的那样,经由过程服务器端包括的经ISAPI会见Web服务器的页面,用传统静态页面指令和命令能够做相称多的事变。但同时也有一些分明的限定。
比方,能够从Request.ServerVariables汇合检索到一切伴同客户真个哀求发送过去的HTTP报头的值。它几近能够与利用SSI#echo对抗,同时具有的次要长处是把这些值作为字符串前往到代码中(而#echo指令复杂地把这些值拔出到页面中),因而能够依据本人的希望来检索和保护这些字符串。很多不异的参数使用于#fsize和#flastmod指令,利用带有VBScript和JScript剧本引擎中的工具的剧本,一样也能够简单地猎取这个信息。在后续章节你将看到相干的细节。
#exec指令既十分有效,又遭到必定的限定。实践上该指令仅运转体系命令或定制的CGI使用程序,其实不能给剧本供应真实的对历程的把持。ASPServer工具供应了一种全新的办法,与#exec指令比拟,可以更平安和更简单地运转其他的使用程序或组件。固然,关于一些情形,特别是在的确必要实行一个操纵体系命令或一个原本的CGI使用程序的中央,#exec是没法替换的。
为了研讨Server工具,先提要先容其一切可用的办法和属性,然后再进一步具体地举行会商。
4.3.1ASPServer工具成员概述
Server工具是专为处置服务器上的特定义务而计划的,出格是与服务器的情况和处置举动有关的义务。因而供应信息的属性只要一个,却有七种办法用来以服务器特定的办法格局化数据、办理其他网页的实行、办理内部工具和组件的实行和处置毛病。
1.Server工具的属性
Server工具的独一一个属性用于会见一个正在实行的ASP网页的剧本超时价,如表4-2所示:
表4-2Server工具的属性及申明
特性
说明
ScriptTimeout
整型。缺省值为90。
设置或前往页面的剧本在服务器加入实行和呈报一个毛病之前能够实行的工夫(秒数)。到达该值后将主动中断页面的实行,并从内存中删除包括大概进进逝世轮回的毛病的页面大概是那些长工夫守候其他资本的网页。这会避免服务器因存在毛病的页面而过载。关于运转工夫较长的页面必要增年夜这个值
2.Server工具的办法
Server工具的办法用于格局化数据、办理网页实行和创立其他工具实例,如表4-3所示。
表4-3Server工具的办法及申明
方法
说明
CreateObject(“identifier”)
创立由identifier标识的工具(一个组件、使用程序或剧本工具)的一个实例,前往能够在代码中利用的一个援用。能够用于一个假造使用程序(global.asa页)创立会话层或使用程序层局限内的工具。该工具能够用其ClassID来标识,如“{clsid:BD96C556-65A3…37A9}”或一个ProgID串来标识,如“ADODB.Connection”
Execute(“url”)
中断以后页面的实行,把把持转到在url中指定的网页。用户确当前情况(即会话形态和以后事件形态)也传送到新的网页。在该页面实行完成后,把持传送回本来的页面,并持续实行Execute办法前面的语句
GetLastError()
前往ASPASPError工具的一个援用,这个工具包括该页面在ASP处置过程当中产生的比来一次毛病的具体数据。这些由ASPError工具给出的信息包括文件名、行号、毛病代码等等
HTMLEncode(“string”)
前往一个字符串,该串是输出值string的拷贝,但往失落了一切不法的HTML字符,如<、>、&和双引号,并转换为等价的HTML条目,即<、>、&、"等等
MapPath(“url”)
前往在url中指定的文件或资本的完全物理路径和文件名
Transfer(“url”)
中断以后页面的实行,把把持转到url中指定的页面。用户确当前情况(即会话形态和以后事件形态)也传送到新的页面。与Execute办法分歧,当新页面实行完成时,不回到本来的页面,而是停止实行历程
URLEncode(“string”)
前往一个字符串,该串是输出值string的拷贝,可是在URL中有效的一切字符,如?、&和空格,都转换为等价的URL条目,即%3F、%26和+
4.3.2创立其他工具的实例
在前一章中,会商了ASP的假造使用程序观点,懂得了假造使用程序经由过程ApplicationProtection设置为ASP网页中的组件和其他工具供应历程断绝。这持续了第1章的会商,即ASP的ObjectContext工具怎样为ASP网页供应运转情况,和怎样利用在不异的情况中运转的其他组件和工具。
ASPServer工具供应创立这些组件和使用程序实例的功效,因而可用来扩大ASP剧本的才能。经由过程完成CreateObject办法的一个特定版原本完成这个功效。
1.在VBScript和JScript中创立工具实例
在VB或VBA中,可以使用多种办法创立工具的实例。可使用New关头字来创立指定范例的一个新工具:
DimobjNewObjectAsNewMyComponent
但是,不克不及在ASP顶用VBScript或JScript这么做,由于这些剧本引擎不克不及完成数据范例界说。不克不及声明一个变量为恣意指定的数据范例,其变量都是Variants范例,或一个等价的范例(依据利用的剧本言语而定)。
在VB和VBA中另外一个办法是利用CreateObject或GetObject办法。CreateObject办法的参数是一个ClassID(一般情形)或一个ProgID字符串,它前往响应范例的一个新工具:
SetobjNewObject=CreateObject(“ADODB.Connection”)
当具有一个指定的文档范例,而且想创立一个能够处置这类文档的工具实例时,一般利用GetObject办法:
SetobjExcel=GetObject(“C:myfilessales.xlw”)
也能够指定所必要的工具范例和文件名,在几种工具都能处置该文档范例的情形下,这类做法长短常有效的:
SetobjExcel=GetObject(“C:myfilessales.xlw”,”Excel.Application”)
VBScript撑持CreateObject和GetObject办法。JScript也有getObject办法,与VBScript中的GetObject事情体例不异。JScript中的ActiveXObject完成了与VBScript的CreateObject办法不异的功效。但这个函数常与JScript的new运算符协同利用:
ObjNewObject=newActiveXObject(“This.object”);
除VB的NEW关头字在VBScript和JScript中不予撑持之外,可以利用一切这些手艺在一个ASP网页中创立工具的实例。但是,可以其实不意味着应当,并且年夜多半情形下不该该在一个ASP网页中利用剧本引擎的工具创立函数。
2.在ASP网页中创立工具实例
为了了解一样平常的剧本引擎工具创立办法为何在ASP网页中利用效果不睬想,需进一步对ASP中的情况和ObjectContext工具举行会商。
利用剧本引擎的一样平常办法在一个ASP网页中创立一个工具实例时,该工具在以后实行的页面的情况中并未实例化。得不到ObjectContext工具的援用,以是不克不及利用该工具来会见页面的情况,即不克不及会见该页面情况中的值。
这意味着该工具不克不及利用内置的ASP工具,即不克不及够会见在Request、Response、Application和Session工具的汇合中的值,也不克不及利用内置的ASP工具供应的办法和属性。该工具也不克不及够与此情况中任何现有的事件举行交互。假如产生毛病,不克不及利用ObjectContext办法保持一个事件。
固然,你大概不想与该网页的情况举行交互。可是有其他的来由申明利用一样平常的工具创立办法一般是不明智的。IIS主动地在COM+运转期包装程序hllhost.dll中实例化工具,使得该工具能够在以后的假造使用程序中完整地共享和从头利用(缺省的Web网站自己是一个假造的使用)。
你在上一章所看到的对一个假造使用程序的设置,既同意在Web服务器的内存空间中创立工具,也能够在共享的或自力的历程外DLLHost.dll实例中创立工具。假如利用一样平常的剧本引擎工具创立办法,将绕过一切的组件断绝和可扩大特征。而在利用ASPServer工具的CreateObject办法时会主动地供应这些特征。
3.Server工具的CreateObject办法
为了实验CreateObject办法,翻开示例的Chapter04主菜单页,单击“UsingtheASPServerObject”链接,如-10所示:
这个链接翻开一个名为show_server.asp的网页,该页面能够用来实验一切的Server工具的办法。它同时也显现Server工具独一的属性ScriptTimeout的值、其缺省值是90秒,如-11所示:
在该页面的“CreateanInstanceofaComponent”地区,有一个文本框,能够在个中键进想要在该网页的情况中创立的工具的ProgID字符串,乃至能够键进一个ClassID数值。这里文本框的缺省值已设置为一个来自ActiveX数据工具库的公用工具的ProgID:ADODB.Connection。
单击“Server.CreateObject”选项旁的按钮,把该页面提交给其本身,由于一切的控件都在一个带有ACTION属性的<FORM>上,而这个ACTION属性被设置为这个网页的路径和文件名:
…
FORMACTION="<%=Request.ServerVariables("SCRIPT_NAME")%>"METHOD="POST">
<P><DIVCLASS="subhead">CreateanInstanceofaComponent</DIV>
<INPUTTYPE="SUBMIT"NAME="cmdCreateObject"VALUE="">
Server.CreateObject("
<INPUTTYPE="TEXT"NAME="txtProgID"SIZE="25"VALUE="ADODB.Connection">
")<P>
…
</FORM>
…
当该页面从头载进时,该页中的一段ASP代码(位于<FORM>段的后面)将检察提交该窗体时,单击了哪一个按钮。假如是称号为“cmdCreateObject”的按钮时,该代码将读取文本框中的ProgID字符串。为避免用户输出的ProgID有效而招致实行中断,封闭缺省的剧本毛病处置,再实验利用Server.CreateObject办法创立一个工具的实例。最初,再从头翻开缺省的毛病处置,经由过程利用IsObject函数反省是不是创立了一个工具实例,并显现一个响应的信息:
QUOT=Chr(34)double-quotecharacter
…
lookforacommandsentfromtheFORMsectionbuttons
IfLen(Request.Form("cmdCreateObject"))Then
strProgID=Request.Form("txtProgID")
OnErrorResumeNext
SetobjObject=Server.CreateObject(strProgID)
OnErrorGoto0
IfIsObject(objObject)Then
Response.Write"<B>Results:</B><BR>SucessfullycreatedobjectwithProgIDof<B>"_
"&strProgID"&"</B><HR>"
Else
Response.Write"<B>Results:</B><BR>FailedtocreateobjectwithProgIDof<B>"_
"&strProgID"&"</B><HR>"
EndIf
EndIf
…
-12所示的是创立ADODB.Connection工具的了局。能够看到该工具已被一般实例化,已能够在代码中利用。
本章不会商怎样利用这些工具,你大概已对此很熟习了。一旦创立了工具实例,就能够像在任何其他情形中一样利用它。挪用工具的办法,读取或设置属性,与利用VB时一样;大概用扫瞄器中客户真个VBScript、JScript利用它。
在接上去的章节中将对工具和组件的利用举行加倍具体的先容。我们将研讨由剧本引擎完成的一些工具,和IIS5.0/ASP3.0中的可安装组件,另有一些其他的收费或商用的组件,并会商在各类情形下怎样选择响应的组件。在本书的前面,乃至会申明创立本人的可以在ASP中利用的组件长短常复杂的。
4.3.3实行其他的网页
ASP3.0和IIS5.0的新特征之一就是引进了可编程的服务器端重定向(server-sideredirection)的观点。这意味着,能够把一个网页的把持和实行转到别的一个网页,而不必要在客户端利用Response.Rdedirect办法。
1.客户端重定向带来的成绩
ASP编程职员一般利用Response.Redirect语句把一个页面载进到以后正在实行的网页。但是,很多人没无意识到这条语句不会主动地使服务器当即装进和实行新的网页。其真正做的是把一个HTTP重定向报头(redirectionheader)增添到由Web服务器发送给客户的输入流中。这个报头以下:
HTTP/1.1302ObjectMoved
Locationnewpage.asp
在这个报头中的尺度HTTP形态信息“302ObjectMoved”,告诉扫瞄器所请求的资本已产生挪动。Location报头供应响应的网页地点。固然这个地点纷歧定是实在的,如今正在做的事变就是“棍骗”扫瞄器,使扫瞄器以为可在另外一个地位上找到所必要的网页。实践产生的是,服务器将实行所哀求的网页,可是关照扫瞄器必要的网页已产生挪动。这就是在发送任何页面的内容到扫瞄器之前必需实行Redirect办法的缘故原由。
当一个扫瞄器承受到“302ObjectMoved”信息时,中止以后的哀求并为Location值中指定的网页发送一个新的哀求。这与在网页的<HEAD>段利用一个METAHTTP-EQUIV标志时的事情体例不异,后面给出的HTTP报头还可写为:
<METAHTTP-EQUIV=”REFRESH”CONTENT=”0;URL=newpage.asp”>
因而重定向实践上产生在客户机端,而不是在服务器上。假如在这个毗连的客户端有一个代办署理服务器在利用的话,大概会引发显现子虚动静。这就是在利用Response.Redirect时,“Theobjectyourequestedhasbeenmovedandcanbefoundhere”动静常常在客户机上显现的缘故原由,准确地利用缓冲一般能够避免这个成绩。
在IIS4.0或更早的版本中利用Response.Redirect时,应当在ASP网页的开首翻开缓冲,然后在实行Response.Redirect办法之前挪用Response.Clear。固然,在ASP3.0中网页缓冲的缺省形态为翻开,因而这不成成绩。只需在实行该语句之前利用Response.Clear,之前发生的输入将不会发送给客户。
2.在ASP3.0中服务器真个重定向
在ASP3.0和IIS5.0中,在几近一切情形下,经由过程利用两个新的Server工具办法Execute和Transfer,能够制止利用客户端重定向。这两个办法使把持当即转到另外一个网页,该网页能够是一个ASP网页大概是任何其他的资本,比方一个HTTP网页、紧缩文件或其他范例的文件。
它们之间的分歧的地方是:Execute办法“挪用”另外一个的网页,与在剧本代码中挪用一个子程序或函数十分类似。当另外一个网页或资本已实行终了或传送到客户端时,把持前往到原网页中挪用Execute办法的语句的下一条语句,并持续实行。而利用Transfer办法时,把持不再前往到原页面中,在把持传送到的网页或资本的开端处,实行历程中断。
以后网页的情况也传送给了方针网页或资本,因而这两个办法更有效。网页情况包括了原本的ASP工具中的一切变量的值,比方Request、Response和Session工具的汇合和它们的一切属性。即便该网页不在统一个假造使用程序中,也将传送Application工具的情况。
了局是扫瞄器以为它仍在吸收本来的页面,它其实不懂得服务器所做的事变。扫瞄器的地点栏一向显现不异的URL,而且Back、Forward和Refresh按钮一般地事情。在利用客户端重定向时,特别是利用HTMLMETA元素时,情形一般不是如许的。
传送到新的页面或资本的情况包含一切现存的事件形态(transactionstate)。以后网页的情况用ASP的ObjectContext工具(在第1章中已会商过)举行封装。假如必要将这个工具作为一个正在举行的事件的一部分,能够在传送把持的目标页面中利用这个工具。
(1)Server工具的Execute和Transfer办法的利用
在后面的示例页面中,能够实验利用Excute和Transfer办法。该页面包括了在示例中已供应的另外一个文件名字another_page.asp,它作为这两个办法的缺省参数值,如-13所示:
单击Server.Execute和Server.Transfer办法的按钮,提交到此窗体偏重新装载该窗体。在这个页面顶部的剧本代码检察是哪一个按扭被单击。假如是cmdExecute或cmdTransfer按钮,则把以后网页的路径写进到输入流中,然后挪用响应的办法,并传送与该按钮相接洽的文本框中的值,然后再把以后页面的路径写到输入流中。
…
IfLen(Request.Form("cmdExecute"))Then
strPath=Request.Form("txtExecPath")
Response.Write"Currentlyexecutingthepage:<B>"_
&Request.ServerVariables("SCRIPT_NAME")&"</B><BR>"
Server.Execute(strPath)
Response.Write"Currentlyexecutingthepage:<B>"_
&Request.ServerVariables("SCRIPT_NAME")&"</B><BR>"
EndIf
IfLen(Request.Form("cmdTransfer"))Then
strPath=Request.Form("txtTransferPath")
Response.Write"Currentlyexecutingthepage:<B>"_
&Request.ServerVariables("SCRIPT_NAME")&"</B><BR>"
Server.Transfer(strPath)
EndIf
…
当单击Server.Excute办法的按钮时,会看到以后页面的路径,这是由下面代码中的第一条Response.Write语句创立并显现的。前面接着的内容是来自被实行的网页(another_page.asp)的一些输入内容。在这以后是第二个Response.Write语句的输入内容,这标明把持又回到了本来的网页,屏幕如-14所示:
页面的两条程度线之间的段落(显现以后实行的网页为show_server.asp)来自本来的网页。在接上去的段落来自被实行的网页another_page.asp。上面是该页面的完全代码:
<%@LANGUAGE=VBSCRIPT%>
<HR>
Currentlyexecutingthepage:<B>another_page.asp</B><BR>
Howeverthevalueof<B>Request.ServerVariables("SCRIPT_NAME")</B>isstill<BR>
<B><%=Request.ServerVariables("SCRIPT_NAME")%></B>
becausethe<B>Request</B>collectionshold<BR>
thesamevaluesastheyhadinthepagethatexecutedthisone.<BR>
<FORMACTION="<%=Request.ServerVariables("HTTP_REFERER")%>"METHOD="POST">
<INPUTTYPE="SUBMIT"NAME="cmdOK"VALUE="">
Returntothepreviouspage<P>
</FORM>
<HR>
注重,该页面实行时,不克不及利用Request.ServerVariables(“SCRIPT_NAME”)猎取它的路径,由于情况仍旧是原网页的。我们不能不把页面名作为文本写进,由于其实没有举措能够从ASP情况中间接猎取。
这里包含了一个前往前一个网页的按钮的缘故原由是,经由过程在主网页中单击绝对应的按钮,可使用Server.Transfer办法挪用这个页面。此次看到了完整不异的输入,只是没有第二次路径输入,由于是“传送”这个页面而不是“实行”该页面,以是把持不会回传给本来的网页,如-15所示:
(2)从ASP实行SSI网页
今朝有了一个办法,假如必要的话可在ASP网页中乐成地利用SSI指令。固然这类请求不常呈现,但可完成。已往的成绩是,因为在SSI网页(文件扩大名是.stm、.shtml和.shtm)中不克不及包括ASP代码,以是程序不克不及“无缝”地重定向回到本来的网页,必需增添一个按钮或链接,以装载本来的或别的的ASP网页。
如今,因为有了Server.Execute办法,能够实行一个SSI网页而且将把持主动前往到本来的网页,客户端认识不到这些历程正在举行。客户端只是看到本来的ASP网页和实行了局。来自于SSI网页的任何输入都“无缝”地拔出到流中。固然,假如在SSI网页完成后,不想使本来的网页持续实行,可使用Server.Transfer办法。
为了看到这个手艺的实行,把后面利用过的CGI-SSI例子网页的假造路径输出到Server.Excute办法(或Server.Transfer办法)的文本框中。这个路径是“../ssi_cgi/ssi_cgi.stm”。在单击按钮对Execute或Transfer办法举行挪用今后,将看到.stm网页已实行,个中有SSI指令的了局。在来自ssi_cgi.stm的内容以后呈现的是本来的网页的其他部分,固然在-16中看不到,但可经由过程转动条看到该内容。
3.SSI#exec指令的不敷
遗憾的是Execute和Transfer办法一样平常不克不及与SSI的#exec指令一同事情,由于包括这个指令的.stm网页会在挪用它的ASP网页的情况中运转。在年夜多半情形下,它必要运转于间接援用该网页的一个自力的情况中。
存在如许的限定真是遗憾,假如没有这类限定,我们经由过程Server.Execute实行的网页能够“不成看法”包括来自于ASP网页的#exec指令。对后面的经由过程netstop和netstart命令中断和启动IndexingService的示例来讲,它多是一种幻想的办理计划。
可是,我们必需乞助于老的和已考证的办法。当用户单击一个按钮时,复杂地利用Response.Redirect办法来翻开相干的网页:
<%
‘LookforacommandsentfromtheFORMsectionbuttons
IfLen(Request.Form(“cmdStop”))Then
Response.Redirect(“exec/stop_cisvc.stm”)
EndIf
IfLen(Request.Form(“cmdStart”))Then
Response.Redirect(“exec/start_cisvc.stm”)
EndIf
%>
能够试着把利用#exec指令的一个SSI网页的假造路径输出到示例页面的Server.Execute和Server.Transfer办法的文本框中。后面利用过的#exec示例的假造路径是“../ssi_cgi/exe/start_cisvc.stm”和“../ssi_cgi/exec/stop_cisvc.stm”。
4.3.4Server工具的毛病处置
ASP没有毛病处置机制一向遭到品评。
在VBScript中,有一个OnErrorResumeNext语句,它使剧本注释器疏忽运转期毛病并持续剧本代码的实行。接着该剧本能够反省Err.Number属性的值,辨别是不是呈现了毛病。假如呈现毛病,前往一个非零值。在ASP3.0中,也能够利用OnErrorGoto0“转回到”缺省的毛病处置。在ASP2.0中实践也举行这类处置,可是没有响应文档申明。
在Jscript中,有一个新的毛病处置功效:C言语作风的try和catch语句。但是一切的这些毛病处置手艺都不是由ASP或IIS完成的,而是由ASP利用的剧本引擎完成的。
第7章专门会商剧本和剧本引擎触及到的调试和毛病处置手艺。
同时,ASP和IIS的开辟小组已增添了一个新的功效,用于在ASP网页中举行毛病处置。这分为两个部分:IIS毛病页面的设置及利用ASP的一个新的办法和工具。
1.Server工具的GetLastError办法
在ASP3.0中,Server工具有一个名为GetLastError的新办法。与VBScript的Err工具分歧,不克不及为检察是不是呈现了毛病而随时挪用该办法,只能在一个ASP定制的毛病网页中利用。假如像对Err工具举行操纵那样,经由过程封闭缺省的毛病处置(用OnErrorResumeNext语句)来利用,则GetLastError办法不克不及会见毛病的具体数据。
GetLastError办法要做的事变是供应更多的有关毛病源和毛病缘故原由的信息。GetLastError办法创立并前往一个工具的援用,该工具是一个名为ASPError的新工具。这个工具具有一系列的属性,这些属性前往有关在GetLastError办法挪用之前呈现的最新毛病的信息。
2.ASPError工具的属性
ASPError工具供应了九个属性申明所呈现的毛病的性子和毛病源,并前往激发毛病的实践代码,其属性及申明如表4-4所示:
表4-4ASPError工具的属性及申明
属性
说明
ASPCode
整型。由ASP/IIS发生的毛病号,比方0x800A009
ASPDescription
字符串型。假如这个毛病是与ASP相干的毛病,这个属性是毛病的具体申明
Category
字符串型。毛病源,即ASP外部剧本言语、或一个工具
Column
整型。发生毛病的文件中的字符地位
Description
字符串型。毛病的冗长申明
File
字符串型。毛病呈现时正在处置的文件的称号
Line
整型。发生毛病的文件中的行号
Number
整型。一个尺度的COM毛病代码
Source
字符串型。激发毛病的行的实践代码
3.设置“单个网页”毛病处置
在IIS中“难以想象”地呈现一个毛病(比方404NotFound)时,页面看起来像是从服务器前往给客户真个一个毛病信息页面,但实践上并非如许。它们是一般的HTML网页,在对一个毛病举行呼应时被下载而且发送给客户端。这些网页一般称为定制的毛病网页(customerrorpage)。
但是,毛病网页作为IIS的缺省安装部分,可依据请求定制。现实上,也能够在IIS的初期版本中创建定制的毛病网页。
在IIS4.0中,能够为每种分歧范例的HTTP协定或服务器毛病指定一个定制的毛病网页,为服务器上恣意的Web网站中的每一个目次创建一个定制的毛病信息网页。
(1)IIS缺省的毛病网页
由IIS供应的缺省毛病页面放在Web服务器的WinNTHelp目次中。在Windows2000中的IIS5.0的情况下,该页面放在WinNTHelpiishelpcommon目次下,如-17所示:
可在扫瞄器中翻开这些文件检察了局,大概在文本编纂器中检察HTML源程序和剧本代码。当一个404毛病呈现时,利用的页面是404b.htm,这个文件包括一个客户端剧本代码部分,它取得以后文档的URL(从document工具的url属性中检索)并在该页面中显现:
<tr>
<tdwidth="400"colspan="2"><fontstyle="COLOR:000000;FONT:9pt/11pt宋体">您正在搜刮的网页大概已删除、改名或临时不成用。</font></td>
</tr>
<tr>
<tdwidth="400"colspan="2"><fontstyle="COLOR:000000;FONT:9pt/11pt宋体">
<hrcolor="#C0C0C0"noshade>
<p>请实验以下操纵:</p>
<ul>
<li>假如您在“地点”栏中键进了网页地点,请反省其拼写是不是准确。<br>
</li>
<li>翻开<script>
<!--
if(!((window.navigator.userAgent.indexOf("MSIE")>0)&&(window.navigator.appVersion.charAt(0)=="2")))
{
Homepage();
}
//-->
</script>主页,寻觅指向所需信息的链接。</li>
…
<script>
functionHomepage(){
<!--
DocURL=document.URL;
protocolIndex=DocURL.indexOf("://",4);
serverIndex=DocURL.indexOf("/",protocolIndex+3);
BeginURL=DocURL.indexOf("#",1)+1;
urlresult=DocURL.substring(BeginURL,serverIndex);
displayresult=DocURL.substring(protocolIndex+3,serverIndex);
document.write(<AHREF="+urlresult+">+displayresult+"</a>");
}
//-->
</script>
这会发生你常常看到的页面,如-18所示:
(2)IIS中毛病网页的映照
当IIS检测到一个毛病时,会把响应的毛病页面传送给客户端。怎样辨别应当向客户端发送那一个页面?很分明,网页的名字应具有办理这个成绩的一些信息,但现实上文件名是不主要的。毛病和毛病网页文件之间的映照干系是在每一个目次的properties对话框的CustomErrors选项卡中决意的。
在InternetServicesManager中,在想编纂映照干系的目次上单击右键,并选择Properties。假如对示例文件举行设置,在Chapter04目次当选择server子目次,如-19所示:
Properties对话框的CustomErrors选项卡在IIS安装时(除非已举行过修正)设置了缺省映照干系的列表,如-20所示:
接近该列表的底部是HTTP毛病500:100的一个条目。范例500毛病是由ASP发生的,能够从中看出一些毛病已与毛病网页创建了映照干系。这些毛病都是一样平常性的毛病,好比“InvalidApplication”、“ServerShuttingDown”等等。但是,假如ASP载进包括语法毛病的页面,大概呈现一个运转期毛病,则呈现500:100毛病页面。在列表中显现的缺省映照干系标明,在这个目次中的一个文件呈现上述毛病时,将实行500-100.asp页面。
当一个ASP毛病呈现时,我们所看到的信息不再是一个一般的Web网页,而是一个ASPWeb网页(也就是说它具有文件扩大名.asp)。也能够依据必要编纂该映照干系来指向另外一个页面。
(3)指定一个定制的毛病网页
单击CustomErrors选项中的EditProperties按钮,翻开ErrorMappingProperties对话框。在MessageType下拉列表当选择URL,键进本人的定制毛病网页的完全假造路径,如-21所示:
在-21中给出的值指向我们创立的与示例网页一同利用的一个定制毛病网页。依据你安装示例文件的详细地位,大概要利用分歧的路径。
如今不管什么时候呈现一个500:100范例的毛病,将翻开我们的定制毛病页面。MessageType的其他两个选项是:
・Default(缺省):能够复杂地输出一个短的文本信息,而不是指定一个发送给客户真个页面。
・File(文件):指定一个HTTP毛病网页的物理路径。
在选择File选项时,指定的网页由IIS载进,载进的体例与在WindowsExplorer中双击要载进的文件时的体例不异。这意味着ASP网页不克不及利用这个选项,由于在这类情形下不会实行个中的任何剧本。
4.利用GetLastError办法和ASPError工具
设置好IIS后,在编纂了毛病映照属性的目次内的任一页面上呈现一个与ASP相干的毛病时,都将载进定制毛病页面。实践上,如今已设置了一个一般的剧本毛病圈套,由于在这个目次内的任何一个网页上的ASP运转期毛病都将触发定制毛病页面。
现实上在外部IIS经由过程Server.Transfer办法举行这类操纵,这意味着可以会见正在运转的原网页的全体情况。能够在剧本情况中猎取信息,如许能够依据所呈现的毛病决意要做些甚么。在此基本上,能够在定制的毛病网页中检索ASPError工具,找到引发载进页面堕落的毛病的一切信息。
在IIS4.0中,编纂毛病映照属性要做一些相似的事情。可是只要一样平常的500毛病(“InternalServerError”)在映照中是可用的。别的,当定制毛病网页载进时,不会传送网页的情况,除供应一个非特定的毛病信息外,做其他任何事情都是对照坚苦的。
在之前例子中已利用过ASPServerObject示例页面,在个中能够看到ASPError工具的具体情形。单击Server.GetLastError()对应的按钮,如-22所示:
这个操纵会从头载进该网页,个中的ASP剧本检察点击的是哪一个按钮。假如是Server.GetLastError()对应的名为cmdGetError的按钮,将实行一些示例代码,这些代码将会发生一个运转期剧本毛病。
…
IfLen(Request.Form(“cmdGetError”))Then
DimarrThis(3)
ArrThis(4)=“Causesanerror”
EndIf
…
由于已对这个目次设置了毛病网页映照,即设置为装进定制毛病页面,以是当毛病呈现时,就翻开这个页面(经由过程Server.Transfer办法在背景不成看法事情),见-23所示:
(1)示例毛病网页代码的功效
定制毛病网页显现ASPError工具属性的一切值,并经由过程利用Response.Status办法,把一个HTTP报头形态动静前往给客户端,指明呈现了一个毛病。接着利用GetLastError办法猎取对ASPError工具的一个援用,因而能够会见毛病的具体数据:
…
<%
Response.Status="500InternalServerError"
SetobjASPError=Server.GetLastError()
%>
Currentlyexecutingthepage:<B>show_error.asp</B><P>
<B>ErrorDetails:</B><BR>
ASPError.ASPCode=<%=objASPError.ASPCode%><BR>
ASPError.Number=<%=objASPError.Number%>(0x<%=Hex(objASPError.Number)%>)<BR>
ASPError.Source=<%=Server.HTMLEncode(objASPError.Source)%><BR>
ASPError.Category=<%=objASPError.Category%><BR>
ASPError.File=<%=objASPError.File%><BR>
ASPError.Line=<%=objASPError.Line%><BR>
ASPError.Column=<%=objASPError.Column%><BR>
ASPError.Description=<%=objASPError.Description%><BR>
ASPError.ASPDescription=<%=objASPError.ASPDescription%>
<FORMACTION="<%=Request.ServerVariables("HTTP_REFERER")%>"METHOD="POST">
<INPUTTYPE="SUBMIT"NAME="cmdOK"VALUE="">
Returntothepreviouspage<P>
</FORM>
值得注重的一点是,假如一个剧本或ASP毛病呈现在定制毛病网页中,IIS将仅仅前往一个与毛病代码500:100对应的一样平常性动静。这多是剧本引擎本人的毛病动静,大概只是相称复杂的动静:“InternalServerError”。不会再次从头载进定制的毛病网页。
包括毛病的网页的全体情况将传送给定制毛病网页。也就是说,可使用存储在任何ASP外部工具汇合或属性中的值。比方,假如检索来自Request.ServerVariables汇合的HTTP_REFERER值,它将反应挪用原网页的网页(即在毛病呈现之前的网页)的URL。在服务器把实行转到毛病网页时,这个值不会产生变更,而且它将不包括当毛病产生时正在实行的网页的URL。
一样,SCRIPT_NAME值将是包括该毛病的网页的名字,而不是毛病网页的URL。在一个毛病网页已装进时,经由过程反省扫瞄器地点栏中的URL,能够对此举行确认。可是在原网页的剧本变量中存储的值,在定制的毛病网页中都是不成用的。
假如原ASP网页正在一个事件内运转,即在网页的最后面包括有一个<%@TRANSACTION=”…”%>指令,也应当断定是不是必要在网页中接纳一些办法,以加入该事件。比方能够挪用内置ObjectContext工具的SetAbort办法:
objectContext.SetAbort‘FailthetransactionifanASPerroroccurs
在本书的前面将先容与事件的相干全体内容。
(2)利用ASPError工具的属性
关于利用ASPError工具的属性,有以下几点值得注重的:
・即便没有呈现毛病,Number属性应当一向有一个值。假如ASP网页挪用GetLastError办法时没有毛病呈现,该属性的值是0。一般情形下,对ASP剧本的运转期毛病,Number属性前往十六进制的值“0x800A0000”,加上尺度的剧本引擎毛病代码。比方,后面的例子对“SubscriptoutofRange”毛病的前往值为“0x800A0009”,由于VBScript对该范例毛病的毛病代码是“9”。
・当呈现已过一个毛病时,Category和Description属性将一向有一个值。
・APSCode属性的值由IIS发生,对年夜多半剧本毛病将为空。更多情形下,触及内部组件利用堕落时有响应的值。
・ASPDescription属性的值由ASP预处置程序发生,而不是由以后正在利用的剧本引擎发生的,而且对年夜多半剧本毛病而言将是空的。更多情形下,对诸如对ASP内置工具挪用有效的办法的毛病有响应的值。
・File、Source、Line和column属性仅在毛病呈现时,而且在毛病的具体数据是可用的情形下才干举行设置。对一个运转期毛病,File和Line属性一般是无效的,可是column属性常常前往-1。当毛病是一个制止页面被ASP处置的语法毛病,才前往Source属性。一样平常在这些情形下,Line和Column属性是无效的。假如把Source属性的值写到页面,明智的举措是先将该值传给HTMLEncode,以防在其含有不法的HTML字符。在本章的前面将具体地会商HTMLEncode办法。
4.3.5猎取Server工具的路径信息
在对存储在Web网站上的文件举行操纵时,必要取得文件的实践的物理路径,而不是利用假造路径或URL,只管在其他网页中能用它们一般地定位文件。下一章中有一个例子,它利用FileSystemObject对Web站点的InetPubWWWRoot文件夹中的文件举行读写。当创立本人的定制组件大概利用贸易化的组件对文件体系举行会见时,常常必要为其供应一个文件的物理路径。
Server工具的MapPath办法
能够从Request.ServerVariables汇合中提取HTTP报头变量,它们包括了以后文件的物理路径(在DOCUMENT_NAME和PATH_TRANSLATED报头中)。Server工具供应了一个办法MapPath,可使用这个办法对我们可以供应一个无效的假造路径的任何文件提取响应的物理路径。能够在已利用过的示例网页中看到利用MapPath办法,并可实验利用该办法。
如-24所示,在页面的底部的MiscellaneousMethods部分,有一个按钮实行Server.MapPath办法,并供应给它接近该按钮的文本框中的值。在该网页的源代码中已把这个值设置为“/iishelp/default.htm”,这个文件应当主动地安装在盘算机上。也能够输出另外一个网页的URL。
单击该按钮从头装载这个网页,实行该办法并在顶部显现了局,鄙人部显现原页面的其他部分,如-25所示:
(1)示例网页代码的功效
处置这个历程的代码是与后面在类似的示例文件中已利用过的代码非常类似。
在该页面顶部的ASP剧本地区中,对单击的按钮的名字举行反省。在这类情形下,该按钮的名字将是cmdMapPath,复杂地把相婚配的文本框中的值txtMapPath传送给Server.MapPath办法,并显现失掉的了局:
IfLen(Request.Form(“cmdMapPath”))Then
StrValue=Request.Form(“txtMapPath”)
Response.Write“<B>Results:</B><BR>Server.MapPath(“"&strValue_
"&“)returned<B>”"&Server.MapPath(strValue)_
"&“</B><HR>”
EndIf
(2)MapPath和假造使用程序目次
注重,MapPath办法为/iishelp/default.htm文件猎取的了局在Web服务器目次外,并在主winnt目次的help目次中。这分明地证实了MapPath办法长短常有效的。
关于在缺省的Web网站目次中的文件,其URL的路径部分与物理路径一般是不异的。比方,一个文件存储在Web服务器上:
c:InetPubWWWRootyourfilesthisfile.asp
假如安装时已在缺省目次中安装了的Web根目次,则URL以下:
http://yoursite.com/yourfiles/thisfile.asp
但是,IISHelp文件安装在缺省Web网站目次外的一个假造目次中,以是用于对其举行会见的URL和物理路径之间没有间接的联系关系。只要经由过程利用Server.MapPath办法才干猎取实在的物理路径。
4.3..6利用Server工具格局化数据
以后面会商演示SSI指令的网页的代码时,可巧碰到了利用HTML的一个老成绩。在一个HTML网页中怎样显现HTML代码?假如“照如今的模样”利用,也就是在响应的地位上利用一切的HTML字符,会被扫瞄器看成HTML注释和实行。如许当以下内容在扫瞄器中显现时:
Thisisthesyntaxofa<TABLE>element:
将不会显现文本<TABLE>,由于扫瞄器将其作为一个数据表的一个入手下手标志,并照此来实行。为了不这类情形,必需把在HTML中不法或有效的一切字符转换到等价的HTML字符实体(characterentity)。多半罕见的字符如表4-5所示:
表4-5字符与等价的HTML实体的干系
字符
等价的HTML实体
字符
等价的HTML实体
<
<
>
>
&
&
“
"
?
?
?
?
一切的实体以&号入手下手并以分号停止,是在一些言语中标明一个实体的尺度办法的一部分,这些言语是基于SGML(尺度化惯例标识言语)划定规矩的,如HTML言语。
1.数字的HTML实体等价字符串
注重最初一个例子,已注册的商标?是一个以“#”字符为前缀的数字值,而不是响应寄义的一个文本缩写(如copy对应版权标记?)。具有一个年夜于126的ANSI代码值的一切字符在HTML中被暗示为十进制字符的ANSI代码,以&#为前缀,以分号为后缀。
现实上,必要把稳的是利用数字实体等价字符串要优先于一些较少被撑持文本实体字符串。一个例子是商标字符(?),该字符的实体等价字符串为“?”但不是一切扫瞄器(比方Navigator)都能辨认这个字符串,这类情形下,将在网页中显现该实体字符串。相反,利用?在一切扫瞄器中都能很好地事情。
2.Server工具的HTMLEncode办法
把HTML转换为文本是举行无效显现必要的,不然HTML会被扫瞄器当做HTML来看待和实行,这意味着必需对有效的字符举行编码,使其成为等价的HTML实体字符串。为办理这类转换,Server工具供应了HTMLEncode办法。能够在本书供应的ASPServerObject示例网页中实习利用这个办法。
复杂地把一些文本输出到HTMLEncode对应的文本框中并单击按钮。示例中供应了一些实在的HTML作为缺省的文本,如-26所示:
从头载进该页面时,在该页面的顶部显现了局。HTMLEncode办法把尖括号转换成了“<”和“>”,并且把双引号转换成为“";”,如-27所示:
(1)示例网页代码的功效
关于失掉的了局,有几个风趣的中央。
起首,在办法名字前面的括号中已丢失落了<B>和</B>标志,响应增添了一个粗体文本部分。在网页中显现原本的值时,<B>和</B>被当做HTML提交了,以是<B>和</B>标志消散了,相干内容以粗体文本显现。
能够非常简单地制止这类情形。现实上,这就是计划HTMLEncode办法的缘故原由。原示例代码以下:
…
Response.Write“Server.HTMLEncode(“"&strValue"&“)returned”
…
如今所能做的就是把HTMLEncode办法使用于正在输入的值上:
…
strResult=Server.HTMLEncode(strValue)
Response.Write“Server.HTMLEncode(“"&strResult"&“)returned”
如今输入了一个非常有效的了局,如-28所示:
如今已办理了不提交HTML而显现HTML的成绩。可是假如要在HTML中显现HTMLEncode办法的了局,而又不提交和处置这些了局,又会产生甚么情形?为懂得决这个成绩,要从HTMLEncode办法自己思索:
Thisis<B>"bold"</B>text
下面的语句在HTML网页中得不到一样的显现了局,这是由于HTML字符实体将被扫瞄器处置和实行,并显现为实体所替换的字符。换句话说,失掉的是:
Thisis<B>”bold”</B>text
我们没有看到实体。为了不这类情形,可两次利用Server.HTMLEncode办法。这就把“&”号变更为“&”,如许就失掉了所需的显现了局。示例网页的这个部分的代码是:
IfLen(Request.Form(“cmdHTMLEncode”))Then
strValue=Request.Form(“txtHTMLEncode”)‘Getthevaluefromthetextbox
strResult=Server.HTMLEncode(strValue)‘HTMLEncodetoconvert<,>and“
strDisplay=Server.HTMLEncode(strResult)‘Thenagaintoconvert&to&
Response.Write“<B>Results:</B><BR>Server.HTMLEncode(“"&strResult_
"&“)returned<B>”"&strDisplay"_
&“</B><HR>”
EndIf
(2)HTMLEncode与HTML控件的缺省值
从下面能够看出,假如在一个HTML网页中要显现HTML代码,而又不使之被作为HTML举行处置和实行,HTMLEncode办法长短常有效的。在年夜多半一般的ASP网页中不年夜大概会碰到这类情形,除非利用包括有HTML的数据库或其他数据源中的数据,而又必要作为文本举行显现。
可是HTMLEncode办法真正有效的中央是,经由过程设置VALUE属性预设页面中文本范例的HTML控件的值。作为例子,可看一下已用于实习HTMLEncode办法的示例网页的源程序。创立HTMLEncode对应的文本框的HTML在HTML页中界说以下:
…
<INPUTTYPE=”TEXT”NAME=”txtHTMLEncode”SIZE=”35”
VALUE=”Thisis<B>"bold"</B>text”>
…
这是“手工编码”而不是利用Server.HTMLEncode办法。这里也只体贴对双引号举行编码而不体贴对尖括号的编码。为何?这是由于假如没有如许做,该代码将被读为:
VALUE=”Thisis<B>”bold”</B>text”
而在这类情形中尖括号不会带来成绩,未编码的双引号则会。在文本框中交换的实践值将是“Thisis<B>”,即它将在第二个双引号字符处被截断。以是,在创立预置控件值的页面时,应当思索利用HTMLEncode办法,以免这些值被截断:
<%
strValue=Request.Form(“txtSomeValue”)
%>
…
<INPUTTYPE=”TEXT”NAME=”txtSomeValue”
VALUE=”<%=ServerEncode(“strValue”)%>”>
…
当扫瞄器发送已被HTML编码的一个控件的值给服务器时,主动举行反向译码。即服务器利用Request汇合华夏来格局的数据。
3.格局化UTL的数据
另有别的一种情形,就是常常必要把一个文本字符串变更成可以在Web网页中利用的别的一种格局。古代Web服务器和操纵体系都非常友爱地撑持包括空格字符的文件名,可是我们所利用的URL大概包括有空格字符,因为HTTP利用的URL语法不同意有空格字符(和几个其他字符),大概会呈现贫苦。
别的一种更广泛的情形也会呈现贫苦。当把这些值作为QueryString汇合的成员传送给服务器时,将被追加到URL的开端(在一个问号字符以后)。这类情形产生在<FORM>的METHOD属性被设置为“GET”(大概是省略了METHOD属性)的情形。换句话说,关于间接追加到URL上的值,都大概呈现贫苦。这大概产生在<A>元素中:
<AHREF=http://myserver.com/mypage.asp?title=InstantJscript>InstantJscript</A>
一些扫瞄器(比方InternetExplorer)能够对此举行处置,由于它们在把HTTP哀求发送到服务器之前,主动地实行需要的转换。但是,很多其他的扫瞄器不举行这类转换,并招致了URL一般在第一个空格或不法字符处被截断。如许在Navigator中,下面给出的链接请求的网页变成http://myserver.com/mypage.asp?title=Instant。在服务器上,title名字/值对的丧失部分会使代码失利。
思索到HTTP协定界说的限定,必需从作为HTTP哀求中的URL利用的字符串中删除不法的字符(不法字符是一切那些ANSI代码在126之上的字符和ANSI代码在126以下的某些字符)。
ANSI代码年夜于126的字符必需用百分号后跟十六进制情势的ANSI代码举行交换。如许,版权字符?酿成%A9。ANSI代码在126之下在URL中分歧法的字符,一样利用响应的替换字符串;如表4-6所示:
表4-6字符与HTTP/URL取代物的干系
字符
HTTP/URL取代物
字符
HTTP/URL取代物
空格
+
%5C
‘
%27
]
%5D
!
%21
^
%5E
#
%23
`
%60
$
%24
{
%7B
%
%25
|
%7C
&
%26
}
%7D
(
%28
+
%2B
)
%29
<
%3C
/
%2F
=
%3D
:
%3A
>
%3E
;
%3B
Chr(10)
疏忽
[[/TD]
%5B
Chr(13)[TD]
%0D
4.Server工具的URLEncode办法
Server工具供应了能够用来把恣意字符串转换成响应的正当HTTPURL的办法。能够使用示例网页对这个名为URLEncode的办法举行实习,如-29所示:
这里,输出的值作为URL长短法的,它包括了空格和ANSI代码年夜于126的字符。对这个值,利用URLEncode办法的了局是一切的空格被交换成一个加号,版权标记被交换为 %A9,如-30所示:
(1)示例网页代码的功效
在示例网页中,处置这个功效的代码十分复杂,仅仅反省是不是单击了URLEncode办法对应的按钮,假如单击了,把对应的文本框中的值传送给Server.URLEncode办法并显现了局:
IfLen(Request.Form(“cmdURLEncode”))Then
strValue=Request.Form(“txtURLEncode”)
Response.Write“<B>Results:</B><BR>Server.URLEncode(“"&strValue_
"&“)returned<B>”"&Server.URLEncode(strValue)_
"&“</B><HR>”
EndIf
(2)对HTML元素和其他链接利用URLEncode
URLEncode办法更广泛地用于把<A>元素或其他链接的值写到ASP网页。比方,假如在查询字符串中创建了一系列的链接,这;些链接包括来自一个数据库的值,起首应当对这个字符串利用Server.URLEncode办法:
<%
strValue=Request.Form(“txtSomeValue”)
‘CreatethefullURLforthelinkasanHTTP-legalstring
strURL=http://mysite.com/books.asp?title=&Server.URLEncode(“strValue”)
‘Makesurewedonthaveanynon-legalHTMLcharactersinthepagetext
strLink=Server.HTMLEncode(“strValue”)
%>
…
<AHREF=”<%=strURL%>”><%=strValue%></A>
…
假如放进字符串strValue的值包括题目“ActiveServerPages?”,将失掉由这个代码段创立的以下所示的HTML:
<AHREF=http://mysite.com/books.asp?title=Active+Server+Pages%A9>
ActiveServerPages?</A>
注重,我们不单单利用Server.URLEncode办法来创建一个正当的URL字符串,并且还对链接的文本利用了Server.HTMLEncode办法,以确保把一切不法的字符转换为符合的HTML等价实体。
和HTMLEncode办法一样,不必反译码ASP网页中的URL编码值。IIS主动地完成URL编码字符串的转换,该字符串在HTTP哀求直达换为它们本来格局,使得它们在内置工具中是可用的。
4.4小结
在这一章中,经由过程在Web服务器上产生的处置历程,会商了为Web网页供应静态内容所触及的一些成绩。这些成绩的一部分不是间接地与ASP自己相干,但对这些成绩的了解,将有助于了解基础的处置事情是怎样举行的。
本章先容了IIS怎样撑持传统的服务器端包括指令,有一些指令大概仍旧是有效的。出格是,#exec指令对实行体系命令和集成原本的使用程序都是有效的。同时也会商了一条出格的服务器端包括指令――#include语句,懂得了在ASP网页外部利用这条命令的相干成绩。
但是,ASPServer工具占了本章的年夜部分。它供应了在ASP网页内办理服务器端处置历程的办法。在Web服务器和ASP的准确的情况中,它可用来创立其他工具、使用程序或组件的实例。它同时也供应了一系列的办法,这些办法同意实行其他的网页或资本,和以准确体例格局化信息,以便在ASP剧本和网页中利用。Server工具也带来了一个新的ASP内置工具:ASPError工具,它为剧本供应较好的毛病处置办法。如今能够供应“正统的”剧本毛病处置,并猎取有关毛病的信息。
国内有些大的CRM厂商的ASP就写得不错.无论是概念还是它里面用JAVASCRIPT的能力.并不是说现在的程序员用了ASP.NET来写程序就可以说自己高档了 |
|