首页  ·  知识 ·  编程语言
ASP编程入门进阶(七):内置对象Server
佚名  5D多媒体  ASP  编辑:dezai  图片来源:网络
Server 对象提供对服务器上的方法和属性的访问 , 其中大多数方法和属性是作为实用程序的功能服务。(IIS HELP翻译)  有了 Server 对象,你就可以在服务
Server 对象提供对服务器上的方法和属性的访问 , 其中大多数方法和属性是作为实用程序的功能服务。(IIS HELP翻译)
  有了 Server 对象,你就可以在服务器上启动 ActiveX 对象例程,并使用 Active Server 服务提供象 HTML 和 URL 编码这样的函数。
  一、Script.ScriptTimeout
  在脚本运行超过一段时间之后,即作超时处理。
  服务器一般的默认脚本运行时间是90秒。
  你可以从“Internet信息服务”中“默认Web站点”的属性弹出框中看出,你也可以自己设定。
  [img]images/win2k.gif[/img]
  呵呵,上面的可不是,900秒了。
  应该是“主目录”标签中的“配置”对话框中,WINXP一样。
  [img]images/mulu.jpg[/img]
  [img]images/time.jpg[/img]

  在理解脚本运行时间之前,先来看一个程序,主要功能就是进行计算网页执行时间的。



  当然对应的ASP也就是看到许多站点都有的页面执行时间显示。

  1.time.asp


<%startime=timer()%>
到下面看执行的时间
<%
for i= 1 to 5000
response.write("
")
next
%>
当然中间还可以添加其它内容。

<%endtime=timer()%>

<%=FormatNumber((endtime-startime)*1000,3)%>毫秒

  那如果上面的程序变成for i= 1 to 5000000
  呵呵,是不是机器快反应不过来的感觉,那这个就是脚本的执行时间了。
  为了让程序能很好的执行,就该把脚本执行时间放长了。
  怎么放长?把默认的改?呵呵,当然不是:)


<%Server.ScriptTimeout=110%>

  时间的设定当然要是比默认90秒大的,现在的代码就是:指定服务器处理脚本在 110 秒后超时。
  还有,脚本时间的确定要看自身的程序了,一般情况100秒左右也差不多了,即使能执行出来,可能观看网页的人早就把它叉叉了。

  以上的ScriptTimeout就是Server对象唯一属性了。

  二、Server.HtmlEncode
  HtmlEncode就是Server对象的其中一个方法了。它允许你对特定的字符串进行 HTML 编码,虽然 HTML 可以显示大部分你写入 ASP 文件中的文本,但是当你需要实际包含 HTML 标记中所使用的字符,就会遇到问题。这是因为,当浏览器读到这样的字符串时,会试图进行解释。

  还是看一个程序,我想在页面显示“ ”这样的代码(附: 是空格的代码)。
  那么当我进行书写的时候你会发现,浏览器已经给我解释了的。


空格的代码是: 

你会发现上面的代码都被执行了。

  所以,为了要让一些特殊代码能够显示,就运用该方法了。

  2.htmlencode.asp


