发信人: nightcat() 
整理人: (1999-06-14 11:27:36), 站内信件
 | 
 
 
转自"中国ASP(www.chinaasp.com)"
 
 Web源于静态文本,现在很多站点几乎还是采用这种方式。静态文本的缺点
 就是维护难(文件数目多)、查询难、修改难。虽然可以采用FrontPage对站
 点进行管理,但这只是其中的一个办法。现在,很多的站点都会在后台采用
 数据库,动态生成超文本。这样,要改变式样,只需修改几个文件;要变更
 内容,只需对数据库进行操作即可,而且易于保持一致性;而对于全文检索
 等查询应用,这种方式的优越性更为突出。(经常说的“动态”也包括图片
 的动态显示,如动态GIF、Java Applet等,本文所指为资料的动态性)通用
 网关界面CGI(Common Gateway Interface)和网络服务器应用程序界面
 ISAPI(Internet Server Application Programming Interface)与其他
 相关技术的出现,使我们能够方便地与Web Server进行沟通,从而象一些计
 数器、留言版等CGI程式相继出现并蔚然成风。但这些CGI程序都有一个很大
 的缺点,就是CGI(可用VB、Java、Perl、C或Dephi等编写)与html只能分开
 编写、分开运行,要将两者融合在一起并不容易,从而导致维护与编写都相
 当困难。因此,一些厂商后来都推出了自己的Script语言,来增强网页开发
 的功能。其中Netscape推出了JavaScript(for client端和for Server端
 两种);微软则推出了VBScript和Asp(Asp的语法与VB的语法类似)两种,也
 用于服务器端和客户端程序的编写。对于专业开发人员而言,客户端程序的
 最重要的一点是通用性,而服务器端的则强调功能和效率。对于Client端程
 序的开发,JavaScript无疑是最佳的,因为当今两大主流浏览器IE和
 Netscape都宣称支持该标准;而VBScript则只有IE才能支持。但令我们苦恼
 的是对某些JavaScript的标记,IE或IE的某些版本并不一定会支持,这必导
 致我们不得不把一部分程序移到服务器端去执行,因为服务器端的程序会先
 解释生成html(或含ActiveX)文本,再送到客户端,故不存在兼容问题。 
 livewire(JavaScript for Server端的编译器)和Asp一样,都是一些手稿
 语言(手稿是指类似client端的JavaScript一样的、可嵌套在html文本里面、
 只需用标记标明是由服务器执行的程序段),也就是类似C/C++一样的面向对
 象的语言。livewire的文件后缀名还是html,asp的文件后缀名则是asp,
 因为asp的文件在客户读取它的时候,服务器才进行解释,而livewire的文
 件则必须预先进行编译(每次修改后,都要重新编译)。asp有相应的辅助开
 发工具(InterDev),可代为生成一些控件。当然,这些并不重要,关键是你
 采用的是Netscape Web Server还是微软的IIS。但就一般而言,因为IIS
 是捆绑在NT上的,故采用IIS的用户会偏多一些。 
  自从Netscape公司推出了livewire和微软推出了Active Server Page
 以后,程序员编写网上程序就方便和容易了很多。但这种Script类的语言
 有一个共同的缺点,那就是由于是解释执行的,故速度不会太快。最近,
 微软建议采用三层模型,中间层可以不用asp,而直接采用VB6.0生成的
 ActiveX控件,因为是编译执行的,故速度较快,不过这是后话。 
  1.Asp的基本对象 
   Asp(Active Server Page)是一种类似于VB的面向对象的程序语言。
 在这里并不想详述对象等一些基本概念,而是直接介绍其语言特性,以便
 开发人员能够熟练地对asp程序进行修改和编制(因为很多人都只是直接
 利用开发工具如InterDev来生成asp程序)。 
   首先,Asp程序的存档名称肯定是“asp”;其次,在asp程序里面,
 服务器端的Script要放在<%和%>字符串中间,例如
 <% user=request("user") %>。如果你想在一个Asp文件中调用另一个
 Asp文件,则可在Asp中加上下面的声明: 
   < ! -- #INCLUDE VIRTUAL|FILE="***.asp" -- >,这有些象
 C语言中的#include。其中,Virtual表示虚拟文件路径,File表示真实
 文件路径。 
   Asp有五个主要的内建对象:Request、Response、Server、Session、
 Application,下面将分别举例对其进行说明。 
  1.1 Request 
   Asp依然遵从流行的、利用客户端的Form进行数据交换的方法。Asp
 内建的request对象拥有五个获取客户端资料的方法
 (QueryString/Form/Cookies/ServerVariables/ClientCertificate)。 
   语法:request.方法名称("参数")|request("参数") 
   如果采用后者,系统会自动选择相应的方法。 
   1.1.1 Form 
    在这里再重新强调Form的一些属性: 
    <Form Action=被调用的程序的url 
    Enctype=资料传送的MIME形态 
    Method=传送资料的方式Get/Post 
    Onrest=按下rest键调用的程序 
    Onsubmit=按下sumit键调用程序 
    Target=输出内容的frame窗口></Form> 
    使用Form传送信息一般有三种方式:由html网页内的Form传信息
 给其他Asp;由Asp内的Form传信息给另外一个Asp;Asp内的信息传送
 给自身。 
    语法:Request.Form(参数)[(索引)] 
    其中参数表示Form中元素的名称,索引表示相同名称元素的顺序号。 
    例: 
    <% 
    For I=1 To Request.Form("user").Count 
    Response.Write Request.Form("user")(I) 
    Next 
    %> 
   可循环读取名称为user的元素,其中Count是Form的系统属性,用于
 计算同名元素的个数,如果该元素不存在,则其值为零。如果没有指明要
 读取第几个同名元素,则系统会把全部同名元素的值都读取出来,并用
 “,”作间隔。 
   例:Request.form("user")=abc,bcd,cde 
    1.1.2 QueryString 
    语法:Request.QueryString(参数)[(索引)] 
   除了用Form传输资料外,还可通过在超链接后接“?”的方式传输信息,
 如:<A href="***.asp?user=abc">,这时可通过
 Request.QueryString("user")读取传输的信息;如果出现多个重名的参
 数,如:<A href="***.asp?user=abc&user=bcd&user=cde">,则第一次
 Resquest.QueryString("user")=abc,
 第二次Resquest.QueryString("user")=bcd,
 第三次Resquest.QueryString("user")=cde。 
    1.1.3 ServerVariables 
    语法:ServerVariables(参数名称) 
    我们知道Web/Browse的传输协议是http,http的报头会有一些客户
 端的信息,如 
   客户IP地址、浏览器的语言系统等。这时可通过
 Request.ServerVariables("***")获取相关信息,如
 Request.ServerVariables("Accept_Language")可获取客户端浏览器 
   的语系。其他系统参数见下表: 
    SERVER_NAME server的机器名称或IP地址。 
    SERVER_PORT server正在运行的端口号。 
    REQUEST_METHOD 发出request的方法(GET/POST/HEAD)。 
    SCRIPT_NAME 程序被调用的路径,如:cgi-bin/a.pl。 
    REMOTE_HOST 发出request请求的远端机器(client)的名称。 
    REMOTE_ADDR 发出request请求的远端机器(client)的IP地址。 
    REMOTE_IDENT 发出request的使用者名称(如是拨号上网,则为用户ID),  
    当NCSA IdentityCheck为enabled,而且client机器支持 
    RFC 931时,该变量有效。 
    CONTENT_TYPE 数据的MIME类型,如:“text/html”。 
    HTTP_ACCEPT client可以接受的MIME类型列表。 
    HTTP_USER_AGENT client发出request的浏览器类型。 
    HTTP_REFERER 在读取CGI程序之前,client所指的文本URL。 
    1.1.4 Cookies 
   在客户端,Cookies记录了客户端浏览器很多的信息,我们可通过
 Request.Cookies("名称")命令获取它的值,也可通过
 Response.Cookies("名称")="值"在客户端记录一些信息,以便控制访问
 者。设置多重Cookies的方法为Response.Cookies("名称")("名称")="值"。 
    1.1.5 Cache 
    我们可以在浏览器上设置从Cache中抽取已经访问过的页面的信息,
 同样,在Asp程序中也可进行类似的设置。其中Response.Clear为清空客
 户端的内存。Response.Buffer=True设置可从Cache中读取资料(缺省时
 为False)。 
    1.1.6 ClientCertificate 
    ClientCertificate用于获取客户端浏览器的身份确认信息
 (符合X.509标准),但客户端浏览器必须支持SSL3.0或PCT1协议。
 这里需做两步工作,第一步:web server必须启动用户端认证选项;
 第二步:对客户端浏览器进行相应设置,这样,该方法才会生效,否则,
 传回empty值。 
   1.2 Response 
    当要从服务器传送资料到客户端时,可通过下面的方法: 
    1)Response.Write直接输出信息,如Response.write "<html>"。 
    2)Response.Redirect引导客户端到另一个url位置,如
 Response.Redirect "http://zyr.yeah.net",但这里有一个问题
 需要注意,就是该语句一定要放在<html>标记前执行,也就是说在服务器
 未向客户端送出html文本报头前就要被执行,否则会出现传输错误信息。 
   3)Response.ContentType控制输出的文件类型,服务器送给客户端
 的数据包类型可以是text/html文本,也可以是gif/jpeg图形文件,所以每
 次传输前,我们都必须告知客户端将要传输的文件类型,一般默认情况下为
 “Text/Html”类型。例如<% Response.ContentType="IMAGE/JPEG" %>。 
   4)Response.Cookies 用于设置Cookies的值,语法为:
 Response.cookies(变量名称)[(key)|属性]=写入的信息。(key的用法前
 面已作说明,这里不在叙述)cookies系统默认有五个属性,包括Expires
 (时间)、Domain(域名)、Path(路径)、Secure(安全性)、
 Haskeys(判断cookies下是否还有其它cookies文本)。如:
 <% Response.Cookies("type").Expires="Sep 9,1998" %>。 
    5)Response.Buffer用于确定是否把信息传输到缓冲区。因为有时
 候我们希望把部分中间信息送到缓冲区,然后继续工作。当所有处理工作
 都完成后,才把信息输出到客户端。但当在处理过程中Flush或End方法被
 调用,则缓冲区内容将被输出。 
    Response的其它属性: 
   Expires:设定网页保留在客户端浏览器的时间长度。 
   ExpiresAbsolute:设定网页保留在客户端浏览器的日期与时间。 
    Response的其它方法: 
   AddHeader:设定HTML文件的HTTP报头。 
   AppendToLog:在Web Server记录档案末尾,添加字串。 
   Clear:清除在缓冲区中的HTML输出资料。 
   End:停止处理asp档案,并回传当时状态。 
   Flush:立刻送出缓冲区的HTML资料。 
    1.3 Server 
   Server对象会为你提供一些固定的server端的方法和属性,包括
 ScriptTimeout、MapPath和URLEncode等。其中ScriptTimeout是server
 的属性,可规定一个asp程序执行的最长时间,如:
 server.scripttimeout=200(计数单位为秒,缺省时为90秒)。 
   MapPath是server的一个方法,用于把web server的虚拟路径转换
 为实际路径。如server.mappath("/")=c:\inetpub\wwwroot,对于路径
 参数“/”和“\”,Asp都会视为一样。在这里有一点要注意的是,系统只
 是对应web server的真实根目录输出结果,而不会去检查文件系统中是否
 真的存在这样一个目录。 
    URLEncode是server的另外一个方法,该方法会根据URL编码原则,
 把源字符串编码为目标字符串,其中空白的字符用“+”代替。
    1.4 Session 
    Session是asp中一个非常重要的对象,在用一些传统的语言编程时,
 都会涉及到变量是定义为全局变量还是局部变量这个问题。但在Internet
 上的开发却很少提及这个问题(Java除外),因为每一个html页面都是非
 相关的,传输完毕后,全部链接都会断开。在asp中则不一样,我们可以定
 义一些全局变量,这里的全局是指在当前浏览器没有被关闭前都可以被使
 用。这些变量可以在Global.asa中进行定义。如果你的Web应用程序是用
 InterDev自动创建的,则会在根目录找到该文件;如果不是则可自行创建。 
    语法:session.属性|方法 
    一般建立新的session对象都是采用set关键字,如
 <%set session("变量名称")=要赋的值。如果赋给session变量的是一个
 数组,则读取时需存放到数组中,因为系统是将其视为一个对象(object)。 
     1.5 Application 
   Global.asa是用于定义session、application和object对象的一个
 文件,客户端是不能看到该文件的。但该文件一定要放在程序的根目录上,
 而且文本中不能有html标记并且文件名不能改动。下面是一个Global.asa
 文本的范例。 
   <SCRIPT LANGUAGE=VBScript RUNAT=Server> 
   Sub Session_OnStart 
    '==Visual InterDev Generated - DataConnection startspan== 
    '--Project Data Connection 
   Session("nnb_ConnectionString") = "DSN=***;UID=zyr;APP=Microsoft ( R) Developer Studio;WSID=ZYR;DATABASE=***" 
   Session("nnb_ConnectionTimeout") = 15 
   Session("nnb_CommandTimeout") = 30 
   Session("nnb_RuntimeUserName") = "zyr" 
   Session("nnb_RuntimePassword") = "******" 
   '==Visual InterDev Generated - DataConnection endspan== 
   End Sub 
   </SCRIPT> 
    Application与session的区别在于,网上的用户都可以使用
 Application的对象,因而是需要加锁的;而session只是针对一个客户
 而已。如定义一个Application变量为Application("name")="1234"。 
    Asp的功能仅此而已?当然不是,Asp更高级的应用还包括它内建有
 一些ActiveX控件和可调用其它的控件等功能,暂不在本文讨论。如果希望
 获取更多的信息,可以访问下面的站点: 
    http://www.microsoft.com/asp 
    http://zyr.yeah.net 
    http://www.kj.com.tw 
   2.Asp的编程实例 
   为了使大家对上面提到的功能有一个感性的认识,下面我们将以一个
 非常简单的用asp编写的chatroom(交谈室)作为例子。为了尽量简化,
 我们这里只采用四个文件,一个是主文件main.asp和enter.asp(让用户
 输入用户名),一个是资料输入文件input.asp,一个是显示文件show.asp。
 原理是定义一个application变量show,然后每次有人说话,我们都把它
 加到前面;另外显示文件show.asp每三秒钟刷新一次,用于显示show变
 量.全部工作仅此而已,用其它语言或方法可能需要更复杂的工作,在这里
 则变得非常简单和明了。(这里没有使用Global.asa文件。) 
   2.1 main.asp文件 
   <% 
   if session("sname")="" then 
    response.redirect "enter.asp" 
   end if 
   ;如果用户没有输入名字,则将重新回到名字输入界面 
   %> 
   <html> 
   <frameset rows="80%,20%"> 
    <frame name="show" src="show.asp"> 
    <frame name="input" src="input.asp"> 
    <noframes> 
    <body> 
    <p>This page uses frames, but your browser doesn't support them.< /p> 
    </body> 
    </noframes> 
   </frameset> 
   </html> 
   2.2 enter.asp文件 
   <% 
   nickname=request.form("nickname") 
   ;读取用户输入的名字 
   if nickname="" then 
    msg=msg+"请输入您的名称<br>" 
   else 
    response.cookies("whoami")=nickname 
   ;把用户名字写到cookies中 
    application.lock 
    application("show")="<table border=0 bgcolor='ccffcc' width='500' >" _ 
   &"<td>来至" & request.servervariables("rem ote_addr") _ 
   & "的" & request.cookies("whoami") & "大驾光临...</td>< /table>" _ 
   & application("show") 
   ; _是分隔符,与VB一样 
    application.unlock 
    session("sname")=nickname 
    response.redirect "main.asp" 
   end if 
   %> 
   <html> 
   <body> 
   <form method="POST" action="enter.asp"> 
    你的姓名: 
    <input type="text" name="nickname" size="20" maxlength="10"> 
    <input type="submit" value="进入聊天室" name="B1"> 
   </form> 
   </body> 
   </html> 
    
   2.3 show.asp文件 
   <html> 
   <head> 
   <meta http-equiv="refresh" content="3"> 
   ;设置每三秒钟刷新一次 
   <meta name="Microsoft Border" content="none"> 
   <title>聊天的内容</title> 
   </head> 
   <body bgcolor="#FFFFFF"> 
   <%=application("show")%> 
   </body> 
   </html> 
    
    2.4 input.asp文件 
   <% 
   mytalk=trim(request.form("txtbox")) 
   ;读取用户写的信息,trim用于去掉后面的空格 
   application.lock 
   application("show")="" & request.cookies("w hoami") & _ 
    ":" & mytalk & "<br>" & application("show") 
   ;把新的信息添加到application变量show的前面,其中
     ;request.cookies("whoami")是从 
   ;cookies中读出该用户的名字。 
   application.unlock 
   %> 
   <html> 
   <head> 
   <meta name="Microsoft Border" content="none"> 
   <base target="input"> 
   <title>输入界面</title> 
   </head> 
   <body bgcolor="#FFFFFF"> 
   <form method="POST" action="input.asp" target="input"> 
    <p><%=request.cookies("whoami")%> 
    输入:<input type="text" name="txtbox" size="30"> 
   <input type="submit" value="发送" name="go"> 
   </form> 
   </body> 
   </html> 
 
   
  -- ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.103.124.16]
  | 
 
 
 |