一、 服务器端文件的动态包含注一
在asp开发过程中,我们经常会将通用的函数制作成一个独立的asp文件,然后通过include方法引入需要的页面。由于在执行过程中,服务器会首先运行采用include方法包含的文件,然后才是当前页面的代码,所以,在实际执行过程中我们不可能使用include方法来实现服务器端的动态包含。
看下面一段代码:
<%
i=1
str = "file" & i & "/a.asp"
%>
<!--#include virtual ="<% str %>"-->
我们的本意是希望根据i的不同取值,包含不同目录下的同名文件,可是在执行过程中,却会返回“找不到包含文件 '<% str %>'。”的错误。也就是说在asp中,我们不可能使用include方法实现文件的动态包含。
要在asp中实现真正的动态文件包含,目前可行的方法是使用server.execute命令。server.execute是asp3.0新增的一个控制程序流的新方法,可以在运行过程中临时转移到一个文件、执行其内容,然后再返回原先的程序。
使用server.execute命令重新书写的代码如下:
<%
i=1
str = "file" & i & "/a.asp"
server.execute str
%>
注一:本文讨论的文件动态包含,主要指包含文件为变量的情况,有别于被包含的文件名事先确定的情况。
二、 数据库记录的批量删除
在用asp开发管理程序中,会不可避免地涉及删除数据库记录的操作。一般我们会采用下面两种方法删除记录:使用recordset.delete方法或者直接使用sql语句“delete from 数据表 where 主键=值”。而本文将要介绍的这种方法则可以同时删除一条或多条记录。下面我们首先来看一个具体的例子,在这个例子中我们会用到一张数据表(subject)和两个asp文件(list.asp和code.asp),该数据表包含了两个字段:
id、数据表主键,用来唯一标示数据库中的记录;
title:标题,用来显示记录的内容。
两个asp文件的内容如下:
list.asp
<%@ language=vbscript %>
<%
'创建数据库连接
dim objconn
set objconn = server.createobject("adodb.connection")
objconn.open"provider=microsoft.jet.oledb.4.0;data source=d:\samples\tooltips.mdb"
'创建记录集
dim objrs
set objrs = server.createobject("adodb.recordset")
objrs.open "subject", objconn
'显示记录列表
response.write "<form method=post action=""code.asp"">"
response.write "<table border=1 cellspacing=1>"
response.write "<tr>"
response.write "<th>删除</th>"
response.write "<th>标题</th>"
response.write "</tr>"
do while not objrs.eof
response.write "<tr>"
response.write "<td><input type=checkbox name=delete "
response.write "value=" & cint(objrs("id")) & "></td>"
response.write "<td>" & objrs("title") & "</td>"
response.write "</td></tr>"
objrs.movenext
loop
response.write "</table>"
response.write "<p><input type=submit value=""删除"">"
response.write "</form>"
‘关闭ado对象
objrs.close
set objrs = nothing
objconn.close
set objconn = nothing
%>
code.asp
<%@ language=vbscript %>
<%
'获取删除的记录列表
dim strdeletelist
strdeletelist = request.form ("delete")
'创建一个连接对象
dim objconn
set objconn = server.createobject("adodb.connection")
objconn.open"provider=microsoft.jet.oledb.4.0;data source=d:\samples\tooltips.mdb"
'生成删除记录的sql语句
dim strsql
strsql = "delete from subject where id in (" & strdeletelist & ")"
‘执行删除操作
objconn.execute strsql
'关闭连接对象
objconn.close
set objconn = nothing
%>
从上面的代码可以看到,我们首先在list.asp页面中生成一个记录列表,每条记录前面都包含了一个checkbox,这些checkbox都使用了同一个名称,每个checkbox的取值对应数据表中的唯一记录,由于在asp中,如果一个表单上包含多个相同命名的控件,会返回一个以“,”分隔的字符串,所以,在code.asp文件中,我们首先取得所有checkbox对应的取值,然后利用一个sql语句“delete from subject where id in (str)”完成记录的删除。其中的关键就在于“delete from tablenamewhere tableid in (string)”这个sql语句。由于该sql语句对于string没有特殊的要求,所以我们既可以删除一条记录,也可以同时删除多条记录。
这里还需要说明一点,如果数据表中作为的字段类型为字符型,则需要按下面的形式进行修改
……
strdeletelist = replace(strdeletelist,”,”,”’,’”)
strsql = "delete from subject where id in (‘" & strdeletelist & "’)"
……
三、 用metadata标记包含外部常量
如果我们要在asp程序中使用ado事先定义的常量,那么必须在每个用到ado常量的页面上包含“adovbs.inc”,否则就只能直接用数字表示。显然,直接数字并不利于今后程序的修改,而且可以规范化开发需要极力避免的事情,但是每个页面都包含“adovbs.inc”,又烦琐了一点。所以,下面介绍另外一种一次包含的方法。这就是global.asa中的typelibrary declarations。
由于一般的com对象都会将常量定义包含在类型库中,所以利用typelibrary declarations可以直接读取这些类型库中定义好的常量。加上typelibrary declarations只要在global.asa中一次定义就可以在所有的asp页面中使用,效率明显高于单个页面包含。
typelibrary declarations的语法形式为:
<!--metadata
type="typelib"
file="file"
uuid="typelibraryuuid"
-->
其中,file和uuid两个属性只要任选一个即可。file属性指指向包含常量定义的完整文件路径,而uuid则指外部库的guid。
例如我们包含在asp程序中使用ado常量,则可以采用下面两种方式:
<!—metadata
type =”typelib”
file = “c:\program files\common files\system\ado\msado21.tlb”
-->
或者
<!—metadata
type =”typelib”
uuid = “00000201-0000-0010-8000-00aa006d2ea4”
-->
相信大家看了上面两种方法,会很自然的选择第一种。的确,利用物理目录的方式明显比后一种方法方便,但是如果开发的asp程序需要到其它机器上安装,那么采用第二种方法会更好一点。为了方便大家,下面列出了asp中一些常用的guid
名称
guid
ado2.1
{00000201-0000-0010-8000-00aa006d2ea4}
ado2.5
{00000205-0000-0010-8000-00aa006d2ea4}
ado2.6
{00000206-0000-0010-8000-00aa006d2ea4}
ado2.7
{00000300-0000-0010-8000-00aa006d2ea4}
filesystemobject
{420b2830-e718-11cf-893d-00a0c9054228}
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器