乐观 发表于 2015-1-16 22:37:45

ASP编程:深切研讨Application和Session工具

缺点:安全性不是太差了,还行,只要你充分利用系统自带的工具;唯一缺点就是执行效率慢,如何进行网站优化以后,效果会比较好。用ASP编写假造社区、网上购物等程序时,Application和Session工具具有无足轻重的感化,可以天真公道地使用这两个工具是进步程序质量的关头。上面让笔者依据本人在这方面的履历,向人人深切先容一下ASP的这两个内建工具。

  1、Application工具的成员概述

  Application工具成员包含Application工具的汇合、办法和事务。

  ⒈Application工具的汇合

  Contents汇合:没有利用<OBJECT>元素界说的存储于Applicaiton工具中的一切变量的汇合

  StaticObjects:利用<OBJECT>元素界说的存储于Application工具中的一切变量的汇合

  例:在default.asp中有以下赋值

  application("a")="a"

  application("b")=128

  application("c")=false

  则有contents汇合

  application.contents(1)="a"也可写为application.contents("a")="a"

  application.contents(2)=128也可写为application.contents("b")=128

  application.contents(3)=false也可写为application.contents("c")=false

  在此笔者保举你在挪用时利用类如application.contents("a")的办法,由于如许更加直不雅,假如用序号来暗示的话则要思索赋值的前后按次。

  ⒉Application工具的办法

  Contents.Remove("变量名"):从Application.Contents汇合中删除指定的变量

  Contents.RemoveAll():把Application.Contents汇合中的一切变量删除

  Lock():锁定Application工具,使得只要以后的ASP页对内容能举行会见

  Unlock():排除对Application工具的锁定

  例:在default.asp中:

  application("a")="a"

  application("b")=128

  application("c")=false

  response.writeapplication.contents(1)&"<br>"

  response.writeapplication.contents(2)&"<br>"

  response.writeapplication.contents(3)&"<br>"

  response.write"AfterRemoveb:"

  application.contents.remove("b")

  response.writeapplication.contents(1)&"<br>"

  response.writeapplication.contents(2)&"<br>"

  实行了局:

  a

  128

  False

  AfterRemoveb:

  a

  False

  假如要删除汇合中一切变量用application.contents.removeall便可,至于Lock和Unlock办法在实践中常常用到,读者也对照熟习,在此就不在包袱。

  ⒊Application工具事务

  OnStart:第一个会见服务器的用户第一次会见某一页面时产生

  OnEnd:当最初一个用户的会话已停止而且该会话的OnEnd事务一切代码已实行终了后产生,或最初一个用户会见服务器一段工夫(通常是20分钟)后仍旧没有人会见该服务器发生。

  想要界说application工具的OnStart和OnEnd事务里做甚么必要将代码写在Global.asa这个文件里(下文有举例),而且将该文件放在站点的根目次下(通常为Inetpubwwwroot)

  2、Session工具的成员概述

  Session工具的成员比Application工具多一项属性,即:汇合、属性、办法、事务

  ⒈Session工具的汇合

  Contents:没有利用<OBJECT>元素界说的存储于特定Session工具的一切变量的汇合。

  StaticObject:利用<OBJECT>元素界说的、存储于Session工具中的一切变量的汇合。

  例:在default.asp中有以下赋值

  session("a")="a"

  session("b")=128

  session("c")=false

  则有contents汇合

  session.contents(1)="a"也可写为session.contents("a")="a"

  session.contents(2)=128也可写为session.contents("b")=128

  session.contents(3)=false也可写为session.contents("c")=false

  ⒉Session工具的属性

  CodePage:可读/可写。整型。界说用于在扫瞄器中显现页内容的代码页。代码页是字符集的数字值,分歧的言语利用分歧的代码页。比方,ANSI代码页为1252,日文代码页为932,简体中文代码页为936。

  LCID:可读/可写。整型。界说发送给扫瞄器的页面区域标识。LCID是独一地标识区域的一个国际尺度缩写,比方,2057界说以后区域的泉币标记是"£"。

  SessionID:只读。长整型。前往本会话的会话标识符。每创立一个会话,由服务器主动分派一个标识符。能够依据它的值判别两个用户是谁先会见服务器。

  Timeout:可读/可写。整型。为会话界说以分钟为单元的超时限制。假如用户在这个工夫内没有革新或哀求任何一个网页,则该用户发生的会话主动停止。缺省值是20。

