|
|
||||
首页
文学作品 网页设计 平面设计 程序设计 考试认证 基础办公 QQ资源 服务器架设 网站运营 网页资源
|
|
|
| 汉南在线 → 网页设计 → VBScript脚本 | |||||||||||
摘要:Web数据库查询是网上最普遍的应用之一。而ASP模型是创建服务器端Web应用程序最重要的架构之一。ASP动态网页技术和VBScript脚本语言的结合又使得传统VB程序员在开发Web应用程序时具有较大的优势。本文结合一个Web上课程表查询的实例对ASP和VBScript两种技术的结合使用作了详细的说明,同时对各种开发Web应用程序的方法作了详细的比较。 关键词:ASP VBScript Web应用程序 数据库查询 ADO
同HTML文件一样ASP文件也是文本文件,包括文本、HTML标记和ASP脚本语句(用〈%和%〉界定符标记)。它以.asp为扩展名,区别于一般的HTML文件。任何文本编辑器都可以制作ASP文件。 在传统的静态HTML的模式中,浏览器通过HTTP协议向Web服务器请求页面,服务器收到请求后发送一个页面给浏览器,由浏览器进行格式化并显示数据。这种模式只为用户与Web服务器之间提供了有限的交互,静态HTML的内容必须进行手动的编辑和修改。 HTML语言本身是静态的,要想使其具有交互的动态功能,通常可采用的技术包括:Java,JavaScript, VBScript/ActiveX,CGI,ISAPI/NSAPI等。Java, JavaScript,VBScript/ActiveX是客户端的技术,它们最大的缺点就是浏览器可能根本不支持这种技术,比如网景的Navigator就不支持功能非常强大的VBScipt/ActiveX,即使是已经成为业界标准的Java,一些老版本的浏览器也不支持。而采用公共网关接口CGI及ISAPI/NSAPI等接口,由于它们是服务器端的技术,它们的共同缺点是HTML的编写与程序的编写是分离的, 必须用不同的工具分别编写, 然后在HTML文件中调用CGI, ISAPI 或NSAPI程序, 调试比较麻烦。事实上,它们与HTML文件的编写是两个完全不同的设计过程。 作为一种新技术,ASP则不同。ASP是微软公司IIS3.0中的一个组件,它实际上是一个服务器端的脚本环境。当脚本运行在服务器上(注意不是客户机)时,Web服务器完成所有的工作,包括动态生成HTML页面并传送到用户的浏览器上。程序员不必担心浏览器是否能处理你的页面,因为Web服务器已经全部替浏览器完成页面的转化工作,对浏览器而言,见到的还是普通的HTML页面。由此可见,程序员可以通过ASP直接添加可执行的脚本到HTML文件中。这样HTML开发和脚本开发成为同一件事情,使动态交互页面的开发成为一个整体,开发与维护工作变得简单、快捷。程序员可以集中精力于Web站点外观的设计,用一些动态的元素修饰你的页面。 ASP了提供VB SCRIPT和Java SCRIPT两种脚本引擎,缺省为VB SCRIPT。由于ASP采用了与微软公司风靡世界的编程语言Visual Basic 一脉相传的VBScript语言, 并将其搬到了服务器端, 解决了浏览器 的兼容性问题, 同时又延续了ActiveX的组件思想,用户可以用VB,VC等工具开发服务器端的ActiveX组件,以扩展ASP的功能。 它最大的特点是将VBScript的程序直接嵌入HTML文件中, 用任意一个文本编辑器就可以编写一个完整的ASP页面。 综合以上,ASP应用程序具有以下的突出优点: (1)可以完全同HTML集成。 (2)易于创建,不需要手动编译和连接。 (3)面向对象和易于用ActiveX组件扩展。 (4) 对客户端没有特别的要求,只要有一个浏览器就行。 (5)安全性和保密性较好。在IIS接到用户对.asp文件的请求时,首先执行括在〈%和%〉 标记间的VBScript语句,然后将执行的结果和其他的HTML语句一起返回客户端,这样客户看到的仍然是标准的HTML语句,不会看到开发者的编程逻辑,这与客户端的JavaScript是完全不同的,JavaScript没有办法阻止用户看到源码。从而有效地保证了系统的安全性及开发人员的知识产权。 需要说明的是,ASP不是脚本语言,而是一种服务器端的脚本语言开发环境,可以把它理解为一种架构,一种模型。它负责解释插入HTML页面的脚本描述。ASP必须在安装了以下软件的平台上才能运行: *Windows NT Server上的Microsoft Internet Information Server 3.0以上版本 *Windows NT Workstation上的Microsoft Peer Web Services 3.0 *Win95或Win98上的Microsoft Personal Web Server Microsoft Personal Web Server (PWS) 4.0 是解决个人信息共享和 Web 开发需要的方案。PWS 是加速和简化 Web 站点设置(从自动创建个性化主页到文档的拖放式发布)的桌面 Web 服务器。在企业 Intranet 上,Personal Web Server 可用于以自身的格式快速共享文档,或者将文档转换为 HTML,然后使用 PWS 在不同的操作系统共享这些文档。 由于 Personal Web Server 支持 Active Server Pages,因此可以作为 Web 站点的开发和测试平台。在企业服务器上或 Internet 服务提供商处使用您的站点前,可以先在办公室或家里创建站点,并使用 Personal Web Server 进行测试。 可以说。ASP代表着Web技术的重大进步。
实现WEB数据库的应用通常有两种方法:一种是WEB服务器端提供中间件连接WEB服务器和数据库服务器;一种是把应用程序下载到客户端直接访问数据库。其中第二种方法在程序的编写、调试上显得较为繁琐,网络安全也较难保证。在第一种方法中较常用的的中间件技术有通用网关接口(CGI)和应用程序编程接口(API)两种,而API有两种版本,ISAPI和NSAPI。CGI的最大不足在于对每个访问都会在服务器端产生一个应用程序副本,占用系统资源。API以动态连接库的形式出现虽然克服了CGI的这一缺点,却带来了另一个问题,即当需要修改或更新服务程序时必须重起系统,而这在许多事实性较强的应用服务器上是不允许的。同时,无论是CGI还是API它们共同的缺点是程序和HTML文本分离,编写和调试很不灵活。人们一直期待着一种功能强大且编写容易的WEB数据库开发技术的出现。 ASP应用程序是包含了ASP网页的Web应用程序。由于ASP模型具有很多的优点,基于ASP架构的数据库应用程序也是一种功能强大的Web数据库解决方案。 常用的开发ASP应用程序的方法有以下几种:利用Visual InterDev集成环境开发ASP应用程序;利用VB6开发ASP的IIS应用程序;借助FrontPage98开发界面,直接编辑ASP文本文件等三种方法。 对于一般的开发人员,微软的VISUAL INTERDEV以其强大的功能和优秀的集成编辑环境成为开发ASP应用程序的首选工具。 对于VB程序员,第二种方法是较好的选择,它基于VB6的开发环境,借助FrontPage98来开发界面,它具有开发一般VB应用程序的相似步骤,具有VB完全的事件驱动和面向对象的特点。最近以来,由于微软的影响及其在系统、网络和开发工具上的一体化解决方案,VBScript脚本语言逐渐具有了替代JavaScript成为最流行的INTERNET脚本语言的趋势。同时由于VB6引入了新的INTERNET开发特性,使得它成为最重要的INTERNET应用程序开发工具之一。但是这种方法也有缺点,即Frontpage98和VB6是两个完全不同的环境,在Frontpage98中的修改并不能立即反映在VB6的开发环境中,有时还不能把两者的优势很好地结合起来。 无论采用什么方法,都必须基于ASP模型,都要使用VBScript等脚本语言,区别只是开发环境的不同。因而对于一个有经验的程序员,直接的脚本编辑,即第三种方法提供了最宝贵的灵活性,它能最大限度地发挥程序员的灵活性,而且直接编辑ASP脚本在FrontPage98中就可以完成,编写和调试非常方便。对于熟悉HTML语法和VBScript或JavaScript语言的程序员来说效率最高。 本文着重从第三种方法的角度对Web数据库查询系统的设计进行探讨。
一个基本的Web数据库查询系统可以是如下结构的:
在Web数据库查询中,后台数据库的连接是至关重要的。ASP对数据库的访问主要是通过内置对象ADO(Active Data Object)来实现的。ADO是Microsoft针对网络数据库应用和Visual系列开发工具所开发的数据对象,在微软的系列产品中得到了很好的支持。在ASP中它可以被认为是一种数据库服务组件。与很多程序员熟悉的RDO、DAO不同,ADO是在OLE DB规范下开发的,它具有面向对象的特性.操作方法和DAO类似。 通过ADO访问Web数据库已经成为开发Web数据库查询系统的一般模式。在Web上访问数据库一般可分为以下步骤: (1) 创建数据库源名。数据库源名,即Data Source Name是连接ODBC和数据库的桥梁,ODBC通过DSN来找到要访问的数据库。在Windows的控制面板中提供了一个名为“32位ODBC”的工具对其进行管理。在单机环境中开发Web应用时,这种通过首先创建数据库源的方法来访问数据库具有较好的可调试性,否则必须连接到一个Web上的服务器来寻找一个可供访问的数据库源。 (2) 创建数据库连接。在ASP中要访问数据,必须还要创建与数据库的连接。 具体语法如下: Set Conn1=Server.CreateObject(“ADODB.Connection”),这样就创建了链接对象Conn1。具体编程中,Conn1是直接访问数据库的一个很关键的对象名。创建数据库连接后,就要打开这个连接以供访问。 具体语法如下:Conn1.Open “DSN1”,“username”,“password” 。最后两个参数是可选参数。 (3) 创建数据对象。RecordSet是ADO中保存数据库命令结果集的对象。通过它可以直接访问数据库中的每个记录和各个字段的属性。具体语法如下: Set RecordSet=Conn1.Execute(sqlStr) 这条语句创建并打开了一个Recordset对象,sqlStr是一条SQL的查询语句,执行这条SQL语句后返回具体的查询结果给Recordset对象。 (4) 操作数据库。 Execute方法的参数是一个标准的SQL语句串,可以用它来实现数据插入、修改、删除等操作。 (5) 关闭数据对象和链接。打开了一个ADO对象后,必须在使用完后关闭它。以释放在服务器上的资源。 在开发Web数据库应用程序时,由于ASP模型主要是基于服务器端的,只有当用户单击了一个ASP调用(如〈form method="POST" action="complex_result.asp"〉)的超链接或表单的提交按钮后才能工作,无法对客户的输入作出实时响应。如一个检查各字段是否为空的操作,就必须数据传送到服务器端后,才能作出判断。表现在具体编程中,就是判断的代码必须放在下一个页面中。由于VBScript是基于客户端的脚本语言,所以这种检查可以通过在ASP中内嵌VBScript脚本来完成。实际上,一个成功的ASP应用程序经常是ASP模型与VBScript或JavaScript脚本紧密结合的产物。 与一般源代码编写不同的是,ASP应用程序的重点不在一般HTML代码的编写上,IIS只对〈%〉标志对内的代码进行解释和运行。〈%〉标志对内的代码具有相对完整性,可以认为它与一般HTML语言是完全互不影响的。 ASP应用程序的实际实现过程中,界面设计和代码的编写实现一种紧密结合能极大地提高效率。尤其在FrontPage98中,良好的界面设计可以极大地优化程序的结构,也具有较好的可读性。
(1)Response对象中的Write方法在直接输出一个由变量表达的字符串时具有重要的作用。甚至它可以作为一种ASP向客户端返回HTML页面的一种主要方式。这也是VB6中创建动态HTML的一种重要方法。 可以参考以下代码: 〈% if rs.fields("有无幻灯").value=true then response.write "〈td width='13%'〉〈p align='center'〉有〈/td〉" else response.write "〈td width='13%'〉〈p align='center'〉无〈/td〉" end if%〉 (2)对同一表单内的元素可以用Request.Form( parameter)方法获得当前表单内的元素的值,这在实际编程中具有极大的便利。甚至在两个相邻的页面间也能顺利传值。 (3)ASP应用程序中如何解决页面间的传值一直是个关键的问题。一般可以有以下六种方法: A. 利用Application对象在应用程序的所有用户中共享信息,它可以在服务器运行期间持久地保存数据。 B. 可以用Session对象中的对象为应用程序的单个用户持久保存数据。但保存时间受到Session对象的另一个属性Timeout控制。 C. 相邻页面之间同一表单内的元素可以使用Request.form(parameter)的方法来实现传值。 D. 在ASP应用程序目录中的Global.asa文件中定义一些全局变量及过程。在Global.asa文件中创建的全局变量和过程在整个Web应用程序中都是可见的。 E. 对于在多个页面之间的传值,最适合的方法是利用Request.querystring属性。即在表单的Action或页面元素的超链接中,可以添加关于Request.querystring的引用。具体如下: 〈form method="POST" action="complex_query.asp"?query1=rs.fields(0).value〉 则在complex_query.asp中,可以通过Request.querystring(“query1”)来取得query1的值,并可以采用同样的方法把这个值再传送下去。 F. 还可以利用HTML中隐含域的特性传递。 以下是一段关于Web数据库查询的程序实例。 下面一段程序实现复合查询条件的生成,ASP文件名为Complex_query.asp。 〈html〉 〈%@ Language="VBScript"%〉 〈head〉 〈meta http-equiv="Content-Type" content="text/html; charset=gb2312"〉 〈meta name="GENERATOR" content="Microsoft FrontPage 3.0"〉 〈title〉复合查询页面〈/title〉 〈meta name="Microsoft Theme" content="none"〉 〈meta name="Microsoft Border" content="tl, default"〉 〈/head〉 〈% set conn1=server.createobject("adodb.connection") conn1.open "kc_mdb","","" set rs1= conn1.execute("select * from teacher")%〉 〈body background="bg005.gif"〉
〈hr size="6" color="#FF00FF"〉 〈p〉〈font face="楷体_GB2312" color="#0000FF"〉〈strong〉〈big〉〈big〉请选择查询方式〈/big〉〈/big〉〈/strong〉〈/font〉〈/p〉
〈form method="POST" action="--WEBBOT-SELF--" onSubmit="location.href='_derived/nortbots.htm';return false;"〉 〈input TYPE="hidden" NAME="VTI-GROUP" VALUE="0"〉〈p〉〈input TYPE="checkbox" VALUE="1" CHECKED NAME="check1"〉 复合查询方式 〈input TYPE="checkbox" VALUE="2" NAME="check2"〉 按教师查询 〈input TYPE="checkbox" VALUE="3" NAME="check3"〉 按教室查询 〈input TYPE="checkbox" VALUE="4" NAME="check4"〉 按课表查询 〈input TYPE="checkbox" VALUE="5" NAME="check5"〉 按课程情况查询 〈/p〉 〈/form〉 〈p〉〈font face="楷体_GB2312" color="#0000FF"〉〈strong〉〈big〉1.复合查询表单〈/big〉〈/strong〉〈/font〉〈/p〉 〈p〉〈font face="楷体_GB2312" color="#FF0000"〉〈strong〉〈big〉查询条件是: 〈/big〉 〈/strong〉〈/font〉〈/p〉 〈form method="POST" action="complex_result.asp"〉 〈p〉〈font color="#000000" face="宋体"〉教师为〈big〉:〈/big〉〈/font〉〈select SIZE="1" NAME="list1"〉 〈option〉无〈/option〉 〈% rs1.movefirst do while not rs1.eof%〉 〈option value="〈%=rs1.fields(0).value%〉"〉 〈%=rs1.fields(0).value%〉 〈/option〉 〈%rs1.movenext loop rs1.close conn1.close%〉 〈/select〉 〈% set conn2=server.createobject("adodb.connection") conn2.open "kc_mdb","","" set rs2=conn2.execute("select * from classroom")%〉〈select name="operator1" size="1"〉 〈option selected value="or"〉or〈/option〉 〈option value="and"〉and〈/option〉 〈/select〉〈font face="宋体"〉 教室为:〈/font〉〈select SIZE="1" NAME="list2"〉 〈option〉无〈/option〉 〈%rs2.movefirst do while not rs2.eof%〉 〈option value="〈%=rs2.fields(0).value%〉"〉 〈%=rs2.fields(0).value%〉 〈/option〉 〈%rs2.movenext loop rs2.close conn2.close%〉〈% set conn3=server.createobject("adodb.connection") conn3.open "kc_mdb","","" set rs3=conn3.execute("select * from course")%〉 〈/select〉 〈select name="operator2" size="1"〉 〈option selected value="or"〉or〈/option〉 〈option value="and"〉and〈/option〉 〈/select〉 〈font face="宋体"〉课程为:〈/font〉〈select SIZE="1" NAME="list3"〉 〈option〉无〈/option〉 〈%rs3.movefirst do while not rs3.eof%〉 〈option value="〈%=rs3.fields(0).value%〉"〉 〈%=rs3.fields(0).value%〉 〈/option〉 〈%rs3.movenext loop rs3.close conn3.close%〉〈% set conn4=server.createobject("adodb.connection") conn4.open "kc_mdb","","" set rs4=conn4.execute("select * from kb")%〉 〈/select〉〈/p〉 〈p〉〈select name="operator3" size="1"〉 〈option selected value="or"〉or〈/option〉 〈option value="and"〉and〈/option〉 〈/select〉日期为:〈input type="text" name="T1" size="10"〉 〈select name="operator4" size="1"〉 〈option selected value="or"〉or〈/option〉 〈option value="and"〉and〈/option〉 〈/select〉周次为:〈input type="text" name="T2" size="10"〉 〈select name="operator5" size="1"〉 〈option selected value="or"〉or〈/option〉 〈option value="and"〉and〈/option〉 〈/select〉节次为:〈input type="text" name="T3" size="10"〉〈/p〉 〈p〉〈input TYPE="submit" VALUE="开始查询" NAME="B1"〉〈/p〉 〈/form〉 〈/body〉 〈/html〉 下面一段程序按查询条件返回查询结果。 〈html〉 〈%@ Language="VBScript"%〉 〈head〉 〈meta http-equiv="Content-Type" content="text/html; charset=gb2312"〉 〈title〉复合查询结果〈/title〉 〈meta name="GENERATOR" content="Microsoft FrontPage 3.0"〉 〈meta name="Microsoft Theme" content="none"〉 〈meta name="Microsoft Border" content="tl, default"〉 〈/head〉 〈body background="bg005.gif"〉 〈hr size="6" color="#FF00FF"〉 〈p align="center"〉〈font face="楷体_GB2312" color="#0000FF"〉〈strong〉〈big〉〈big〉〈big〉复合查询结果〈/big〉〈/big〉〈/big〉〈/strong〉〈/font〉 〈/p〉 〈p align="center"〉〈%query1=request.form("list1") query2=request.form("list2") query3=request.form("list3") query4=request.form("T1") query5=request.form("T2") query6=request.form("T3")%〉 〈%if query1="" and query2="" and query3="" and query4="" and query5="" and query6="" then response.write ("请输入至少一个查询条件!") response.end else if query1〈〉"" then set conn1=server.createobject("adodb.connection") conn1.open "kc_mdb","","" set rs1= conn4.execute("select * from teacher where teacher.教师='"&query1&"' ")%〉 〈/p〉 〈p align="left"〉〈font face="楷体_GB2312" color="#0000FF"〉〈big〉〈strong〉教师情况一览表(按照教师关键字查询的结果)〈/strong〉〈/big〉〈/p〉 〈table border="1" width="100%"〉 〈tr〉 〈td width="10%"〉〈p align="center"〉姓名〈/td〉 〈td width="7%"〉〈p align="center"〉性别〈/td〉 〈td width="8%"〉〈p align="center"〉年龄〈/td〉 〈td width="36%"〉〈p align="center"〉单位〈/td〉 〈td width="12%"〉〈p align="center"〉职称〈/td〉 〈td width="7%"〉〈p align="center"〉电话〈/td〉 〈td width="20%"〉〈p align="center"〉备注〈/td〉 〈/tr〉 〈tr〉 〈td width="10%"〉〈p align="center"〉〈%=rs1.fields("教师").value%〉〈/td〉 〈td width="7%"〉〈p align="center"〉〈%=rs1.fields("性别").value%〉〈/td〉 〈td width="8%"〉〈p align="center"〉〈%=rs1.fields("年龄").value%〉〈/td〉 〈td width="36%"〉〈p align="center"〉〈%=rs1.fields("系别").value%〉〈/td〉 〈td width="12%"〉〈p align="center"〉〈%=rs1.fields("职称").value%〉〈/td〉 〈td width="7%"〉〈p align="center"〉〈%=rs1.fields("电话").value%〉〈/td〉 〈td width="20%"〉〈p align="center"〉〈%=rs1.fields("备注").value%〉〈/td〉 〈/tr〉 〈/table〉 〈%set rs1=conn4.execute("select * from course where course.教师='"&query1&"' ")%〉 〈p align="left"〉〈font face="楷体_GB2312" color="#0000FF"〉〈big〉〈strong〉相关课程情况一览表(按照教师关键字查询的结果)〈/strong〉〈/big〉〈/p〉 〈table border="1" width="100%"〉 〈tr〉 〈td width="16%"〉〈p align="center"〉课程〈/td〉 〈td width="24%"〉〈p align="center"〉系别〈/td〉 〈td width="8%"〉〈p align="center"〉学时〈/td〉 〈td width="12%"〉〈p align="center"〉教师〈/td〉 〈td width="16%"〉〈p align="center"〉地点〈/td〉 〈td width="11%"〉〈p align="center"〉联系电话〈/td〉 〈td width="13%"〉〈p align="center"〉备注〈/td〉 〈/tr〉 〈tr〉 〈td width="16%"〉〈p align="center"〉〈%=trim(rs1.fields("课程").value)%〉〈/td〉 〈td width="24%"〉〈p align="center"〉〈%=trim(rs1.fields("系别").value)%〉〈/td〉 〈td width="8%"〉〈p align="center"〉〈%=trim(rs1.fields("学时").value)%〉〈/td〉 〈td width="12%"〉〈p align="center"〉〈%=trim(rs1.fields("教师").value)%〉〈/td〉 〈td width="16%"〉〈p align="center"〉〈%=trim(rs1.fields("地点").value)%〉〈/td〉 〈td width="11%"〉〈p align="center"〉〈%=trim(rs1.fields("联系电话").value)%〉〈/td〉 〈td width="13%"〉〈p align="center"〉〈%=trim(rs1.fields("备注").value)%〉〈/td〉 〈/tr〉 〈/table〉 〈% rs1.close conn1.close%〉 〈%end if%〉 〈%end if%〉
〈/body〉 〈/html〉 VBScript是在客户端运行的脚本,利用它可以很方便的与客户交互,如显示一个对话框,而这是ASP模型不具备的。两者的紧密结合使得客户端脚本的灵活性和服务器端脚本的安全性、可靠性都得到了充分的体现。 以下是一段ASP和VBScript混合编程的实例,对添加记录时记录是否重复进行了判断。 Sub Window_onload( ) 〈%if Flag_Repeat=1 then%〉 ret = msgbox ("数据库中已经有相同记录!",64) 〈%else%〉 ret = msgbox ("已成功添加记录!",64) 〈%end if%〉 end sub 在未联网的单机环境中调试ASP应用程序时,Internet Explorer 无法调试包含ASP主页的Web应用程序。因此必须安装Microsoft Personal Web Server。以Win98为例,单碟的中文Win98安装盘在Win98\add-ons\pws子目录下已带了Microsoft Personal Web Server的安装程序,这是单机版的个人Web管理器。安装个人Web管理器后,在屏幕右下角的系统托盘(Systray)中可以看见一个Personal Web Server的小图标,双击此图标,呼出个人Web管理器的主界面。在个人Web管理器上的“高级”窗口中,把“高级选项”的虚拟目录定在正在开发的ASP应用程序的目录上。把“默认文档”指定为你想调试的ASP主页。这时,切换至个人Web管理器上的“主屏”窗口中,点击“发布”框中的“你的主页在:”后的“
| |||||||||||
| >> 相关文章 | |||||||||||
| 没有相关文章。 | |||||||||||
|
授权使用:汉南在线 http://hnzx.hzwz.net/ 经营许可证:陕ICP备05000109号 Powered by:汉南在线 Copyright (c) 2002-2008 汉南在线. All Rights Reserved . |