<%Response.write ("这是没有采用 HTMLEncode 方法的测试。
这里就另起一行,说明代码被执行。 ")%>


<%Response.write Server.HtmlEncode("这是对 HTMLEncode 方法的测试。
这里应该不会另起一行,也就_
是代码没有被执行了。 ")%>

  这在许多网站,论坛都存在的一些BUG,不信你可以到各论坛试试:敲入 就是没有,急死你呢:)当然HtmlEncode只是其中的一个原因,最主要的还是UBB代码的转换。不过关于这点我也已经调试解决了。
  调试地址参看 www.cnbruce.com/juven/showart.asp
  当然经典论坛不存在这问题,要不你也不会看到效果了。

  三、Server.UrlEncode
  正如 HtmlEncode 方法使客户可以将字符串翻译成可接受的 HTML 格式一样,Server 对象的 UrlEncode 方法则是根据 URL 规则对字符串进行正确编码,当字符串数据以 URL 的形式传递到服务器时,在字符串中不允许出现空格,也不允许出现特殊字符。为此,如果你希望在发送字符串之前进行 URL 编码,可以使用 Server.URLEncode 方法。
  为方便起见,我们先看为处理送交,然后处理接受的效果。

  3.urlencode.asp


<%filepath=request.servervariables("script_name")%>
接受URL中的值(没有处理接受值,发现值被解释了): <%=request.querystring("cnbruce")%>

你可以输入“
”等代码看看:

接受URL中的值(进行了urlencode编码,不会执行): <%=Server.URLEncode(request.querystring("cnbruce"))%>

  当然你会发现,虽然不执行了,但会出现“<”变成了“%3C”,“>”变成了“%3E”,那这就是因为没有在发送之前处理。
  不过,我们还可以通过Replace函数将这些特殊代码再逆转过来。

  4.vurlencode.asp


<%
function tihuan(what)
tihuan=what
if not isnull(what) then
tihuan=replace(tihuan,"%3C","<")
tihuan=replace(tihuan,"%3D","=")
tihuan=replace(tihuan,"%3E",">")
tihuan=replace(tihuan,"%26","&")
tihuan=replace(tihuan,"空格我不知道,呵呵。哪个告诉我下:)"," ")
tihuan=replace(tihuan,"%3B",";")
tihuan=replace(tihuan,"%22",""")
tihuan=replace(tihuan,"%2B","+")
tihuan=replace(tihuan,"%2F","/")
end if
end function
%>
<%filepath=request.servervariables("script_name")%>

接受URL中的值(没有处理接受值,发现值被解释了): <%=request.querystring("cnbruce")%>


你可以输入“
”等代码看看:

接受URL中的值(进行了urlencode编码,不会执行): <%=tihuan(Server.URLEncode(request.querystring("cnbruce")))%>


  其实上面做的都是无用功,真正应该是在发送之前就该处理下的,不过对学习该方法的举例确是个好方法:)

  四、Server.MapPath
  相信看过我写的《DW2ASP系列》的朋友,都卡在这个上了。DW毕竟是入门的好东西,但要系统学ASP编程,对这个就该好好认识了解下。
  MapPath方法,具体的就是将指定的相对或虚拟路径,映射到服务器上相应的物理目录上。
  用法,也就是语法了,如下:


Server.MapPath(Path)

  Path 指定要映射物理目录的相对或虚拟路径。若 Path 以一个正斜杠 (/) 或反斜杠 (\) 开始,则 MapPath 方法返回路径时将 Path 视为完整的虚拟路径。若 Path 不是以斜杠开始,则 MapPath 方法返回同本文件中已有的路径相对的路径。这里需要注意的是 MapPath 方法不检查返回的路径是否正确或在服务器上是否存在。
  当然这可以和Request.ServerVariables连起来使用看看。

  5.mappath.asp


Request.ServerVariables("APPL_PHYSICAL_PATH") : <%=Request.ServerVariables("APPL_PHYSICAL_PATH")%>


Request.ServerVariables("PATH_INFO") : <%=Request.ServerVariables("PATH_INFO")%>


Request.ServerVariables("SCRIPT_NAME") : <%=Request.ServerVariables("SCRIPT_NAME")%>


Request.ServerVariables("URL") : <%=Request.ServerVariables("URL")%>


Request.ServerVariables("PATH_TRANSLATED") : <%=Request.ServerVariables("PATH_TRANSLATED")%>



上面都是通过ServerVariables提取得出的值,下面就来运用mapath把一个虚拟地址转变为实际的物理地址。


Server.MapPath(Request.ServerVariables("URL")) :<%=Server.MapPath(Request.ServerVariables("URL"))%>


或者自己随便写个不存在的路径,同样能够执行


Server.MapPath("cnbruce.asp") : <%=Server.MapPath("cnbruce.asp")%>


再来个“/”的


Server.MapPath("/cnbruce.asp") : <%=Server.MapPath("/cnbruce.asp")%>

Server.MapPath("\cnbruce.asp") : <%=Server.MapPath("\cnbruce.asp")%>


你会发现物理地址转变到IIS默认根目录下面了。
这就是如6to23之类的站点mappath的问题所在。还是虚拟主机好,即使是根,也还是自己站点的默认存放节点根。

  测试我的地址http://www.cnbruce.com/server.asp
  注意测试的地址和根目录下的地址,对应的是同一文件夹(这就是虚拟主机),6to23之类是不会相同的。

  有此些了解,对路径的处理应该要好多了,再返回我的站点,看看我对数据库的mappath路径的处理方法,相信又是一个理解层次了。
  数据库的mappath路径的处理方法在:
  www.cnbruce.com/blog/showlog.asp?cat_id=27&log_id=241

  五、Server.CreatObject
  Server.CreateObject 这个方法恐怕是 ASP 中最为实用,也是最强劲的功能了。它可用于创建已经注册到服务器上的 ActiveX 组件实例。这是一个非常重要的特性,因为通过使用 ActiveX 组件能够使你轻松地扩展 ActiveX 的能力,正是使用了 ActiveX 组件,你可以实现至关重要的功能,譬如数据库连接、文件访问、广告显示和其他 VBScript 不能提供或不能简单地依靠单独使用 ActiveX 所能完成的功能。也正是因为这些组件才使得 ASP 具有了强大的生命力。
  不过,在我们没有谈及连接数据库之前,这个先空着,“要得好,到临了”:)等我们接触到数据库连接的时候再说不迟。

  今天就主要把Server对象学习了下,感觉好象是每个都有用的,重要啊。
  还有,需要说明的,如果您从本处转载,发现和本源件有差错,比如代码  、 < 、 >等等,根本就是被执行了的。都说明您的站点存在着这些问题。


  ASP对象中除了用于发送(Response)、接收和处理数据(requeest)、服务器访问(Server)的对象外,还有一些非常实用的标记Active Server应用程序(Application)和单个用户信息(Session)的对象。

  Session对象
  该对象在ASP使用中占相当大的比例。由于网页是一种无状态程序,无法得知用户浏览状态。在ASP中,通过Session对象来记录使用者私有的数据变量,以作为用户再次对服务器提出要求时做确认,用户在程序的Web页面之间跳转时,存在Session对象中的变量将不会消失。

  这些真的是很重要的功能,尤其是有会员的系统必须要用到的。像是会员的登入账号、时间、状态以及许许多多该记录的实时数据(如购物系统记录使用者的购物篮内的商品),这些信息属于各使用者私人所需要,通常开发者都是使用 Session 记录处理。

  在ASP中的Session是使用Cookies构成,服务器将所有的Session内记录的数据,以Cookies的方式传至用户的浏览器。通常一般浏览器会将这些Cookies存起来,每当使用者点选连结,再次与服务器做联机时,浏览器就会把这些Cookies传回Server供做处理:这即是Session的运作原理。由此可知会话状态Session仅在支持cookie的浏览器中保留,如果客户关闭了Cookie 选项Session也就不能发挥作用了。

  一、Session.SessionID
  SessionID 属性返回用户的会话标识。在创建会话时,服务器会为每一个会话生成一个单独的标识,会话标识以长整形数据类型返回。在很多情况下 SessionID 可以用于 WEB 页面注册统计。

  利用该属性可以解决一种对用户的控制问题。该问题的主要功能就是,针对某个网站的一个模块,当一个会员登录后正在看此模块时,另一个人用同样的会员名登录,就不能浏览这个模块:也就是说一个会员名同时只能一个人浏览此模块。

  通过用会员名(假设为UserID,唯一)和SessionID来实现了控制。当会员登录时,给这个会员一个Session记录登录状态如:Session("Status")="Logged",同时把这个会员的Session.SessionID写入数据库。当他要浏览此模块时,先判断其是否登录,若已经登录再判断它的SessionID是否与数据库记录的相同,如果不同则不能访问。

  这样,当另一个用户用相同的会员名登录时,那么数据库中记录的就是新的SessionID,前者访问此模块时就不能通过检查。这就实现了一个会员名同时只能一个人浏览某个模块。这个功能在一些收费网站有很有特别作用,它防止了一个会员名给多个人浏览的问题,为公司保障了利益。


<%=Session.SessionId%>
是单独生成的唯一ID标识,可刷新调试。

  二、Session.TimeOut
  该属性设置的Session的最大间隔时间。间隔时间是指客户器端从最近一次向Web服务器提出要求,到下一次向Web服务器提出要求的时间。可以理解为:如果用户在该超时时限之内不刷新或请求网页,则该会话将终止。Timeout 属性是以分钟为单位,为该应用程序的Session对象指定超时时限的,一般默认为20分钟。这在网吧等公共场所,登录个人信息页而忘记关闭窗口时,显得比较重要(至少可以把时间设短些)。


<%=Session.TimeOut=10%>

  以上SessionId、TimeOut属于Session对象的两个属性,下面看该对象的一个方法Abandon

  三、Session.Abandon
  该方法是Session对象的唯一方法,可以清除Session对象,用来消除用户的Session对象并释放其所占的资源。当然你如果没有明确调用Abandon方法,一旦会话超时,服务器也会将删除这些对象并释放资源。
  下面就用两个页的程序来认识Session对象以及Abandon方法的利用。

  1.login.asp


<%
'是提取url中变量loginout的值是否为true,若为真,就执行Session.Abandon()。
if Request.QueryString("loginout")="true" then
Session.Abandon()
end if

'只有在当点击了submit按钮的前提下,再来判断提取的东西都不为空,则建立Session对象。
submitname=request.form("submit1")
if submitname="submit" then
if Request.Form("name")<>"" and Request.Form("pwd")<>"" then
Session("name")=Request.Form("name")
Session("pw")=Request.Form("pwd")
end if
end if
%>
<%
'如果Session("name")不为空,则显示Session("name")的值,并且做一个到info.asp的链接。
if Session("name")<>"" then
response.write("你的name值是:"&Session("name"))
response.write("
显示你的资料")
else

'否则,即Session("name")为空不存在,则显示表单用以输入建立Session的平台。
%>


姓名:

密码:




显示你的资料
<%end if%>

  注意Session("name")为空和不为空的时候,都做了一个到info.asp的链接,具体调试结果如何,再来看info.asp的内容。

  2.info.asp


<%
'如果session对象值为空则跳转到login.asp
if session("name")="" then
    Response.Redirect("login.asp")
'否则就显示个人信息
else
    Response.Write("你的姓名:"&session("name")&"
")
    Response.Write("你的密码:"&session("pw")&"
")
end if
%>
返回
退出

  可以看出来,info.asp页面内容的显示其实是需要条件的。那就是必须得有一个session值的存在,这样才可以显示具体的信息。这在登录系统中运用得比较多。

  你可以把login.asp想象成一个登录窗口,当然我的这个比较简单(只要输入用名和密码就生产Session了),实际情况是:判断输入的用名和密码是否和数据库中的用名和密码吻合,如果正确吻合才生成Session的。然info.asp页面的作用刚好可以做为一权限页面,因为进入该页需要Session,而Session的产生是确保用名密码正确的。

  所以当一开始出现表单窗口时,你点login.asp链接是打不开的,只有当提交了表单生成了Session后才能进入。这正是登录系统的精髓所在,Do You Know?:)

  四、Session_OnStart
  Session_OnStart属于Session对象的一类事件。它是在服务器创建新会话时发生的。服务器在执行请求的页之前先处理该脚本。Session_OnStart 事件是设置会话期变量的最佳时机,因为在访问任何页之前都会先设置它们。

  对象的例程每一次启动时触发Session_OnStart事件,然后运行Session_Onstart事件的处理过程。也就是说,当服务器接收到应用程序中的URL的HTTP请求时,触发此事件,并建立一个Session对象。

  当然说到Session_OnStart事件就不能不谈到一个文件Global.asa(P.S:我打算把该文件和Chat程序放在一起说的,所以现在先不作过多解释)
  具体用法先透露,写在Global.asa文件内部



  五、Session_OnEnd
  一看也就知道是Session对象的另一类事件了。当调用Session.Abandon方法时或者在TimeOut的时间内没有刷新,这会触发Session_OnEnd事件,然后执行里面的脚本。同样具体用法在后面将写的Global.asa文件专题中详细介绍到,简单语法如下:



 以上就是对Session对象的系统学习。

在Web应用程序中,当一个用户访问该应用时,Session类型的变量可以供这个用户在该Web应用的所有页面中共享数据;如果另一个用户也同时访问该Web应用,他也拥有自己的Session变量,但两个用户之间无法通过Session变量共享信息,而Application类型的变量则可以实现站点多个用户之间在所有页面中共享信息。可以理解Session是局部变量,而Application则为全局变量。

  在同一虚拟目录及其子目录下的所有 .asp 文件构成了 ASP 应用程序。我们非但可以使用 Application 对象,在给定的应用程序的所有用户之间共享信息,并在服务器运行期间持久的保存数据。而且,Application 对象还有控制访问应用层数据的方法和可用于在应用程序启动和停止时触发过程的事件。

  一、Application("name")=value
  正如Session("name")=value一样,Application对象也没有内置的属性。当然用户可以自定义属性,该属性也可称为集合。

  一旦分配了Application对象的属性,它就会持久地存在,直到关闭WEB服务器服务使得 Application 停止。由于存储在 Application 对象中的数值可以被应用程序的所有用户读取,所以 Application 对象的属性特别适合在应用程序的用户之间传递信息。


<%
Application("MyName") = "cnbruce"
%>

  二、Application.Lock
  Lock方法是禁止其他用户修改Application对象的属性,以确保在同一时刻仅有一个客户可修改和存取 Application 变量。如果用户没有明确调用 Unlock 方法,则服务器将会在 .asp 文件结束或超时后即解除对 Application 对象的锁定。最简单的就是进行页面记数的例子了。

  1,num.asp


<%
Application.Lock
Application("NumVisits") = Application("NumVisits") + 1
Application.Unlock
%>

  你是本页的第<%=Application("NumVisits")%>位访问者。


  上面的程序,你会发现每刷新一次,都会记数累加,如按IP值访问来记数的话,则建立一个Session。

  2,vnum.asp


<%
if session("visitnum")="" then
Application.Lock
Application("NumVisits") = Application("NumVisits") + 1
Application.Unlock
session("visitnum")="visited"
end if
%>

  你是本页的第<%=Application("NumVisits")%>位访问者。

  三、Application.Unlock
  与Lock方法相反,Unlock方法是允许其他用户修改 Application 对象的属性。可以看出在上面的例子中,Unlock方法解除对象的锁定,使得下一个客户端能够增加 NumVisits 的值。

  当然需要注意的是:记数要确保服务器不被重启,因为所以的访问是数值是建立在页面之上的,并未进行保存成文件或保存到数据库这样的处理。
  一般当服务器重新启动就会触发Application的事件了。

  四、Application_OnEnd
  Application_OnEnd 事件在应用程序退出时于 Session_OnEnd 事件之后发生,当然Application_OnEnd 事件的处理过程也必须写在 Global.asa 文件之中。
  比如上面的程序中,若服务器关机必然会触发Application_OnEnd事件,那么该事件就可以进行数据保存的工作,已使得下次数据的续沿。
  当然Application_OnEnd 事件在应用程序退出时于Session_OnEnd 事件之后发生。



  五、Application_OnStart
  Application_OnStart 事件在首次创建新的会话( 即 Session_OnStart 事件 )之前发生。当WEB服务器启动并允许对应用程序所包含的文件进行请求时就触发Application_OnStart事件。



  所以现在可以将Global.asa内部的代码可以想象



 

本文作者:佚名 来源:5D多媒体
CIO之家 www.ciozj.com 微信公众号:imciow
    >>频道首页  >>网站首页   纠错  >>投诉
版权声明:CIO之家尊重行业规范,每篇文章都注明有明确的作者和来源;CIO之家的原创文章,请转载时务必注明文章作者和来源;
延伸阅读
也许感兴趣的
我们推荐的
主题最新
看看其它的