以上属性在实践使用中感化不年夜,并且基础上不必要怎样修正,这几个属性也没甚么特别的中央。

  ⒊Session工具的办法

  Contents.Remove("变量名"):从Session.contents汇合中删除指定的变量

  Contents.Removeall():删除Session.contents汇合中的一切变量

  Abandon():停止以后用户会话而且取消以后Session工具。

  Session工具的Contents.Remove("变量名")和Contents.Removeall()办法与Application工具的基础上没甚么区分,为匡助了解,人人能够参照下面的例子将Application改成Session。这里要申明一下的是Contents.Removeall()和Abandon()的区分,实行这两个办法城市开释以后

  用户会话的一切Session变量,分歧的是Contents.Removeall()纯真地开释Session变量的值而不停止以后的会话,而Abandon()除开释Session变量外还会停止会话激发Session_OnEnd事务,但愿人人注重二者的区分。

  ⒋Session工具的事务

  OnStart:当ASP用户会话发生时触发,一旦有任一用户对本服务器哀求任一页面即发生该事务。

  OnEnd:当ASP用户会话停止时触发,当利用Abandon()办法或超时也会触发该事务。

  这两个事务和Application的OnStart、OnEnd事务一样,也是必需放在Global.asa文件里,下
面就重点和人人研讨一下这四个事务的利用。

  3、Global.asa

  ASP的Application和Session工具表现了其他ASP内置工具所没有的特性--事务。每个访客会见服务器时城市触发一个OnStart事务(第一个访客会同时触发Application和Session的OnStart事务,但Application先于Session),每一个访客的会话停止时城市触发一个OnEnd事务(最初一个访客会话停止时会同时触发Application和Session的OnEnd事务,但Session先于Application)。

  OnStart和OnEnd这两个事务一样平常使用在假造社区中统计在耳目数、修正用户的在线离线形态等。要详细界说这两个事务,必要将代码写在Global.asa文件,并将该文件放在站点的根目次下(缺省是Inetpubwwwroot)。别的,Application和Session工具划定了在OnEnd事务里除Application工具外其他ASP内置工具(Response、Request、Server、Session...)一概不克不及利用。以下举一个假造社区统计在耳目数的例子来讲明怎样利用这两个事务。

  文件申明:

  global.asa位于d:Inetpubwwwroot目次下

  default.asp位于d:Inetpubwwwroot目次下,假造社区登录页面

  login.asp位于d:Inetpubwwwroot目次下,用于检测用户输出的用户名及暗码

  index.asp位于d:Inetpubwwwroot目次下,假造社区首页

  bbs.mdb位于d:Inetpubwwwroot目次下,存储用户信息的数据库

  数据库(ACCESS)布局:

  ===bbs表===

  id用户ID,长整型

  name用户名,文本型

  code暗码,文本型

  online在线形态,是/否

 
  ===global.asa===

  <scriptLANGUAGE="VBScript"RUNAT="Server">

  SubApplication_OnStart

   application("online")=0

  EndSub

  subApplication_OnEnd

  ndSub

  SubSession_OnStart

  EndSub

  SubSession_OnEnd

   ifsession.contents("pass")then判别是不是为登任命户的Session_OnEnd

    application.lock

    application("online")=application("online")-1

    application.unlock

   endif

  EndSub

  </script>

  ==============

  ===login.asp===

  ......暗码考证,毗连数据库,检测用户输出的用户名及暗码是不是准确

  if暗码考证经由过程then

   session("name")=rs("name")

   session("id")=rs("id")

   session("pass")=true

  else

   rs.close

   conn.close

   response.write"暗码毛病!"

   response.end

  endif

  application.lock

  application("online")=application("online")+1

  conn.Execute("updatebbssetonline=1whereid="&session("id"))将用户的形态设为在线

  application.unlock

  rs.close

  conn.close

  response.redirect"index.asp"初始化数据后跳转到社区首页

  ===========

  在本例中,用application("online")变量纪录已登录社区的在耳目数,由于一旦有效户会见服务器而不论用户是不是登录,城市发生OnStart事务,以是不克不及在OnStart事务里使Applicaiton("online")加一。由于不论是否是登任命户的会话停止城市发生OnEnd事务(假设有访客会见了服务器但其实不登录社区,他的会话停止后也会发生OnEnd事务),以是在Session_OnEnd事务里用了句if语句来判别是不是为已登任命户的OnEnd事务,假如是才将在耳目数减一。

  这只是一个统计在耳目数的复杂例子,关于一个完全的假造社区来讲,仅仅统计有几人在线是不敷的,在本例中数据库里有个online字段是用来纪录用户的在线形态,用户登录的时分,在login.asp里将online设为1,但用户离线时并未将online设为0,要完美它,就要修正一下Session_OnEnd事务,在该事务里将online设为0。

  ===global.sas===

  <scriptLANGUAGE="VBScript"RUNAT="Server">

  SubApplication_OnStart

   application("online")=0

   setapplication("conn")=Server.CreateObject("ADODB.Connection")

   application("db")=Server.MapPath("bs.mdb")此处最好利用相对路径bs.mdb,下文有具体先容

  EndSub

  subApplication_OnEnd

   setapplication("conn")=nothing

  EndSub

   SubSession_OnStart

  EndSub

  SubSession_OnEnd

   ifsession.contents("pass")then判别是不是为登任命户的Session_OnEnd

     application("con").open="driver={MicrosoftAccessDriver(*.mdb)};dbq="&application("db")

     application.lock

     application("online")=application("online")-1

     application("con").Execute("updatefriendssetonline=0whereid="&session.contents("id"))

     application.unlock

     application("con").close

   endif

  EndSub

  </script>

  ==============

  至此,完全的代码已完成了。由于在Application和Session的OnEnd事务里不克不及利用Server工具,以是要将数据库的毗连及数据库在服务器上的物理地点(d:inetpubwwwrootbs.mdb)存储在application变量中,并在Application_OnStart事务中事后处置。同理,在Session_OnEnd事务中不克不及用session("pass")来取代session.contents("pass")(以下有细致申明)。

  4、本文实例中值得引发注重的两点

  ⒈OnEnd事务里的session.contents

  刚入手下手打仗global.asa的伴侣常常会将下面Session_OnEnd事务里的

  ifsession.contents("pass")then 写成

  ifsession("pass")then,

  如许的话体系不会提醒毛病,可是永久也不会实行then前面的内容,这是由于在OnEnd事务里克制利用Session工具,可是能够用Session工具的汇合来挪用session变量。由于IIS并没提醒任何毛病信息,以是笔者已经在这下面华侈了良多工夫。在此但愿人人引觉得鉴!

  ⒉Application_OnStart事务里用Server.MapPath猎取数据库的物理地点时应利用相对地点为了申明这个成绩,人人能够做个实行:将下面Application_OnStart事务里的

  application("db")=Server.MapPath("bs.mdb")改成:

  application("db")=Server.MapPath("bbs.mdb")

然后在d:inetpubwwwroot目次下创建一个test子目次,写一个temp.asp在test目次里。

  ====test.asp====

  <%response.writeapplication("db")%>

  ================

再将temp.asp拷贝一份放在根目次下(d:inetpubwwwroot)。用记事本翻开global.asa,再翻开两个扫瞄器,扫瞄器A输出地点http://localhost/temp.asp,按回车,将在扫瞄器上输入:

  d:inetpubwwwrootbs.mdb

然后,在记事本的窗口上点"文件"菜单,选"保留"(使global.asa的修正工夫改动,从而使IIS重启动一切服务),再在扫瞄器B输出地点http://localhost/test/temp.asp,按回车,在扫瞄器上输入的是:

  d:inetpubwwwroot        estbs.mdb

global.asa文件固然是放在站点根目次下,可是假如在server.mappath中利用的是绝对地点,而触发Application_OnStart事务的用户第一次会见的页面又不是属于根目次的话,失掉数据库的物理地点将不会是希冀的了局,但愿人人要出格当心。使用filesystemobject,可以对服务器上的文件进行操作,浏览、复制、移动、删除等。有ado的支持,asp对数据库的操作非常得心应手。你甚至可以像使用本地数据库那样,管理远程主机上的数据库,对表格、记录进行各种操作。

愤怒的大鸟 发表于 2015-1-19 19:30:21

从事这个行业,那么你可以学ASP语言,简单快速上手,熟练dreamweav排版,写asp代码,熟练photoshop处理图片,打好基础就行了

因胸联盟 发表于 2015-1-25 10:55:44

Application:这个存储服务端的数据,如果不清除,会直到web应用程序结束才清除(例如重启站点)

蒙在股里 发表于 2015-2-2 21:47:03

学习ASP其实应该上升到如何学习程序设计这种境界,其实学习程序设计又是接受一种编程思想。比如ASP如何学习,你也许在以前的学习中碰到过。以下我仔细给你说几点:

活着的死人 发表于 2015-2-8 07:31:02

如何学好ASP,以前也有人问过,把回答给你转过来看看能否对你有帮助:

金色的骷髅 发表于 2015-2-25 00:13:19

跟学别的语言一样,先掌握变量,流程控制语句(就是ifwhileselect)等,函数/过程,数组

灵魂腐蚀 发表于 2015-3-7 14:39:28

学习ASP其实应该上升到如何学习程序设计这种境界,其实学习程序设计又是接受一种编程思想。比如ASP如何学习,你也许在以前的学习中碰到过。以下我仔细给你说几点:

海妖 发表于 2015-3-15 07:40:42

最近在学asp,不要问我为什么不直接学.net,因为公司网站是asp做的所以有这个需要,卖了本书asp入门到精通,对里面的六大内置对象老是记不住,还有很多属性和方法看的头晕。

若天明 发表于 2015-3-21 21:52:16

不能只是将它停留在纸上谈兵的程度上。
页: [1]
查看完整版本: ASP编程:深切研讨Application和Session工具