WEB检索界面动态生成的实现

时间:2021-11-25 12:58:03
from http://libweb.zju.edu.cn:8080/04/guanyuanjiaoliu/article/j1.htm WEB检索界面动态生成的实现 实例地址 1 问题的题出 随着Internet技术的广泛使用,网络资源的建设和共享显得尤为重要。图书馆作为资源的汇集地,已逐步走向信息的数字化建设,除了购买数据供应商的产品之外,根据用户的需求和本馆的特色,自建了许多各具特色的数据库,并通过WEB页面动态交互或静态的提供给读者。但由于这些资源是由图书馆各科室自建的,提供检索方法各不相同,WEB页面也比较散乱,从而引起WEB页面维护的困难。随着信息资源的增多,提高信息资源的服务质量逐步成为数字化建设的工作重点,其中采取统一友好的检索界面不失为方便读者有效利用信息资源的一种重要服务手段。本文正是基于这一点,提出了WEB检索界面动态生成的观点,即动态生成WEB检索界面,生成的界面除了选择检索的字段不同之外,界面中其它内容和使用方法完全相同。本文详细介绍了利用ASP技术实现WEB检索界面动态生成的过程。 2 WEB数据接口技术:ASP和ADO ASP(Active Server Pages)技术是Microsoft推出的一种服务器端命令执行环境,结合HTML、脚本(Script)程序和ActiveX组件建立和执行动态交互式WEB服务器应用程序。由于ASP脚本可以引用系统组件和ASP内置组件,使得ASP程序能够很方便地访问数据库,从而实现功能强大的动态WEB信息服务系统。 ADO(Active Data Objects)是一个ASP内置的ActiveX服务器组件,它是一种对象模型,包含Connection、Command、RecordSet对象。其中Connection对象用于建立与数据库的连接,Command用于定义对数据库源进行操作的命令,如Select、Insert、delete、updatet等SQL语言。RecordSet对象则用于存储数据库执行提交的操作命令之后形成的结果集。由于ADO提供连接ODBC数据源或OLE DB数据源的功能,网络开发者可以很方便地与多种数据库相连接。 3 统一检索界面动态生成的实现 3.1 检索界面结构 目前,Internet检索方式分为三种:字段方式、布尔逻辑值方式和自然语言方式,由于本文是基于数据库的检索,因此选择了前两种方式作为动态检索界面的检索方式。检索界面如图1所示: 图1 动态检索界面结构图 动态检索界面有两种方式实现多条件检索:(1)通过选择字段、输入检索值和选择逻辑运算符,然后再按增加条件按钮来实现多条件逻辑表达式的组成;(2)在布尔逻辑输入框中直接输入表达式来完成。 3.2 检索界面参数设置 由于检索界面是根据不同的数据表而自动生成的,检索界面的内容和检索返回结果的显示格式都通过对参数表的设置不定期实现,根据软件的需要,设置了以下3个参数表。 3.2.1 检索字段参数表 检索字段参数表记录用于数据表检索的字段的一些信息,检索界面生成程序按超链接中参数自动生成检索字段的内容。另外,当用户检索后返回结果时,程序根据该参数表的设置,以列表的形式将结果显示在界面上。表结构如表1所示: 表1 检索字段参数表(表名:webfind) 字段名称 字段含义 Tname 数据表名 Indexname 数据表索引字段(即键值)名称 Fieldn 检索字段名称 Fieldzn 检索字段中文含义 Fieldtype 检索字段数据字型 3.2.2 记录详细显示字段参数表 记录详细显示字段参数表用于控制记录的详细显示,当用户输入关键词进行检索后,程序是以列表的格式将结果返回给用户,列表所列的数据是根据表1所设置的检索字段包含的数据,用户需要点击列表中的超链接就能详细显示返回记录,而显示的数据内容是通过对详细显示字段参数表的设置来完成。表结/构如表2所示: 表2 详细显示字段参数表(表名:webtable) 字段名称 字段含义 Tablename 数据表名 Lsh 序号,决定显示字段的排列秩序 Fieldname 显示字段名称 Fieldznzw 显示字段的中文含义 Fieldtype 显示字段数据字型 Droptable* 如果fieldname在数据表中以代码形式存在,则记录所关联的代码表名称 Dropcode* 代码表中代表代码值的字段 Dropname* 代码表中代码所表示的含义的字段 注:*数据表中的字段若是以代码形式存在,则需设置相应的值,否则可为空。 3.2.3 记录与数据表相关联子表的情况参数表 如果一个表与几个子表相连,则需要设置该参数表。如图书数据库,包含书目表、馆藏表和流通表,设计一个关键字段,使书目表与馆藏表和流通表联系在一些。当在详细显示书目信息时,通过超链接可显示该书目相关的馆藏情况和流通情况,而不需要对馆藏表和流通表进行逐个检索。表结构如表3所示: 表3 数据表相关联子表情况参数表(表名:subtable) 字段名称 字段含义 fname 数据表名 Subtname 相关联子表名称 Ztname 相关联子表界面显示的中文名称 Linkname 数据表与相关联子表链接的字段名称 Linktype Linkname字段所记录数据的数据字型 Indexname 相关联子表的索引字段 Indextype 相关联子表的索引字段的数据类型 3.3 统一检索界面动态生成程序设计 程序的核心包括以下4个部分:mul_find.asp,bfind.asp,showtable.asp,showsubtable.asp。四个程序的执行次序为:mul_find.asp→bfind.asp→showtable.asp→showsubtable.asp。由于程序实现与WEB数据的动态交互,因此需在在Global.asa中输入以下代码: Sub Application_OnStart Application("cx_ConnectionString") = "DSN=DS名称;Uid=e用户名;PWD=口令" Application("cx_ConnectionTimeout") = 15 Application("cx_CommandTimeout") = 30 Application("cx_CursorLocation") = 3 Application("cx_RuntimeUserName") = "用户名" Application("cx_RuntimePassword") = "口令" End Sub 由于程序代码较长,因此本文只列出其中的关键部分。如果需要整个程序的源代码,可以直接与本人联系。 3.3.1 mul_find.asp 实现统一检索界面动态生成,生成的界面如图1所示。该程序有两个参数:dbname和where。调用方式: 。其源程序代码如下: …… function select1_onclick() //字段选择脚本 { var vn=document.form1.select1.value; var fieldn=vn.substring(0,vn.length-2); document.form1.text1.value=fieldn; } function button1_onclick() //增加条件按钮脚本 { var rs=document.form1.select3.value; var ss1=document.form1.select1.value; var types=ss1.substring(ss1.length-1,ss1.length); var fs=document.form1.text1.value; var vs=document.form1.text2.value; var ps=document.form1.select2.value; var ts=''; ts=document.form1.TEXTAREA1.value; if(ts.length>1) {ts=ts + ' ' + rs + ' ';} if(types=='s') //S表示字符型 {if(ps=='=') {ts = ts + fs + ' ' +ps + ' ' + '|' + vs +'|';} else {ts=ts + fs + ' ' +ps + ' ' + '|%'+vs+'%|'; }} else {if(types=='d') //d表示日期型 {if(vs.length==10) //表示yyyy-mm-dd {ts = ts + fs + ' ' +ps + ' ' + '|' + vs +'|';} else{if(vs.length==7) //表示yyyy-mm { ts = ts + "year(" + fs +")=" + vs.substring(0,4) + " and month(" + fs + ")=" + vs.substring(5,7);} else { ts = ts + "year(" + fs +")=" + vs.substring(0,4);} } } //表示yyyy else {ts = ts + vs; } } document.form1.TEXTAREA1.value=ts; document.form1.submit1.disabled=false; } 以上是检索界面中字段选择和增加条件两个按的on_clicked事件的脚本代码,用Javascript语言编写。 …… <% set DBConn = Server.CreateObject("ADODB.Connection") DBConn.ConnectionTimeout = Application("Cx_ConnectionTimeout") DBConn.CommandTimeout = Application("Cx_CommandTimeout") DBConn.CursorLocation = Application("Cx_CursorLocation") DBConn.Open Application("Cx_ConnectionString"), Application("Cx_RuntimeUserName"), Application("Cx_RuntimePassword") 以上是数据库连接代码,用VBScript语言编写。 set cmdTmp = Server.CreateObject("ADODB.Command") set rsTmp = Server.CreateObject("ADODB.RecordSet") cmdTmp.ActiveConnection = DBConn cmdTmp.CommandType = 1 cmdTmp.CommandTimeout = 10 DBname=Request.QueryString("dbname") //获取数据表名称 query_str="select * from webfind where tname='"+DBname+"'" //获取相应的检索字段信息 cmdTmp.CommandText = query_Str set rsTmp = cmdTmp.Execute //执行查询 dim fz(20),fn(20),fl(20) i=0 idx=trim(rstmp("indexname")) Do While Not rsTmp.EOF fz(i)=trim(rstmp("fieldzn")) //中文名称 fn(i)=trim(rsTmp("fieldn")) //字段名称 fl(i)=trim(rstmp("fieldtype")) //数据类型 rsTmp.MoveNext i = i + 1 Loop %> 以上代码根据传入的参数(dbname),获取检索字段参数表中的检索字段信息。
…… 字段选择 <% Response.Write("") %> //用于显示初如检索界面的默认检索字段名称 <% Response.Write ("") %> 以上代码是生成SELECT控件的内容 …… > …… 3.3.2 bfind.asp bfind.asp实现检索功能,即实现检索界面的检索按钮功能,它有两个参数:dbname和idx,调用方式:"+rs("fieldzn")+"") fn(i)=trim(rs("fieldn")) dp(i)=rs("droptable") if fn(i)=indexname then flb=trim(rs("fieldtype")) i=i+1 rs.movenext loop Response.Write("") Do While Not rstmp.EOF //rstmp为检索结果集 Response.Write("") for j=0 to i-1 vstr=rstmp(fn(j)) IF vstr="" or isnull(vstr) then vstr=" " else vstr=cstr(rstmp(fn(j))) end if if fn(j)=indexname then httpstr=""+ httpstr + vstr + "") elseif dp(j)="" or isnull(dp(j)) then Response.Write(""+ vstr + "") elseif vstr<>" " then //如果该字段是代码型,则需要将代码所表示的信息显示在界面上。 select2="SELECT * FROM " + trim(dp(j)) + " WHERE ( code='"+ trim(cstr(vstr))+"')" cmdTmp.CommandText =select2 set rs1=cmdTmp.Execute Response.Write("" + cstr(rs1("name")) + "") set rs1=nothing else Response.Write(""+ vstr + "") end if next Response.Write("") RStmp.MoveNext Loop …… 3.3.3 showtable.asp showtable.asp实现记录详细显示功能,它有四个参数:dbname、indexname、flb、value,调用方式:

") do while not rssub.EOF linkname=rssub("linkname") llb=rssub("linktype") httpstr="" + httpstr + rssub("ztname") + "") //子表的超链接 rssub.MoveNext loop Response.Write("") end if …… 3.3.4 showsubtable.asp showsubtable.asp实现相关联子表的显示,它有四个参数:gn、dbname、lnk、value、llb,调用方式: