日期:2014-03-10  浏览次数:20872 次

4.3.5 获取Server对象的路径信息
在对存储在Web网站上的文件进行操作时,需要获得文件的实际的物理路径,而不是使用虚拟路径或URL,尽管在其他网页中能用它们正常地定位文件。下一章中有一个例子,它使用FileSystemObject对Web站点的InetPub\WWWRoot文件夹中的文件进行读写。当创建自己的定制组件或者使用商业化的组件对文件系统进行访问时,经常需要为其提供一个文件的物理路径。
Server对象的MapPath方法
可以从Request.ServerVariables集合中提取HTTP报头变量,它们包含了当前文件的物理路径(在DOCUMENT_NAME和PATH_TRANSLATED报头中)。Server对象提供了一个方法MapPath,可以使用这个方法对我们能够提供一个有效的虚拟路径的任何文件提取相应的物理路径。可以在已经使用过的示例网页中看到使用MapPath方法,并可试验使用该方法。
如图4-24所示,在页面的底部的Miscellaneous Methods部分,有一个按钮执行Server.MapPath方法,并提供给它靠近该按钮的文本框中的值。在该网页的源代码中已经把这个值设置为“/iishelp/default.htm”,这个文件应该自动地安装在计算机上。也可以输入另一个网页的URL。

图4-24 使用Server.MapPath的屏幕
单击该按钮重新装载这个网页,执行该方法并在顶部显示结果,在下部显示原页面的其余部分,如图4-25所示:

图4-25 显示Server.MapPath的结果
(1) 示例网页代码的功能
处理这个过程的代码是与前面在相似的示例文件中已经使用过的代码十分相似。
在该页面顶部的ASP脚本区域中,对单击的按钮的名字进行检查。在这种情况下,该按钮的名字将是cmdMapPath,简单地把相匹配的文本框中的值txtMapPath传送给Server.MapPath方法,并显示得到的结果:
If Len(Request.Form(“cmdMapPath”)) Then
StrValue = Request.Form(“txtMapPath”)
Response.Write “<B>Results:</B><BR>Server.MapPath (“ & QUOT & strValue _
& QUOT & “ ) returned <B>” & QUOT & Server.MapPath(strValue) _
& QUOT & “</B><HR>”
End If
(2) MapPath和虚拟应用程序目录
注意,MapPath方法为/iishelp/default.htm文件获取的结果在Web服务器目录外,并在主winnt目录的help目录中。这清楚地证明了MapPath方法是非常有用的。
对于在缺省的Web网站目录中的文件,其URL的路径部分与物理路径通常是相同的。例如,一个文件存储在Web服务器上:
c:\InetPub\WWWRoot\yourfiles\thisfile.asp
如果安装时已经在缺省目录中安装了的Web根目录,则URL如下:
http://yoursite.com/yourfiles/thisfile.asp
然而,IIS Help文件安装在缺省Web网站目录外的一个虚拟目录中,所以用于对其进行访问的URL和物理路径之间没有直接的关联。只有通过使用Server.MapPath方法才能获取真实的物理路径。

4.3..6 使用Server对象格式化数据
当前面讨论演示SSI指令的网页的代码时,碰巧遇到了使用HTML的一个老问题。在一个HTML网页中如何显示HTML代码?如果“照现在的样子”使用,也就是在相应的位置上使用所有的HTML字符,会被浏览器当作HTML解释和执行。这样当下列内容在浏览器中显示时:
This is the syntax of a <TABLE> element:
将不会显示文本<TABLE>,因为浏览器将其作为一个数据表的一个开始标记,并照此来执行。为了避免这种情况,必须把在HTML中非法或无效的所有字符转换到等价的HTML字符实体(character entity)。多数常见的字符如表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方法。可以在本书提供的ASP Server Object示例网页中练习使用这个方法。
简单地把一些文本输入到HTMLEncode对应的文本框中并单击按钮。示例中提供了一些真实的HTML作为缺省的文本,如图4-26所示:

图4-26 使用HTMLEncode方法的屏幕
重新载入该页面时,在该页面的顶部显示结果。HTMLEncode方法把尖括号转换成了“<”和“>”,而且把双引号转换成为“";”,如图4-27所示:

图4-27 使用HTMLEncode方法1
(1) 示例网页代码的功能
关于得到的结果,有几个有趣的地方。
首先,在方法名字后面的括号中已经丢掉了<B>和</B>标记,相应增加了一个粗体文本部分。在网页中显示原有的值时,<B>和</B>被当成HTML提交了,所以<B>和</B>标记消失了,相关内容以粗体文本显示。
可以十分容易地避免这种情况。事实上,这就是设计HTMLEncode方法的原因。原示例代码如下:

Response.Write “Server.HTMLEncode (“ & QUOT & strValue & QUOT & “) returned”

现在所能做的就是把HTMLEncode方法应用于正在输出的值上:

strResult = Server.HTMLEncode(strValue)
Response.Write “Server.HTMLEncode (“ & QUOT & strResult & QUOT & “) returned”
现在输出了一个十分有用的结果,如图4-28所示:

图4-28 使用HTMLEncode方法的结果2
现在已经解决了不提交HTML而显示HTML的问题。但是如果要在HTML中显示HTMLEncode方法的结果,而又不提交和处理这些结果,又会发生什么情况?为了解决这个问题,要从HTMLEncod