以文本方式查看主题 - 计算机科学论坛 (http://bbs.xml.org.cn/index.asp) -- 『 Dot NET,C#,ASP,VB 』 (http://bbs.xml.org.cn/list.asp?boardid=43) ---- ASP编程入门进阶(连载)[转帖] (http://bbs.xml.org.cn/dispbbs.asp?boardid=43&rootid=&id=13576) |
-- 作者:Qr -- 发布时间:1/14/2005 1:21:00 PM -- ASP编程入门进阶(连载)[转帖] (一) 安装配置服务器 鉴于ASP脚本语言是在服务器端IIS或PWS中解释和运行,并可动态生成普通的HTML网页,然后再传送到客户端供浏览的这一特点。我们要在本机上进行调试,那就要求我们的个人电脑具有服务器的功能。 不要看到“服务器”三个字就感到担心:我的机子配置这么底,性能这么差,是不是不能配啊。放心!配个服务器,就是多装个软件,况且就自己一个人用,根本没有必要多虑。那具体的装个什么软件呢?刚才我们也看到了是在“IIS或PWS中解释和运行”,很明显,装IIS或者PWS就可以了。 IIS为何物?IIS是Internet Information Server的缩写,它是微软公司主推的Web服务器。那PWS呢?它就显得有些古老了:)早期在WIN98,当然现在仍有人采用的操作系统,PWS(Personal Web Server)是一般用户最容易得到的web服务器: 在win98的安装盘的Add_on\pws目录下就可以找到pws的安装程序。而对于IIS是我们所推荐的,也是大部分朋友在使用的,有必要。 1,打开控制面板
2,在控制面板中选择“添加/删除Windows组件”,打开窗口
3,点击“添加/删除Windows组件”后稍等片刻。出现“Windows组件向导”窗口。从中打勾“选择Internet信息服务(IIS)”
4,在“Windows组件向导”中单击“下一步”。开始安装配置我们的服务器IIS。
5,等待进度条跑到终点。。。终于复制文件全部完成,配置服务器也相应的结束。
6,IIS服务器算是安装OK了,那具体有什么用处?又该如何使用呢?
7,这,就行了?你知道下面怎么办呢?很是没头绪,对吧。费尽心思学到现在,就是看了人家的一个ASP页面。
8,然后,从“开始”菜单,“程序”—“附件”—打开“记事本”。 <%=now()%>
9,接着将文件保存到E:\myasp\文件夹里面,并且命名为time.asp
10,一个很简单的ASP文件就OK了,下面我们怎么办?一句话:调试。 11,那如何标记呢?也就是如何建立一个虚拟目录呢?
从中选择“Internet服务管理器”
12,弹出的窗口中右键“新建”—“虚拟目录”。
13,弹出“虚拟目录创建向导”。
下一步,填写别名:myasp。
再下一步,目录:浏览到E:\myasp即可。
紧跟一步,访问的权限一定要把“读取”和“运行脚本”打勾。
最终点击“完成”。 14,结果如下:
15,那么剩下的就是调试该time.asp了。
16,最终页面如下:
17,看!就这么简单,你已经ASP入门了。 |
-- 作者:Qr -- 发布时间:1/14/2005 1:23:00 PM -- 认识表单 (二)认识表单 说实话,无论是asp,php还是jsp进行网络编程的时候,都离不开和用户的交互。 一,首先看<form>内部参数 二,再来看Input相关 2,type=password 3,type=file 4,type=hidden 5,type=button 6,type=checkbox 7,type=radio 8,type=image 9,type=submit and type=reset Input的Type总结下来有10个,还是不少的,呵呵 三,接着再来看Select相关 2,跳转菜单 3,下拉列表 四,最后关注的Textarea 最后总结:input根据type分10类,select从option处又分菜单和列表,textarea有行有列的文本输入区域 |
-- 作者:Qr -- 发布时间:1/14/2005 1:24:00 PM -- (三):接触脚本程序 有了前面的html中关于form的强化知识,是不是在想,下面就可以开始ASP之旅呢?未必。 首先说说ASP是贵为何物吧。ASP是Microsoft Active Server Pages的简称,它是一种服务器端脚本环境,可用来创建交互式 Web 页并建立强大的 Web 应用程序。可以表明ASP是一种基于服务器端的脚本环境,那就明白ASP为什么需要IIS支持了,因为IIS即为常用的一类web服务器;那也就明白为什么要学脚本语言了,因为ASP提供的是一种脚本环境。 再次需要说明的是,ASP只是一种环境,而非一种语言。如果真要形象化地说是ASP是网络编程语言的话,那也是属于一个html+脚本+asp提供的内置对象及组件的功能强大的混合语言。 所以,学点脚本非常重要!其实无论是学脚本语言,还是其它语言,我认为首先需要了解的是该语言涵盖的各类特性,包括:数据类型、事件、方法、 对象、属性、语法等当然这都是些空谈,正如在大学课堂上的某计算机语言课一样,搞纯研究性的就是觉得有些索而无味。还是实用些的好,能解决问题的程序才是好程序(印证能逮到老鼠的猫就是好猫的经典圣语,呵呵) 当然,语言这东西还是要你去好好钻研的,比如你写求绝对值的程序,其实一个abs()函数就搞定了。再比如你会vb脚本,但把同样程序替换成java脚本就会出错,它们的数据类型不同,语句语法也不一样啊。正如说中文和外文一样,要会发音标(数据类型),会如何发音(方法),如何说成一句话(语法)……呵呵,有点让你难受吧。行!直接了当。你以后需要注意的是语言的函数、语法。当然也不是让你全看,按照教程中的遇到一个掌握一个。教程学完,差不多也结束了。呵呵,你要相信我。 目前有两种主要的脚本语言:VbScript和JavaScript。因为VbScript作为IIS默认的服务器脚本,所以我们所谈所学的基本是围绕VbScript为脚本的ASP的,当然也不排除有的时候使用javascript. 举一个很简单的例子: <script language="vbscript"> <script language="javascript"> } 一时来劲,可能大家都看到网上有种狂恶心的对话框组,原理是什么呢?请看: <script language="vbscript"> 在来个开页和退页弹出对话框的原理吧 以上只是一个显示对话框msgbox,当然还有书写对话框inputbox也顺便看下吧。 <script language="vbscript"> 再来看看几个实用的函数: lentext=len(text) alert ("文本长度是:"&lentext) 根据这几个,经常看到的长文章后面加“......”的情况就是如下: <script language=vbs> 还有个比较重要的函数replace() text=replace(text,"妈的","MD") </script> 经常在发送EMAIL时,添加多个地址,中间采用“;”号进行分隔,那具体怎么分解接受过来的多个EMAIL地址呢?采用Split函数:Split 函数从字符串中返回数组。 这些都是比较现实较好玩的些,玩中学习也不错:)但毕竟我们是要编程的,说到编写程序,我知道程序结构可以分: 顺序结构没多少要说,因为程序执行基本都是这方向。 <body> 以上程序很简单吧,只要能认识英文就会懂程序(我是这么理解的:) 有关上一程序中的document.bgcolor就是文档的背景色,document.fgcolor就是文档的前景色(文字色),下一程序是动态改变背景颜色的。 <script language="vbscript"> 有关条件选择结构的嵌套再show出一个表单检测的程序 <html><head><title>abc</title> 程序是给出来了,但看起来比较难懂,有时程序执行时间也比较重要,所以得精简程序代码。 <html><head><title>abc</title> <script language=vbs> 当然循环不只可以用for,还可以用do while...loop等 应该有些成就吧,学语言,学编程就是学语法语义,学编程架构思想。 函数参看: 呵呵,把以上的程序吃透,最好再多看看脚本参考手册,跟我就可以开始ASP的上路了。 补: Function过程与Sub过程类似,但是Function过程可以返回值。 |
-- 作者:Qr -- 发布时间:1/14/2005 1:25:00 PM -- (四):内置对象Request 系统学习ASP,就是先从ASP的几大内置对象开始的. 当然一直还没有提到的就是,ASP到底是什么样?我看代码怎么知道是ASP代码? 那为什么要学对象,对象的作用又是如何的? 而Request对象的主要作用就是:在服务器端接受并得到从客户端浏览器提交或上传的信息。Request 对象可以访问任何基于 HTTP 请求传递的所有信息,包括从Form表单用 POST 方法或 GET 方法传递的参数、cookie 等。 一,Request.form("name") 这是接受上一页的信息时,常会用到的一种接受方式。Request是ASP对象,form则是Request对象所包含的对象集合(这要有区别与HTML页中的form表单,是不一样的),name也就是上一页表单中的某个文本框、密码框,或者隐藏域等的名称。并且还有一点非常重要:上一页Form表单的递交方法一定要为Post方法。 1,test1.html(本页是HTML的,主要提供输入信息的平台,以将信息提交到再下面的ASP页进行接受处理) 注意method就是post,且提交的页面action为submit1.asp。 2,submit1.asp(ASP页面,进行从test1.html接受name="yourname"和name="yourpwd"的两个值)
通过IIS进行HTTP协议的页面调试,你会发现两个页面进行了关联:test1.html中动态输入的name和pwd,在submit1.asp也则进行相应的动态显示。 3,改进的submit1.asp
采用了for循环语句,将上页所有的form标签信息进行接受、并显示。这在上表单页有很多项目时,非常快捷地出来结果。 二,Request.querystring("name") 此时由Request.form变为Request.querystring,最主要的还是上页表单递交时,采用的什么方法。当采用post就用Request.form,否则当采用get时就采用Request.querystring了。 那Request.querystring最大特色在哪里呢?Request.querystring能检索并接受 HTTP 查询字符串中变量的值,而HTTP 查询字符串则是由问号 (?) 后的值指定的。说了大半天,继续看一个程序。 1,test2.html(本页同是HTML的,主要提供输入信息的平台,以将信息提交到再下面的ASP页进行接受处理,注意提交方法是get) 和test1.html最大区别也就是method="get" 2,submit2.asp(ASP页面,进行从test1.html接受name="yourname"和name="yourpwd"的两个值)
注意此时的浏览器地址栏,文件后面多出了?号,?号后面附有变量名及所被赋的值,当然多个变量名之间是用&号进行连接的。 刚才说到不同的变量名之间是用&号进行连接,但如果是相同的变量名时,request.querystring到底是提取前一个?后一个?还是两个一起?
很明显当点《xsp教程》时,显示的是“《xsp教程》,《xml》”,中间自动加了“,”号。 最后仍需要说明的是:request.querystring在分页程序里面是经常用到的。象http://www.cnbruce.com/database/ 三,Request.ServerVariables("xxx")
可以看到一大堆环境变量,其中还有没有值的,下面摘取几个比较常用的。 http_accept_language(浏览语言):<%=request.servervariables("http_accept_language")%> CONTENT_LENGTH(客户端发出内容的长度):<%=request.servervariables("CONTENT_LENGTH")%> CONTENT_TYPE(内容的数据类型。如“text/html”。同附加信息 的查询一起使用,如 HTTP 查询 GET、POST 和 PUT):<%=request.servervariables("CONTENT_TYPE")%> LOCAL_ADDR(返回接受请求的服务器地址。如果在绑定多个IP地址的多宿主机器上查找请求所使用的地址时,这条变量非常重要):<%=request.servervariables("LOCAL_ADDR")%> REMOTE_ADDR(发出请求的远程主机client的 IP 地址):<%=request.servervariables("REMOTE_ADDR")%> SERVER_NAME(出现在自引用 URL 中的服务器主机名、DNS 化名 或 IP 地址):<%=request.servervariables("SERVER_NAME")%> SCRIPT_NAME(主机名后面的虚拟地址):<%=request.servervariables("SCRIPT_NAME")%> LOGON_USER(用户登录 Windows NT 的帐号):<%=request.servervariables("LOGON_USER")%> SERVER_PORT(发送请求的端口号):<%=request.servervariables("SERVER_PORT")%>
其中http:// 用引号引起,表示是一字符串,a和b分别是对应了具体值的变量,在ASP中进行这样的连接就是采用&号。 根据这个结果,我们是不是就可以随时提取动态的URL地址了。 再来看看query.asp,要求一定要保存为query.asp的,因为如果不是该文件名,程序指向就会出错。
先将当前文件的地址取出并赋值给变量filepath 四,Request.Cookies("name") 以上四则运用,属于Request对象的所包含的四个对象集合:form、querystring、servervarivables、cookies。当然还有个ClientCertificate就不说啦 一个ASP内置对象除了对象集合外还有对象属性、对象方法 Request对象的对象属性只有一个就是TotalBytes(接受的字节数),你可将
该语句加入到任何一个接受数据的ASP页面中进行显示了。 Request对象的对象方法也还是一个:BinaryRead 。 OK~!有关Request对象的学习就差不多了,最主要是先好好理解三个对象集合,cookies不着急,下节继续学习对象Response。 |
-- 作者:Qr -- 发布时间:1/14/2005 1:27:00 PM -- (五):内置对象Response 通过对Request对象的学习,可以了解到,Request对象是服务器端用来获取客户端的信息的。 但作为服务器和客户端进行交互,是不是还缺少服务器端向客户端发送信息呢?对象Response正是担任此责任。 负责将信息传递给用户的对象就是Response了,它可动态地响应客户端的请求,并将动态生成的响应结果返回给客户端浏览器。 一,Response.write 在Response中write方法是使用最频繁的一个了,write就是写:将指定的字符串写到当前的 HTTP 输出。 1,write.asp
以上遇到一个随机函数rnd(),该函数返回一个小于 1 但大于或等于 0 的值。 下面一个利用随机函数的例子,产生随机背景颜色效果: 当然要产生指定范围的随机整数,请使用以下公式: 二,Response.end 2,end.asp
3,clear.asp
4,end2clear.asp <form method="POST" action="<%=filepath%>"> <%
四,Response.redirect 5,redirect.asp
那response对象的属性有哪些呢? 五,Response.ContentType 6,contenttype.asp(非text/html的)
7,charset.asp
七,Response.expires 8,expires.asp
9,status.asp
Response.buffer=true
应用举例题
About Comments suij=replace(suij,".","9") '然后对变量suij中小数点符号转换为数字9 9是随便设定的值 主要是为了产生颜色的16进制代码的 cnbruce 随机函数rnd(),该函数返回一个小于 1 但大于或等于 0 的值。你的意思也就是说:0<rnd()《1。是这个意思吗?如果是这个意思的话,那怎么样才能产生自然数(1,2,3……) 看来这位朋友没有好好看我的教程,上面不是说得好好的吗 Int((upperbound - lowerbound + 1) * Rnd + lowerbound) <script language=vbs> |
-- 作者:Qr -- 发布时间:1/14/2005 1:29:00 PM -- (六):Cookies讲座 什么是 Cookie?Cookie 其实是一个标签,经常可能听到的中文翻译:小舔饼。当你访问一个需要唯一标识你的站址的 WEB 站点时,它会在你的硬盘上留下一个标记,下一次你访问同一个站点时,站点的页面会查找这个标记。 每个 WEB 站点都有自己的标记,标记的内容可以随时读取,但只能由该站点的页面完成。每个站点的Cookie与其他所有站点的Cookie存在同一文件夹中的不同文件内(你可以在 win98 的 Windows 目录下的 Cookie 文件夹中找到它们,而 win2k 则在 Documents and Settings 文件夹下特定用户的 cookies 文件夹中)。 一个 Cookie 就是一个唯一标识客户的标记,Cookie 可以包含在一个对话期或几个对话期之间某个 WEB 站点的所有页面共享的信息,使用 Cookie 还可以在页面之间交换信息。这项功能经常被使用在要求认证客户密码以及电子公告板、WEB 聊天室等 ASP 程序中。 尽管现在听起来cookie没有什么激动人心的,但实际上利用它,你能实现许多有意义的功能!比如说:你可以在站点上放置一个调查问答表,询问访问者最喜欢的颜色和字体,然后根据这些定制用户的web界面。并且,你还可以保存访问者的登录密码,这样,当访问者再次访问这个站点时,不用再输入密码进行登录。 当然,cookie也有一些不足。首先,由于利用cookie的功能可以编程实现一些不良企图,所以大多数的浏览器中都有安全设定,其中可以设置是否允许或者接受cookie(IE浏览器中“工具”--“Internet选项...”--“安全”--“自定义级别”--“Cookie的使用”;Netscape浏览器中“工具”--“Cookie管理器”--“管理贮存的Cookie”即可),因此这就不能保证随时能使用cookie。再者,访问者可能有意或者无意地删除cookie。当访问者的机器遇到“蓝屏”死机时,或者重新格式化硬盘、安装系统后,原来保存的cookie将全部丢失。最后一点,有一些最初始的浏览器并不能支持cookie。 ◆ 创建cookie的基本语法: Response.Cookies(cookie)[(key)|.attribute]=value ①Domain 若被指定,则 cookie 将被发送到对该域的请求中去。域属性表明cookie由哪个网站产生或者读取,默认情况下,cookie的域属性设置为产生它的网站,但你也可以根据需要改变它。(Response.Cookies("CookieName").Domain = "www.mydomain.com") ②Path 为一路径属性,该属性可以实现更多的安全要求,通过设置网站上精确的路径,就能限制cookie的使用范围。如果未设置该属性,则使用应用程序的路径。(Response.Cookies("CookieName").Path = "/maindir/subdir/path" ) ③Expires 指定 cookie 的过期日期。为了在会话结束后将 cookie 存储在客户端磁盘上,或在许多时候,我们希望能更长时间地在访问者的计算机上保存cookie。必须设置该日期。若此项属性的设置未超过当前日期,则在任务结束后 cookie 将到期。 后面的代码,就可以设置cookie的使用到期时间为“2010年1月1日”: Response.Cookies("CookieName").Expires=#January 01, 2010#
◆ 读取cookie的基本语法:Request.Cookies(cookie)[(key)|.attribute] 案例分析: ◆ num.asp(通过留在本地磁盘上的cookie记录一年内访问本站的次数,第一次显示“首次访问”,以后显示“第几次访问”)
If bgcolor <>"" or fgcolor <>"" then
|
-- 作者:Qr -- 发布时间:1/14/2005 1:29:00 PM -- (七):内置对象Server Server 对象提供对服务器上的方法和属性的访问 , 其中大多数方法和属性是作为实用程序的功能服务。(IIS HELP翻译) 呵呵,上面的可不是,900秒了。
在理解脚本运行时间之前,先来看一个程序,主要功能就是进行计算网页执行时间的。 当然对应的ASP也就是看到许多站点都有的页面执行时间显示 1,time.asp
时间的设定当然要是比默认90秒大的,现在的代码就是:指定服务器处理脚本在 110 秒后超时。 以上的ScriptTimeout就是Server对象唯一属性了 二,Server.HtmlEncode 还是看一个程序,我想在页面显示“ ”这样的代码(附: 是空格的代码) 所以,为了要让一些特殊代码能够显示,就运用该方法了。 2,htmlencode.asp
这在许多网站,论坛都存在的一些BUG,不信你可以到各论坛试试:敲入 就是没有,急死你呢:)当然HtmlEncode只是其中的一个原因,最主要的还是UBB代码的转换。不过关于这点我也已经调试解决了。 三,Server.UrlEncode 3,urlencode.asp
4,vurlencode.asp <%filepath=request.servervariables("script_name")%> 接受URL中的值(没有处理接受值,发现值被解释了): <%=request.querystring("cnbruce")%> <form action="<%=filepath%>">
四,Server.MapPath
Path 指定要映射物理目录的相对或虚拟路径。若 Path 以一个正斜杠 (/) 或反斜杠 (\) 开始,则 MapPath 方法返回路径时将 Path 视为完整的虚拟路径。若 Path 不是以斜杠开始,则 MapPath 方法返回同本文件中已有的路径相对的路径。这里需要注意的是 MapPath 方法不检查返回的路径是否正确或在服务器上是否存在。 5,mappath.asp
测试我的地址http://www.cnbruce.com/server.asp 有此些了解,对路径的处理应该要好多了,再返回我的站点,看看我对数据库的mappath路径的处理方法,相信又是一个理解层次了。 五,Server.CreatObject 恩,那今天就主要把Server对象学习了下,感觉好象是每个都有用的,重要啊。 |
-- 作者:Qr -- 发布时间:1/14/2005 1:30:00 PM -- (八):内置对象Session Session对象 这些真的是很重要的功能,尤其是有会员的系统必须要用到的。像是会员的登入账号、时间、状态以及许许多多该记录的实时数据(如购物系统记录使用者的购物篮内的商品),这些信息属于各使用者私人所需要,通常开发者都是使用 Session 记录处理。 在ASP中的Session是使用Cookies构成,服务器将所有的Session内记录的数据,以Cookies的方式传至用户的浏览器。通常一般浏览器会将这些Cookies存起来,每当使用者点选连结,再次与服务器做联机时,浏览器就会把这些Cookies传回Server供做处理:这即是Session的运作原理。由此可知会话状态Session仅在支持cookie的浏览器中保留,如果客户关闭了Cookie 选项Session也就不能发挥作用了。 一、Session.SessionID 利用该属性可以解决一种对用户的控制问题。该问题的主要功能就是,针对某个网站的一个模块,当一个会员登录后正在看此模块时,另一个人用同样的会员名登录,就不能浏览这个模块:也就是说一个会员名同时只能一个人浏览此模块。 通过用会员名(假设为UserID,唯一)和SessionID来实现了控制。当会员登录时,给这个会员一个Session记录登录状态如:Session("Status")="Logged",同时把这个会员的Session.SessionID写入数据库。当他要浏览此模块时,先判断其是否登录,若已经登录再判断它的SessionID是否与数据库记录的相同,如果不同则不能访问。 这样,当另一个用户用相同的会员名登录时,那么数据库中记录的就是新的SessionID,前者访问此模块时就不能通过检查。这就实现了一个会员名同时只能一个人浏览某个模块。这个功能在一些收费网站有很有特别作用,它防止了一个会员名给多个人浏览的问题,为公司保障了利益。
二、Session.TimeOut
以上SessionId、TimeOut属于Session对象的两个属性,下面看该对象的一个方法Abandon 三、Session.Abandon 1,login.asp '只有在当点击了submit按钮的前提下,再来判断提取的东西都不为空,则建立Session对象。 '否则,即Session("name")为空不存在,则显示表单用以输入建立Session的平台。
2,info.asp
你可以把login.asp想象成一个登录窗口,当然我的这个比较简单(只要输入用名和密码就生产Session了),实际情况是:判断输入的用名和密码是否和数据库中的用名和密码吻合,如果正确吻合才生成Session的。然info.asp页面的作用刚好可以做为一权限页面,因为进入该页需要Session,而Session的产生是确保用名密码正确的。 所以当一开始出现表单窗口时,你点login.asp链接是打不开的,只有当提交了表单生成了Session后才能进入。这正是登录系统的精髓所在,Do You Know?:) 四、Session_OnStart 对象的例程每一次启动时触发Session_OnStart事件,然后运行Session_Onstart事件的处理过程。也就是说,当服务器接收到应用程序中的URL的HTTP请求时,触发此事件,并建立一个Session对象。 当然说到Session_OnStart事件就不能不谈到一个文件Global.asa(P.S:我打算把该文件和Chat程序放在一起说的,所以现在先不作过多解释)
以下文件保存为bug.html <body onunload=javascript:window.open("bug.html")> 发现该文件关不了了?(当然你要关闭,把源代码修改下) 以下文件保存为bug.asp
|
-- 作者:Qr -- 发布时间:1/14/2005 1:31:00 PM -- (九):内置对象Application 在同一虚拟目录及其子目录下的所有 .asp 文件构成了 ASP 应用程序。我们非但可以使用 Application 对象,在给定的应用程序的所有用户之间共享信息,并在服务器运行期间持久的保存数据。而且,Application 对象还有控制访问应用层数据的方法和可用于在应用程序启动和停止时触发过程的事件。 一、Application("name")=Value 一旦分配了Application对象的属性,它就会持久地存在,直到关闭WEB服务器服务使得 Application 停止。由于存储在 Application 对象中的数值可以被应用程序的所有用户读取,所以 Application 对象的属性特别适合在应用程序的用户之间传递信息。
1,num.asp
上面的程序,你会发现每刷新一次,都会记数累加,如按IP值访问来记数的话,则建立一个Session 2,vnum.asp
当然需要注意的是:记数要确保服务器不被重启,因为所以的访问是数值是建立在页面之上的,并未进行保存成文件或保存到数据库这样的处理。 四、Application_OnEnd
Sub Session_OnStart Sub Session_OnEnd Sub Application_OnEnd
具体Global.asa是怎么一回事?且听下回分解啊:) 5大对象基本掌握了,来个例题练习下
<%@ LANGUAGE = VBScript %> Session("Count")=Session("Count") + 1 %> <form action="guessNumber.asp"> Response.write "<br>共猜了" & Session("Count") & "次" |
-- 作者:Qr -- 发布时间:1/14/2005 1:32:00 PM -- (十):Global.asa文件 首先.asa是文件后缀名,它是Active Server Application的首字母缩写。Global.asa文件可以管理在ASP应用中两个非常苛刻的对象:Application、Session。 它其实是一个可选文件,程序编写者可以在该文件中指定事件脚本,并声明具有会话和应用程序作用域的对象。该文件的内容不是用来给用户显示的,而是用来存储事件信息和由应用程序全局使用的对象。该文件必须存放在应用程序的根目录内。每个应用程序只能有一个Global.asa文件。 关于Global.asa文件最常见的错误概念是它能为一般的使用的函数和子程序用作书库。Global.asa文件仅能用于创建对象的引用和俘获启动,以及结束Application对象和Session对象。 Global.asa文件主要基于会话级事件被访问,在以下三种情况下被调用: Sub Session_OnStart Sub Session_OnEnd Sub Application_OnEnd
然后调试当前虚拟目录下的任何文件,你会发现所有页面都跳转向htp://www.cnbruce.com/ 下面就以一个“在线人数”的例子来继续观察Session_OnStart和Session_OnEnd事件 二、Session_onEnd Sub Session_onStart '一个用户访问进行记数加1 Sub Session_OnEnd '一个用户进程的结束,记数减1 (P.S.如果没有该事件程序,则执行的就是页面访问程序了。)
你发现在该页中只有一个Application("OnLine"),而且还是被显示引用的。那么其值来自何方?这正是Global.asa文件的关键所在。 三、继续细化一下 大家都知道,当网页进行关闭的时候可以连带一个onunload事件,那么该onunload只要能执行Session的注销功能不就我们需要的吗?废话少说,将online.asp进行修改 3,online.asp
4,exit.asp
当然,加了段Script脚本,目的是进行Session的注销以后立即进行关闭本身。 四、深入研究Global.asa 5,Global.asa(放在被调试的虚拟目录的根目录下面) Sub Session_OnStart Sub Session_OnEnd Sub Application_OnEnd
注意本Global.asa中的Session_OnStart块不做任何事件。 因为一旦有用户访问服务器而不管用户是否登录,都会产生OnStart事件,而现在需要的只是登录用户的在线,所以不能在OnStart事件里使Applicaiton("online")加1。 又因为不管是否是登录用户的会话结束都会产生OnEnd事件(假如有访客访问了服务器但并不登录,他的会话结束后也会产生OnEnd事件),所以在Session_OnEnd事件里用了句if语句来判断是否为已登录用户的OnEnd事件,如果是才将在线人数减1。 并且值得注意的是:session.contents("pass")的使用,因为在OnEnd事件里禁止使用Session对象,但是可以用Session对象的集合来调用session变量。也就是说不能直接写session("pass"),而是需要写session.contents("pass")。 6,login.asp
只是简单地检测用名是cnbruce,密码是cnrose的时候,生成一个session("pass")=true,就是放在Global.asa中判断的。 五,继续发挥想象 当然,Global.asa远远不止这些。不过我们现在先不着急全部掌握,当我们接触到数据库的时候再返回过来看,继续研究该文件,相信到那时一定又会感悟到很多。所以,还是先把上面的这些吃透吧:) |
-- 作者:Qr -- 发布时间:1/14/2005 1:34:00 PM -- (十一):Chat聊天程序 那可以想象,在针对当前聊天程序中,一个聊天成员即为一个Session变量,聊天成员之间的会话则当成Application变量进行共享显示,以使各成员都能看见。 那下面就采用一很经典的实例程序,进行了解和分析。 1,chat.asp <form method="post" action="chat.asp" name=form1> <%
2,<input type="hidden" name="log" size="20" value="1">和下面的If Request.Form("log")<>1 then是有关联的:显然第一次输入昵称进入,同样将log隐藏域发送。但作为第一次的进入是无任何语句发言的,所以判断接受的log值不为1,亦即非首次登录(表示已经登录)时,执行内部相关聊天显示程序。 3,trim(Request.Form("talk"))="",trim就是个函数了:删去字符串前,后的空格。初此,还有rtrim():去掉字符串后的空格;ltrim():去掉字符串前的空格。 <script language=vbs> 4, Application.lock
可以看到是Application变量的叠加功能,每次Application("show")的值都建立在原有Application变量值的基础之上,再附加上最新的聊天内容:talk变量的值。这样就保证所有用户都能看到的共享信息了。
|
-- 作者:Qr -- 发布时间:1/14/2005 1:34:00 PM -- (十二)缺 |
-- 作者:Qr -- 发布时间:1/14/2005 1:36:00 PM -- (十三):Ad & Content Rotator 那究竟ActiveX组件为何物?它又是如何运作的呢?其实ActiveX Server Components(ActiveX 服务器组件)是一个存在于 WEB 服务器上的文件,该文件包含执行某项或一组任务的代码,组件可以执行公用任务,这样就不必自己去创建执行这些任务的代码。很形象的一句话:运用组件直接采用别人经典的功能强大的程序。只不过这程序已被封装了的。 那具体ActiveX组件是如何产生、如何得来的呢?一般由下面三个路径获得: 当然无论是第三方还是自行开发,在使用之前都必须要进行系统的注册。不过这些都是后话。我们现在需要的,是尽快先把ASP自带的一些组件搞懂吧。 不过在使用内置组件之前,先用一个程序检测一下自己机器中的组件支持情况。 1,objcheck.asp <%Option Explicit %> Dim ObjTotest(14,4) public IsObj,VerObj,TestObj dim i sub ObjTest(strObj) <FORM action=<%=filename%> method=post> <% 如果你可以运行该ASP文件,也就是说你拥有IIS的WEB服务了。既然有IIS,不出意外,我们今天要学的组件AdRotator相信应该也是支持的。 一、AdRotator组件 AD Rotator 组件的工作原理是通过读取 AD Rotator 计划文件来完成的,该文件包括与要显示图象文件的地点有关的信息,以及每个图象的不同属性。下面就是一个标准的 AD Rotator 计划文件。 1,类型为txt文本 ,命名为myadrot.txt http://www.it365cn.com/images/logo.gif http://www.blueidea.com/images/logo.gif
代码的前四行包含了广告的全局设置: 1,Redirect 指出广告将成为其热连接的URL。但其并非直接跳转的URL,它包含了两个参数的查询字符串:特定广告主页的URL和图象文件的URL。这些值从而可在gourl.asp文件中进行提取,并且与此同时gourl.asp还可以进行其他的处理工作,比如跟踪单击广告的次数、跳转到接受的的广告主页等。 “*”号表示了分隔符,以及“*”号下面的每四行为一个单位进行描述每个广告的细节。其中分别代表: 1,每个广告的描述包含图象文件的URL 该文件是用户自创建的文件。它通常用来解析由AdRotator对象发送的查询字符串的脚本,并将用户重定向到与用户所点击的广告所相关的URL。那具体怎么应用该定向文件呢? 2、adrotator.asp
“<%=myad.getadvertisement("myadrot.txt")%>”Ad Rotator组件支持的唯一方法也就是GetAdvertisement了,它只有一个参数:AdRotator计划文件的名称。注意指向文件的路径是当前虚拟目录的相对路径,物理路径是不允许的。也就是说当前的adrotator.asp和myadrot.txt是在同一目录下了。 然后进行执行该ASP文件,多次刷新,会发现每次的广告确实是在轮显着的。这时再注意点击图片的超级连接地址。比如: gourl.asp?url=http://www.cnbruce.com/&image=http://www.cnbruce.com/images/logo.gif 3、gourl.asp
功能很简单就完成。当然,刚才也说了,这个页还可以做其它一些事件:跟踪客户端在广告上单击次数,比如将接受过来的相同的url地址进行记数的累加,就能显示出该网站广告的点击次数,然后和相应广告商拿取相应的费用什么的……呵呵,在早期都要求需要实际点击率的,现在好象不管,只要广告挂那儿就行-_-! 不过,总的说来,这个组件的功能就是这样。你有多个广告商,并且是按比例单独显示,还需要计算实际点击率的时候,用Ad Rotator组件是最好不过。那也就是说视情况而定了。 最后再说下,该组件的实现需要三个文件:重定向文件、引用文件、处理转向文件。 二、Content Rotator组件 正如Ad Rotator为一广告轮显,Content Rotator组件则为内容轮显。 1,类型为txt文本 ,命名为context.txt %% 3 //后面是注释 %% 4 //下面显示表格 %% 5
该文件的结构比Ad Rotator的调度文件简单,仅需提供要使用的各个文本字符串的列表,由前面加两个百分号(%%)的语句行说明。 为了设置每个条目的比率(决定它出现在返回页面中的频率),在双百分号的后面添加了一个数字。如果其后跟双斜杠(//)就表示为添加的注释。 接着就是通过ASP页面将这些信息按规定完整显示。 2、showcontext.asp "Content = MyContent.ChooseContent("context.txt")",表示采用Content Rotator组件的有个方法:ChooseContent,并且赋值给变量Content,到最后输出显示结果。 3、showall.asp <% 当然这个方法可以用在随机图片之类的特效页面上。 |
-- 作者:Qr -- 发布时间:1/14/2005 1:37:00 PM -- (十四):Browser & Linking 该组件最主要的作用是:提取识别客户端浏览器的版本信息。 其原理是这样的:当客户端浏览器向服务器发送页面请求时,同时会自动发送一个User Agent HTTP标题,而该标题是一个声明浏览器及其版本的 ASCII 字符串。而Browser Capabilities组件就将User Agent映射到在文件Browscap.ini中所注明的浏览器 , 并通过BrowserType对象的属性来识别客户浏览器。 若该对象在 browscap.ini 文件中找不到与该标题匹配的项,那么将使用默认的浏览器属性。若该对象既未找到匹配项且 browscap.ini 文件中也未指定默认的浏览器设置,则它将每个属性都设为字符串 "UNKNOWN"。 在默认情况下,browscap.ini文件被存放在 WINDOWS\SYSTEM\INERSRV( 如果是95/98+PWS4) 或 NT\SYSTEM32\INERSRV( 如果是 NT) 目录中,你可以自己编辑这个文本文件,以添加自己的属性或者根据最新发布的浏览器版本的更新文件来修改该文件。 可以得出结论,Browser Capabilities组件也就是提取某个文件中的内容,然后比较得出显示。具体该如何应用呢? 1,btinfo.asp <%set bc=server.CreateObject("mswc.browsertype")%>
很显然“<%set bc=server.CreateObject("mswc.browsertype")%> ”就是进行的浏览器组件的建立 2,btif.asp <%set bc=server.CreateObject("mswc.browsertype")%>
该代码则是检测当前浏览器对各类网页技术的支持情况,那下面就可以根据某特定情况做相应变动 3,fram.asp <%set bc=server.CreateObject("mswc.browsertype")
很简单的意思:如果当前浏览器支持框架则进行frameset的显示,否则提示“你的浏览器不支持框架” 当然,需要提醒你的:不要过分依赖该组件,因为其只是提取browscap.ini里的值,而该值随时可以被客户修改,或者记录过时,不能真实反映到浏览器的情况,慎用之。 二、Content Linking组件 曾经用DW做网页都有这样一个烦恼:新做了页面,其它所有相关的页都要重新再做一次超级链接。一次也就罢了,多了多了不禁觉得无用功做了不少。试想如果能有一个专门的文件来负责页面的连接那该多好。 Content Linking 组件也就应运而生了。它非但可以使你在这些页面中建立一个目录表,而且还可以在它们中间建立动态连接,并自动生成和更新目录表及先前和后续的 Web 页的导航链接。 使用该组件,首先需要编写一个目录文件,也就是网页网址的顺序列表文件,它是一个文本文件,可以自由命名。其次,编写一个ASP文件,根据目录文件提供的信息自动生成带超链的目录页。如果需要在每一页上假如“向前或向后翻页”的超链,就再编写一个能自动生成翻页超链的包含文件,可使用inc为扩展名,例如"Nlink.inc"。以后,在组内每一页中包含它。 1,link.txt redirect.asp?url=http://www.cnbruce.com/ cnbruce.com
该目录文件的网址就是连接网址,文本就是连接文本了,需要注意的是中间采用Tab键进行分隔。 2,link.asp <%Set objNextLink = Server.CreateObject("MSWC.Nextlink")%>
“Set objNextLink = Server.CreateObject("MSWC.Nextlink")”建立Nextlink组件的连接 3,redirect.asp <%
呵呵,是不是觉得还没用到“上一页”、“下一页”的功能。再来~! 4,link1.txt 1.asp ASP编程入门进阶(一)
主要功能是设置文本和连接 5,link1.inc <%Set Nextlink=Server.CreateObject("MSWC.NextLink")
着就是一个很简单的分页程序了。当然接着的后面会有些更详细更复杂的分页,慢慢来吧,呵呵。 |
-- 作者:Qr -- 发布时间:1/14/2005 1:38:00 PM -- (十五):组件Counters 一旦创建了计数器,它将一直持续下去直到被删除为止。 计数器不会在一个事件比如访问一页时自动增加。你必须使用Set和Increment方法人工的设置或增长计数器。 计数器不受作用域限制。一旦创建了一个计数器,那么站点上的任何页都可以检索和控制它的值。 一、Counters.Set & Counters.Get 1,counts_set.asp <%
用法很简单,首先“Counters=server.createobject("MSWC.Counters")”表示建立了一Counters组件的连接;Counters.Set "cnbruce",10表示记数了名为“cnbruce”的初始值10;Counters.Get("cnbruce")就表示提取名为“cnbruce”的记数值了。 二、Counters.Increment 2,counts_inc.asp <%
基本代码相似,主要就是Counters.Increment的功能累加1。 根据累加可以做个简单的投票系统了。 3,vote.asp <%
功能是选择某单选按钮后提交,其对应的记数值则Counters.Increment 三、Counters.Remove 4,remove.asp <%
通过今天的接触可以总结出,一个简单的记数系统已经有两种方法:使用Application对象、使用Counters组件。但更多的还有采用FSO,或者是需要数据库的就是后话慢慢谈了。 当我们使用服务器组件创建对象时,一般有两种方法。比较常用的方法是用SERVER对象的CreateObject() 方法,象这样: 这种方法很好用,但是还有一种方法更节省系统资源。因为当你用Server.CreateObject()方法创建对象时,对象立即被加载,同时系统为这个对象分配好内存和其它资源。 第二种创建对象的方法是利用HTML的<OBJECT>标记,语法是这样的: 利用<OBJECT>标记创建对象时,你要创建的对象不被马上加载,而是等到这个对象的方法或属性第一次被引用时才加载。这样,我们就会节省一些资源。虽然不是很多,但是当你的系统每天要承受近百万次的点击时,这对节省服务器资源就很有帮助了。(Pine译注) 如其所言:我们的Counters则可以放于global.asa中 <OBJECT RUNAT=Server SCOPE=Application ID=Counter PROGID="MSWC.Counters"></OBJECT> |
-- 作者:Qr -- 发布时间:1/14/2005 1:38:00 PM -- (十六):FSO组件之驱动器操作 首先,FSO是FileSystemObject的简称。当然也就是我们的俗称FSO组件了,该组件可以用来处理驱动器、文件夹以及文件。 它可以检测并显示出系统驱动器的信息分配情况;还能够创建、改变、移动和删除文件夹,并能探测一些给定的文件夹是否存在,若存在,还能提取出该文件夹的信息,如名称、被创建或最后一次修改的日期,等等。FSO还使得对文件的处理变得很容易。 一、fso.GetDrive 正如其它组件的建立一样,FSO的引用也必须建立连接。
注意CreateObject的内部再也不是MSWC了,而是Scripting。 1,fso.asp
你会发现GetDriveName("d:")就是“d:”,而GetDrive("d:")则为标准的“D:”,所以我们一般这样写fso.GetDrive(fso.GetDriveName(drvPath))来提取某个具体的驱动盘。 二、drv.GetInfo 2,drv.asp
以上只是提取的D盘驱动器的信息,来个通用的函数,继续分别测试自己的驱动吧。 3,drvinfo.asp
还有一个文件类型:drv.DriveType最多的时候是显示数值“2”,其实“2”就表示的“硬盘驱动器”,“1”表示“软盘驱动器”,“4”表示“光盘驱动器”…… 下面就用一个程序遍历显示自己机器上所有驱动器的信息 4,showall.asp <table border=1 width="100%">
http://www.cnbruce.com/code/showall.asp 恩,是不是很神气?那你可以对自己的机器调试,然后上传到自己的空间去调试,你会发现服务商会你进行了些设置:) |
-- 作者:Qr -- 发布时间:1/14/2005 1:39:00 PM -- (十七):FSO组件之文件夹操作 一、fso.GetFolder If fldr.IsRootFolder = True Then Response.Write "驱动器名字是:" & fldr.Drive & "<br>"
首先建立FSO组件的连接是必不可少的啦,然后Set fldr = fso.GetFolder("c:\Program Files")设定fldr对象被赋值,以作下面程序的引用。 fldr.IsRootFolder即为判断该文件夹是否为一根文件夹,值为布尔值(true or false);fldr.Drive则显示该文件夹所在的驱动器号了。 二、fso.CreateFolder
执行程序,应该发现C盘多出了cnbruce文件夹,fso.GetBaseName则是提取文件夹名。 三、fso.DeleteFolder 3,delfldr.asp
注意,有时需要删除文件夹,而该文件夹不存在时,会出现程序逻辑性错误。则应先判断文件夹的状态。
<%
4,mainflr.asp Sub DeleteAFolder(file)
需要注意的是:删除并不会提示“确认要放入回收站”这项。这点你需要谨慎处理,特别是对你的系统文件夹。 四、fso.MoveFolder 5,movefldr.asp
本程序先是在C盘下建立了cnbruce文件夹,然后将其移动到C:\Program Files\文件夹下面。 不过同样需要注意的是你的系统文件夹不能乱移动。 五、fso.CopyFolder
该程序是建立在上一movefldr.asp的执行结果基础之上来完成复制到C盘根目录下的。(话比较长-_-!) 当然,其拷贝也是将该文件夹包括里面所以子文件夹和文件统统拷贝。 到最后再试着将c:\Program Files\cnbruce和c:\cnbruce两个文件夹进行删除掉吧。 不过,继续提醒你:不要写错了,比如写成c:\Program Files,那你就惨了:这叫玩命,学ASP玩出心跳出来了。 对文件夹的操作差不多了,是不是感到用处比较大?有训言:好东西是把双刃剑。正义和邪恶就只一线间,注意正规合理利用该组件。不过还有你放心的是,现在网站空间服务商对这权力已经限定得死死的了,你再怎么闹翻也不会冒泡的:) 然后接下来就是更微妙的:FSO对文件的操作。 |
-- 作者:Qr -- 发布时间:1/14/2005 1:40:00 PM -- (十八):FSO组件之文件操作(上) 一、fso.OpenTextFile 1,info.txt name:cnbruce
建立了该文件,下面再做个ASP页面,当然最好两个文件是在同一目录下。 2,opentxt.asp
CreateObject("Scripting.FileSystemObject")建立了FSO组件的连接,fso.OpenTextFile(whichfile,1)打开了info.txt该文件。参数“1”表示“ForReading:以只读方式打开文件。不能写这个文件。”,其他还有参数“2”表示“ForWriting:以写方式打开文件”,参数“8”表示“ForAppending:打开文件并从文件末尾开始写”。 打开了该文件,接下来是不是要显示文件中的内容?那就通过txt.ReadLine方法读取文本中的一整行,如果需要继续读取下一行,则继续使用txt.ReadLine方法。当然初此还有其它的读取方法,比如txt.Read(7)读取指定数量的字符,txt.ReadAll返回文本中的全部内容。 二、fso.CreateTextFile 3,creattxt.asp
那现在就可以建立一个简单的文本记数器了,还记得以前的记数?:1,通过application、session、global.asa进行记数;2,通过Counter组件进行记数。但两者都有通病,就是不能保存,如果服务器重新启动后,是不是所有记数全部清空了呢:)那现在就可以使用文本来记录数据了,即使重启,下次提取的也还是该文件。 试验:文本计数器 首先建立一记数的文本文件counter.txt,设定初始值为“1” 4,counter.txt 1 5,txtcount.asp
set fso=createobject("Scripting.FileSystemObject") for i=1 to 6-countLen '表示最大值999999 visitors=visitors+1
|
-- 作者:Qr -- 发布时间:1/14/2005 1:41:00 PM -- (十八):FSO组件之文件操作(中) 不知道你有没有这样的习惯:看到一个文件,不自觉的右键选择用记事本打开。呵呵,几乎没有哪个文件是不可以的。所以现在,可以默认所有文件都是文本,只是后缀名不同而已;那么也就是说,现在可以提取任一文件的内容信息。OK,就来想象一下: 1,提取一个文件的路径(采用file按钮进行查找定位) 一、viewcode.asp <form action="viewcode.asp" method="post"> <%
以上程序调试时,可以选择html,asp页面,也可以打开任一应用程序等。 定义的ShowCode函数,主要作用是打开、读取并显示文件中所有信息内容。注意添加了server.HTMLEncode(rsline),针对含有标准HTML代码的文件。 显示文件中所有行即用一条件循环进行遍历显示了。 接着,下面的这个例题具体就涉及open方法的问题了,还记得?正常情况之下打开文件是采用fso.OpenTextFile("c:\testfile.txt",1),参数1的作用是:以只读模式打开文件。不能对此文件进行写操作。如果现在已经存在一文件,需要进行追加写入,则该怎么办呢?简单,参数为8即可。 PS:这里还有一种读取的方法。
<%
二、story.asp
<%
调试地址: 再下面,继续来,该侧重点主要就是练习一些函数的使用技巧了。 1,instr函数:返回某字符串在另一字符串中第一次出现的位置。 同样字母“B”的位置也就能确定。现在就来最关键的:提前字母“A”和“B”中间的值“110”。 但设想一下:如果不是“110”,而是“1100”,那是不是要提取4位……这样就显出程序的不够完美。 <script language=vbs> OK,那么现在你也就完全可以把字母“B”、“C”、“D”后面的值一一提取了。 <script language=vbs> 用到现在,你也许确实学到了不少,但也许会提出疑问:这个放在FSO文件操作里有什么作用呢? 投票页面首要的就是显示各类项目的投票数,并相应赋于某个变量。然后判断本次投票的选相,相对应地将投票数值加1,完毕后再将所有值继续写入文本。 1,一个HTML表单页website.html 2,接受表单页值的result.asp a_num = instr(my_string,"A") a_value = mid(my_string,a_num+1,b_num-a_num-1) select case request.form("website") mynew_string="A" & cstr(a_value) & "B" & cstr(b_value) & "C" & cstr(c_value) & "D" & cstr(d_value)
3,最后不要忘了的记数文件site.txt 格式:A1B1C1D1 调试地址: OK,三个文件就可以胜任一个很简单的投票系统了,如果要加强,需要细化的则结合以前的知识吧,比如投过一次后设置session或者cookies,当再次投票时候判断如果session或者cookies存在则不允许,也就是简单的投票防作假手段了……当然更多的还是要自己去想去实践了。 |
-- 作者:Qr -- 发布时间:1/14/2005 1:42:00 PM -- (十八):FSO组件之文件操作(下)
一,fso.GetFile 1,getfile.asp s = "文件名称:" & f2.name & "<br>"
其它值附录如下:
2,movefile.asp
三,File.Copy 3,copyfile.asp
四,file.Delete 4,delfile.asp |
-- 作者:Qr -- 发布时间:1/14/2005 1:42:00 PM -- (十九):ASP技巧累加(二) 可以将不需要Session的内容(比如帮助画面,访问者区域,等等)移动到关闭Session的独立ASP应用程序中。在基础页面上,可以给ASP一个指示,让它不需要使用Session。将下面的代码直接加入到ASP页面的头部: <%@EnableSessionState=False%> 典型的情况是:ASP页面从后台存储中取回数据,然后以超文本标记语言(HTML)的形式形成结果。不管数据库的速度如何,从内存中取回数据要比从后台存储设备中快得多。从本地硬盘读取数据通常也非常快。所以,提高性能可以通过缓存服务器上的数据来实现,无论是将数据缓存在内存中,或者本地硬盘中。 缓存是经典的“空间换时间”的折中方式。如果缓存得恰当,就可以看到显著的性能提升。为了让缓存有效,必须保证缓存数据是经常要重用的,而且也是计算起来繁琐的。装满陈旧数据的缓存是对内存的浪费。 不经常改变的数据是缓存的较好对象,因为不需要随时考虑这些数据更新后的同步操作。组合框、参考表格、DHTML代码、扩展标记语言串、菜单以及站点配置变量(包括数据源名字,Internet协议地址IP以及Web路径)都是很好的缓存对象。注意:要缓存数据表达式而不是数据本身。如果一个ASP页面经常变化并且很费力去缓存(比如整个产品目录),就要考虑预产生HTML,而不是每次发生请求时再描述它。 在Application或Session对象中缓存经常使用的数据 ASP中的Application和Session对象是在内存中缓存数据的便利容器。你可以将数据赋值给Application和Session对象,这些数据在HTTP调用期间将一直保持在内存中。Session中的数据是为每一个用户服务的,Application中的数据是所有用户共享的。 何时需要在Application和Session中装入数据?通常,当应用程序启动或者会话开始时,数据就被装入了。为了在这时装入数据,在Application OnStart()或者Session OnStart()中分别添加适当的代码。这些函数位于文件Global.asa中,如果原来不存在,就添加上。也可以在数据首次需要的时候调入,在ASP页面中添加代码,检查数据是否存在,如果没有发现,就调入它。这里有一个例子,它代表了被称为“lazy evalution”的经典性能处理技术:直到需要,再去计算。 在ASP中存取COM对象时,应该拷贝经常使用的对象数据到脚本变量中,这样就减少了对COM对象的方法调用。这些调用要比存取脚本变量相对来说费时费力。当存取Collection和Dictionary对象时,使用这项技巧也减少了昂贵的查找操作。 通常,如果要不止一次地存取对象数据,就应将数据放入脚本变量中,对象数据主要也就是Request变量(表单和查询字符串变量)。比如,站点要传递一个叫做UserID的查询字符串变量,假设它将在一个特殊页面被引用12次,那么不需要调用Request("UserID")12次,只要在ASP页面的头部分配给UserID一个变量,然后在页面中使用它,这样做就节省了11次COM方法的调用。 在任何可能时使用Server.Transfer,而不要用Response.Redirect Response.Redirect告诉浏览器请求另一个不同的页面,这常常用于引导用户到登录页面或者出错处理页面。由于重定向强迫了一个新页面请求,结果是浏览器必须要与Web服务器循环2次,并且Web服务器必须处理一个额外的请求。Server.Transfer执行在同一服务器上的页面传输,这将避免额外的浏览器-Web服务器的数据循环,形成良好的系统性能,对于用户也有较好的响应时间。当然Server.Transfer只支持相对路径(即站内使用)。 |
-- 作者:Qr -- 发布时间:1/14/2005 1:43:00 PM -- (二十):ADO组件之显示数据记录
学习ASP的万里长征就快到终点了:等把ASP的ADO组件搞定。当然这也是最重要的一步,几乎前面所有的学习都是为了这个最终的目的。OK,下面就来详细系统地来一一掌握,步步为营,各个击破。 一,拥有数据库 可以这么说:静态页面和动态页面最大的区别就是采用了数据库。有关一个WEB程序采用数据库和不采用的优越性比较,就不去细细分析了,主要精力还是放在如何使用数据库,如何熟练运用数据库,如何更灵活地运用数据库等等……其中运用操作数据库主要是对数据库内容进行:显示、插入、修改、更新、查询和删除。 这些方法当然也不是一口就能吃出来的,要慢慢感受咀嚼、理解消化。当然首先很重要的便是先拥有数据库了。否则,一切都是空谈,巧媳妇难以无米之炊嘛。 一般而言,我们所说的数据库其实就是一个数据库文件,该文件是由一些数据库管理系统(DBMS)建立生成的。目前一般的DBMS也就是常用常听说的ACCESS,SQLSERVER,MYSQL,ORACLE。当然一般个人站点,小型企业采用ACCESS完全足够;稍微大些的就采用同样是Microsoft公司的SQL SERVER或者是MYSQL,值得注意的是MYSQL一般是和另外一种网络编程语言PHP完美结合的。当然更大型的就采用ORACLE了。呵呵,曾经在学习PB时还运用到SYBASE数据库,UNIX系统的Informix数据库……DBMS简直是多如牛毛-_-! 话说过来,目前我们就直接使用ACCESS了:1,使用简单;2,入门掌握容易;3,实在没有比这个更适合初学的了。 一切还得从实际操作开始。 1,打开ACCESS数据库,选择新建数据库,将其命名为cnbruce.mdb,并保存到一专门文件夹database中 [被屏蔽广告] 2,在新建的数据库容器中双击“使用设计器创建表”,弹出的表1窗口中字段名称输入“cn_id”,数据类型选择“自动编号”,并选择上方工具栏中的钥匙按钮,将该字段设为主键。 继续输入字段“cn_title”,数据类型选择“文本”;NEXT输入字段“cn_content”,数据类型选择“备注”; 仍然输入字段“cn_author”,数据类型选择“文本”;并且切换到下面“常规”中的“允许空字符串”选择“是”。 最后输入字段“cn_time”,数据类型选择“日期/时间”,继续切换到“常规”中的“默认值”输入“now()”函数 末了,将“表1”另存为“cnarticle” [被屏蔽广告] 3,双击打开cnartile表,填写第一行:“cn_title”输入“test”,“cn_content”输入“this is a test”,“cn_author”输入“cnbruce”,时间已经自动添加。完成!关闭表,关闭数据库。 [被屏蔽广告] 二,建立数据库连接 OK,数据库已经建立完毕,并且已经填写了一行信息内容。那么现在需要的就是同过ASP将该行信息显示出来。 要想显示,首先还是需要ASP与该数据库文件建立连接,具体怎么建立?往下看。 1,conn.asp:主要起的是连接并打开某数据库文件的功能。该文件建议单独存在,并且位置是和存放数据库的文件夹database处与同一物理层次。
Set conn= Server.CreateObject("ADODB.Connection"),和其它建立组件一样,建立了一个ADO连接,并用一对象conn来接受。 connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath(db_path),很显然就是连接字符串了,其包括打开数据库的驱动方法OLEDB,和打开和哪个数据库的连接(即数据库的路径)。 需要再次提醒的是:无论是FSO对文件、文件夹的操作还是ADO对数据库的操作,对被操作文件的取得都是获得的绝对的物理地址,一般情况之下,采用Server.MapPath方法相对较好。 conn.Open connstr最后对象conn通过连接字符串connstr打开了数据库的连接。 三,显示数据库内容 建立了数据库,建立了和数据库的连接,下面水到渠成地就是将数据库中的内容通过ASP显示出来。 2,showit.asp <% <% <%
[被屏蔽广告] 下面就来具体一个一个解释来理解没行的含义: 2,Set rs = Server.CreateObject ("ADODB.Recordset") ADO组件除了Connection连接以外,还有Recordset绑定记录集(相信用过DW做ASP的人现在开始有些重回故里的感觉了)当然 rs 可以形象地想象成数据库表中的某一行。 3,sql = "Select * from cnarticle" 标准的SQL结构化查询语言。很简单:建立了数据库连接,也绑定了记录集,那具体需要哪些信息呢?也就是要筛选一些记录集合了,不过当前采用的是无任何条件,即可以提取所有。 4,rs.Open sql,conn,1,1 真正地打开通向数据库中记录集的大门,具体有关后面的参数可以从如下网址中获得。 5,if rs.EOF and rs.BOF then 该语句里面涉及到了rs.EOF 和 rs.BOF 以及两者的逻辑运算 and 。rs.EOF 表示到达数据库表中的最后一行,rs.BOF 表示到达数据库表中的第一行。整个语句可以理解为,如果当前数据库中的最后一行就是数据库表中第一行,那么可以肯定:当前数据库表中没有任何数据。 6, 主要就是一个DO LOOP 循环语句了,其中循环的结束条件为:直到rs.EOF,即值得数据库表的最后一行。那么在这些条件满足的许可之内,就是来显示具体的信息了。 每次循环只能显示数据库表中的一行,如果要继续读取下行,那么 rs.MoveNext 功能真是如此。 7,rs("cn_title")等等 主要就是具体显示记录集中的哪个特定字段的信息值了。很是简单。 8,最后不要忘了释放资源空间关闭记录集连接,关闭数据库连接。 四,一些特殊条件 1,有没有注意到,数据库表信息的显示一般是按照时间的先后排列的,也就经常提到的按时间的升序排列。需要注意:按时间升序,并不一定每个数据库表中都要有一个时间/日期类型的字段,只要存在一个自动编号的字段就可以了。因为该字段是永不重复,并且是依次增大的。因此,按时间升序其实就是按自动编号中号码数值的增加来进行排序的。 当然,问题的关键来了,那就是要按照时间的降序排列,即始终从最新的内容开始显示。那具体需要哪些手术呢? 由 sql = "Select * from cnarticle" 添加修改为 2,有是时候,只需要提取最前或者最新的几条信息,那这个又具体如何操作呢?同样还是连接字符串的修改 That's All. 现在一个文章系统、新闻系统或者留言本显示部分的精华内容你已不费吹灰之力搞定。 留下你的是:文章的格式可能显示不对劲,比如回车、空格都不显示了,那么你就还要学会处理接受的数据库表的值(在ASP的几个练习中提到的);文章不能老是打开数据库输入信息啊,那么你就要继续学会如何用ASP插入数据到库表;再有就是文章多了,一个页面看是不是很麻烦?那么你还要学会分页技术……
|
-- 作者:Qr -- 发布时间:1/14/2005 1:45:00 PM -- (二十):ADO组件之插入数据记录 一、拥有数据库cnbruce.mdb 本数据库的作用就是用来被插入数据的,可以直接采用上节中已经建立的cnbruce.mdb文件,当然连接打开数据库的文件conn.asp也就顺利引用了。 二、建立输入插入信息的页面平台addit.html 本页的主要作用是:显示一些文本输入框以用来提供输入信息内容提交数据库。 1,addit.html 本页其实很简单,就是通过submit按钮将表单的信息内容提交到addit.asp页面去处理。 三、建立处理接受数据并插入数据库表的页面程序addit.asp 2,addit.asp <% <% <%
1,<!--#include file="conn.asp" --> 不用说,凡是要和数据库有联系的都要运用到该连接文件。 2,whattitle=request.form("title")之类 就是将上页表单中接受过来的值赋到一变量上,方便下面程序的调用。 3,rs.Open sql,conn,3,2 注意参数和显示数据库时采用的参数的不同。 4,rs.addnew 很简单也很显眼的一个声明:新建一个数据库记录集行。 5,rs("cn_title")=whattitle之类 即将接受的表单值对应到相关字段中。 6,rs.update 只是值和数据库字段的对应,完了后还要将对应的值上传提交到数据库表中去。 7,插入后可以跳转到showit.asp查看 需要说明,以后的ASP例题可能都是建立在前几节内容的基础之上完成的。 8,释放资源 是规矩,不要忘记。 那么,现在。插入并显示数据库记录,对你来说完全是小菜一碟了。大体框架搭建完毕,下面就是具体的细化了。 其中包括:客户端的表单检测,防止用户信息输入的遗漏;当然最好还是要加上服务器端的表单检测,由于客户端的某些原因(比如自行设计提交非检测的页面)基于安全考虑,一切还是依服务器端所接受信息为准。那下面就继续细化应用下了。 1,客户端检测 其实就是通过简单的脚本检测,这在初学ASP提到脚本的时候说到,下面将再次重复。 加强的addit.html <form action="addit.asp" method="post" name="form1" onsubmit="return form1_onsubmit()"> 2,服务器端检测 有人也许会问,既然有了客户端的检测,那还有多个服务器端的检测呢?原因很简单,比如仿照HTML表单提交页,自行设计一张去除了表单检测的页面。当点击提交,并且没有任何信息时,到达服务器端如没有任何防御则肯定会造成数据插入的失败。 加强的addit.asp <% <%if whattitle="" then%> <% <%
很简单,如果接受过来的信息为空,则弹出警告框,并且确认后返回到上页即addit.html了。当然cn_author没有设置检测,因为当初设计该字段的接受值是允许为空的。 OK,总结一下,插入记录主要就是
这是一种插入数据库的方法,下面就来接触了解一下另外一种。 需要注意,结构化的查询语言也就是SQL语句能够完成一些比较苛刻的数据库操作。当然,对于诸如提取、插入信息之流就更不在话下了。所以下面采用的插入记录的方法就是直接采用SQL语法完成。 修改了的addit.asp <% <% 文章添加成功,<a href="showit.asp">浏览</a> <%
当然应用此种方法,若必填字段接受值为空时,同样能够插入记录。这和采用第一种会报 字段 'xxx.xxx' 不能是零长度的字符串。
具有很大的容错性。 是程序的可读性还是方法的简便高效率就任君选择了。 |
-- 作者:Qr -- 发布时间:1/14/2005 1:45:00 PM -- (二十):ADO组件之分页程序 1,rs.RecordCount 2,rs.PageSize 3,rs.AbsolutePage 和 rs.pagecount 说到现在,弄个具体程序来调试一下。继续对showit.asp进行修改如下: <% <% <% <%
其实,说到底,显示数据库内容就是
起的作用,但想象一下:该程序应该都只能显示出2条信息(一直不变的2条信息)。但为什么加上?page=1和?page=2会显示不同的结果呢?……那绝对就是rs.AbsolutePage的作用了。这个搞清楚,相信分页的整体架构就有点眉目了。
<!--#include file="conn.asp" --> <% <%filepath=request.servervariables("path_info")%> <% <form action="<%=filepath%>" method="get"> [页次:<font color=red><b><%=page%></b></font>/<%=rs.PageCount%>] <%
长长的分页代码,搞懂是真不容易,平台引用起来还需要修改也是比较麻烦。最后能做成一个函数,下次调用起来就很方便了。 if page>=pagecount then
|
-- 作者:Qr -- 发布时间:1/14/2005 1:46:00 PM -- (二十):ADO组件之修改数据记录 并且在有关显示记录的时候还涉及到显示的输出格式、分页程序,那么再结合插入记录,一个简单的新闻系统,文章系统,留言系统,注册登陆系统不成任何问题。 下面就涉及到管理这块,需要对数据库记录进行修改。 首先,要修改哪条 修改,不是笼而统之的,而是要针对某条具体对相应修改。可以形象地说,就是对数据库表中的具体哪一行进行具体的修改。 比如 sql="select * from table where id=1" 就表示提取的id编号是1的那行的所有记录,然后只要将该行中需要修改的字段赋以新值然后上传数据库就OK了。 同样的语句 sql="select * from table where id=2" 相信你也能明白。 但作为我们在页面中,可不是就这样固定的,有可是选择某连接,或者输入某表单值……跳转到专门的修改页,这样所有的任务全在修改页上了,它所具备的SQL语句应该是适应性强的 比如 sql="select * from table where id="&request.queyrstring("id") 其次,将要修改的对应赋值 很简单,正如插入记录一样,将字段和值对应起来。 rs("cn_name")="cnbruce" 对应的值当然也可以是某个变量或函数 最后,上传更新数据库 和插入一样进行rs.updata ,其实观察下来,插入新记录和更新记录只是多了rs.addnew这行的声明。 1,showit.asp
注意response.write("<a href=change.asp?id="& rs("cn_id") &">修改</a>") 后面的参数id的值则是动态的,那接着就看chang.asp的能耐了。 2,change.asp
<!--#include file="conn.asp" --> <%if request.form("submit")="change" then <%
另外一类的修改更新 sql = "update cnarticle set cn_title='"&whattitle&"',cn_author='"&whoauthor&"',cn_content='"&whatcontent&"' where cn_id="&id |
-- 作者:Qr -- 发布时间:1/14/2005 1:47:00 PM -- (二十):ADO组件之删除数据记录 无非还就是SQL语句了,比如对应到特定的某ID上。 id = request.form("id") 2,很简单的一条语句:删除 rs.delete 3,最好能在修改之前征求确认删除 <script language="JavaScript"> <a href='javascript:suredo("del.asp?id=<%=id%>","确定删除?")'>Delete</a> 最直接的一条语句 |
-- 作者:Qr -- 发布时间:1/14/2005 1:48:00 PM -- (二十):ADO组件之查询数据记录 其实,主要精髓就是SQL语句的写法上。 下面通过一个例题来研究下 2,加入数据库信息内容 3,连接文件conn.asp
5,信息查询页,同样是search.asp
当然通过区号的查询还没添加,你可以自己试着完善,或者来个混合查询、单独查询、模糊查询以及精确查询的大综合了。 |
-- 作者:Qr -- 发布时间:1/14/2005 1:49:00 PM -- (廿一):DAO SQL之建立数据库表 那么,你正常的操作又是不是下载数据库到本机,然后打开之进行修改,接着再上传上去?十有八九都是如此-_-! 现在,你可以接触下有关于此的信息了,毕竟代码的功能是为手动的操作省了不少时间。不过代码的生成也还不是手工?呵呵:) 1,建立数据库文件cnbruce.mdb(不设计任何表) 建立数据库的代码: Function Createdfile(FilePath,FileName,Ver) Dim cnbruce,dbver if dbver <> "" then End Function Call Createdfile(databasepath,databasename,databasever) '创建数据库
2,建立数据库的连接文件conn.asp
<%
<!--#include file="conn.asp" --> <%
|
-- 作者:串烧 -- 发布时间:2/21/2006 6:01:00 PM -- 需要将windows xp professional service pack 2 CD 上的一些文件 将windows xp professional service pack 2 CD 插入下面选定的驱动器中 然后单击确定 这是我在安装IIs时遇到的问题 我不知道该怎么解决 而且我也没有这个CD 我该怎么办? 请前辈指点 谢谢 |
-- 作者:galen -- 发布时间:3/24/2006 3:50:00 PM -- 需要操作系统的安装盘的 |
W 3 C h i n a ( since 2003 ) 旗 下 站 点 苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》 |
375.000ms |