第一章 绪 论
"图档结构树的设计与关联"的研究目的是用树型目录的层次结构来形象的表示不同图档之间的分类关系,并借此对图档信息进行分类、管理,同时将树型目录结构的各叶子节点与图档信息数据库内的相关信息进行关联,并能够方面的输出这些信息。
类似的树型目录结构的例子有很多,如Windows的资源管理器,帮助信息等都采用的是树型结构目录。这些和这里图档结构树所使用的原理是基本相同的。图1-1显示了简单的节点层次结构。左边是节点的抽象表示,右边是典型的树型视图表示。
图1-1 典型树型视图
该图中,最上面的(或根)节点是 A,它直接包含了节点 B 和 E。节点 B 直接包含节点 C 和 D。节点 B 和 E 组成了层次结构中第 2 代子节点,C 和 D 组成了第 3 代。树型结构根据其位置转换这个层次结构,根节点或第 1 代在左边。自第 2 代往下,为有子代的节点提供了一种展开或折叠其表示的方法,这样可以显示或隐藏其下一代子节点。除了根节点之外,所有节点都只有一个父代。不包含其它节点的节点称作叶节点。某些叶节点也许是不能包含其它节点,而其它的则刚好是空的。
图档结构树采用的原理与上面所述基本相似,由于本部分模块是一个网络应用程序的客户端程序,因此客户端大量而频繁地对服务器的访问能给服务器带来的强大的负载,为了减轻服务器的工作负载,作为浏览器端的程序拟采用JavaScript语言和HTML标记结合来实现树型目录结构,目录信息从服务器上一次下载,之后就可以完全在本地对目录树的操作,而不必再去访问服务器。
当需要访问服务器上的图档数据库时则使用Java Server Pages(JSP)通过JDBC来访问它,以此来实现将图档结构树与图档信息数据库的关联。Java语言可以运行在多种不同的服务器平台,另外通过SQL的界面使用JDBC可以轻易地对任何数据库执行SQL指令,这与数据库的种类无关,所不同的是只需调用不同的数据库驱动程序而已。在本课题中由于涉及到服务器方面的问题,因此,还需要配置服务器,这里我使用的是Apache软件基金会提供的产品TOMCAT作为服务器。Java编译工具是采用的Sun公司Java2SDK v1.3。 图档数据库,我是采用MS Access建立的。
通过使用以上的几种技术可以满足本课题的基本要求。对本课题的研究和实现可以熟悉Java的运行环境,掌握面向对象的设计思想和服务器端的配置与程序设计方法,还可以更好的理解和掌握如何使用脚本来配合超文本进行工作。
第二章 JavaScript及动态HTML元素基础
2.1 JavaScript基础
2.1.1 平台无关性
JavaScript具有平台独立性。与插件和ActiveX控件相比,这是一个主要优点。因为对于不同的操作平台,插付和ActiveX控件需要重新编译和代码重写。例如,NetScape Navigator 可在20多个平台上运作,尽管它们大多都属于不同风格的UNIX,但是在NetScape Navigator的核心中仍需要为Windows16位、Windows32位、UNIX、 MacOS以及OS/2的系统建立控件或插件。虽然UNIX可以在多种处理器中运行(MIPS,Intel等等),WindowsNT也可以在Intel和Alpha机器上 运行,但它们距离与平台无关还有很大距离。
JavaScript的另一个优点是NetScape公司和Microsoft公司的网络服务器都有内置解释器。尽管两个公司开发的编译器风格不同,但是作为网络开发者,仍然有 在客户端使用相同语言的能力。
平台无关性是在应用程序中使用JavaScript的首要原因。的确一些执行环境解释JavaScript的方法稍有不同,但对语言主要部分的处理是基本一致的。程序员只需要输入一次程序代码即可让不同的执行环境解释它。
2.1.2 面向对象的JavaScript
让我们先看一下在服务器端和客户端的JavaScript的内核和功能有什么不同。 两者都有在自己的运行环境中特定的对象, 因此,对象的初始化和创建在不同的时间发生。由于这个特征,应该从两个方面来看待JavaScript服务器端和客户端。最低层次的客户端JavaScript,是当一个页面被装载到浏览器中时创数个核心对象。除了这些核心对象,还有当在网页中有某些标签时所创建的派生对象。这些派生对象继承了父对象的不同特性,并允许脚本获得HTML标签的属性。图2-1清晰的表明了基本的JavaScript对象在客户端的层次。
图2-1 对象层次图
正如图表中描述的一样,所有客户端对象或是从Window(窗口)对象或是从navigator对象派生出来。考虑到JavaScript是基于对象的语言, 在给定页面上的所有对象都是在浏览器的窗口中形成,因此,所有JavaScript对象均为Window对象的后代。通过使用Window对象, 程序员可以在页面中选择不同的窗格、文本、层、表格以及许多其他的对象和特性。
2.1.3 JavaScript的浏览器对象
尽管JavaScript是基于对象的脚本设计语言,但是JavaScript并没有真正实现对象的继承关系。在JavaScript的对象之间实际上存在的是一种从属关系。从属关系涉及到两个对象在属性和方法上不存在共同点。例如,在一个典型的浏览器中,每一个下载的网页都是处在一个窗口之中的,而一个网页也同样包含了一些表单、HTML语句、Java小应用程序以及各种插件,甚至这些元素内部还会包含一些别的元素,就形成了一个分层的关系。只能认为这些表单、Java小应用程序是从属于网页的,而网页又是从属于一个特定的窗口。在从属关系中,浏览器对象Window反映的是一个完整的浏览器窗口,是其他大部分对象的共同祖先。Window对象的子对象包括Location对象、history对象、和document对象等。在document对象之下还有再下一级的对象和对象数组。
当浏览器载入一个网页时,浏览器会根据网页的内容产生一些与相应页面相对应的对象提供给JavaScript使用,这就是浏览器对象的一部分。另外,根据浏览器本身的配置和属性,还有一些其他的对象可以提供给JavaScript程序使用。浏览器对象就是网页和浏览器本身各种实体元素在JavaScript程序中的体现。
这些浏览器对象如图2-1所示主要包括:
●navigator: 管理着当前使用的浏览器的版本号,运行的平台以及浏览器使用的语言等信息。
●window: 处于整个从属表的最顶级位置。每一个这样的对象代表一个浏览器窗口。
●frame: 在拥有帧的网页中,提供帧的各种管理方法。
●document: 含有当前网页的各种特性,例如标题、背景以及使用的语言等。
●location: 含有当前网页的URL地址。
●history: 含有以前访问过的网页的URL地址。
在document对象中,包含有forms、anchors、links、layers、images、areas、applets和plugins等数组,这些数组都是根据网页不同内容而自动产生的。这些数组都是浏览器对象document对象的一个属性,数组的个数同HTML网页中实际元素的个数相同。document对象的各种属性值均来源于当前的网页文档,从很大程度上来说,是直接同文档相关的。文档中包含的各种表单、超链接在document中反映一个属性。document中各种属性的层次关系也是由网页中的相应关系决定的。
2.2 动态HTML元素
2.2.1 动态HTML元素定位
用JavaScript动态定位一个网页内的HTML元素可以让网络开发者将网页的设计提高 到一个新的水平,利用JavaScript设计的网页出现在浏览器上时,HTML元素不必再只是待着不动。现在,当网页被完全加载后,HTML元素可以在整个浏览器窗口内移动,而且HTML元素还可以做三维移动:一个HTML元素可以移动到另一个HTML元素的前面,也可以移动到它的后面。不同的浏览器之间还有兼容性问题,NetScape最先在Navigator里通过<layer>标签解决HTML元素三维定位的问题,而 Internet Explorer的三维定位是通过扩充现存的HTML<DIV>标签来实现的。两种浏览器都存在的层叠样式表(CSS)是动态定位以后在两个平台上都能使用的基础。这一领域目前还在不断更新,标准也正在制订。 现在能够知道的是,<DIV>标签应该是将来创建层的方式,JavaScript应该修改CSS属性以便将来这些层能动起来。
2.2.2 <DIV>块简介
通过使用<DIV>标签,IE实现了和NetScape的<layer>标签一样的功能。<DIV>标签在HTML里已经存在了很长时间,但一直没能充分使用。开始时<DIV>标签的作用是把网页的一部分元素分开,以便可以将其设置为针对浏览器窗口的左对齐、右对齐或中间对齐等对齐方式。IE扩充了这个标签的功能使得HTML代码中由这个标签定义的部分可以在三维空间中被放置和操作。
<DIV>标签的妙处在于它可以将很多HTML标签放置在一起变成一组.但这并不意味着必须在任何情况下都使用<DIV>标签。
2.3 事件处理
事件是浏览器响应用户交互操作的一种机制。JavaScript的事件处理机制就可以改变浏览器响应用户操作的标准方法,这样就可以更加具有交互性,易使用性。
事件定义了用户与WEB页面交互时产生的各种操作。例如,单击一个超链接或按钮时,就产生一个事件,告诉浏览器发生了需要进行处理的单击操作(click)。浏览器在程序运行的大部分时间都等待交互事件的发生,并在事件发生时,自动调用事件处理函数,完成事件处理过程。浏览器为了响应某个事件而进行的处理过程称为事件处理。JavaScript的一个特点就是可以在用户端实现完整的数据处理和验证工作,大量的数据可以在用户端进行处理,从而节省了网络的传输开销。
第三章 图档结构树的实现
3.1 实现技术
3.1.1 操作<DIV>块
为了指定块只需要简单地把一个<DIV>标签放在HTML代码的开头,再把</DIV>标签放在它的结尾即可。任何HTML标签都可以放在<DIV>标签之间,这就意味着按钮、窗口、选择框等都可以动起来。也可以利用STYLE属性将<DIV>标签里的各种图表初始化。
<DIV>块的定位既可以是相对的又可以是绝对的。绝对定位时,要在块里指明位置。相对定位时,对象出现在文档流中它自然的位置上。用<DIV>标签把HTML代码的一部分指定后,就可以用JavaScript动态地改变这部分代码中元素的样式表(style sheet)属性,从而实现通过改变元素的样式表(style sheet)属性值在三维空间里的定位、显示、隐藏和移动它。
3.1.2 操作层
Layer(层)是Javascript1.2版中引进的新对象。Navigator4.0及以后版本支持该属性,但只有Navigator支持Layer对象。Layer提供了在单个窗口内控制多个文档的功能。想其他对象一样,Layer对象是document对象的子对象,但它有自己的属性,可以通过设置这些属性来控制层。在对层操作之前,必须首先能够访问层的属性。与窗口类似,也有Layers数组,在这个数组中包含一个指定文档所包含的所有层。例如,想把一个文档的第二个层的visibility属性设为hide,可以用下面的语句:layer[1].visibility=hide; Layer数组同样允许用层的名字来访问Layer对象。如需要访问名称为tsinge的一个层,而又不想通过索引号来访问,就可以通过层的名称来访问,例如: layers.tsinge.bgcolor 或 layers.["tsinge"].bgcolor 在HTML文档里,<LAYER>和</LAYER>标签之间的所有代码都会变为一个层。这个层包括自己的文档和属性,根据是否给定了这个层一个ID,可以采用两种方式对层进行操作。如果在标签里没有制定ID,就必须用layers数组来访问这个层,这样可以直接对层的属性进行操作,也可以利用layer对象的内置方法来进行操作。如:document.layers[1].bgcolor= "green",如果在<LAYER>标签里指定了ID号为tsinge。就可以用ID来访问这个层的属性,如: document.layers.tsinge.bgcolor="green"
3.1.3 事件句柄
事件句柄是界面对象的一个属性,以存储特定的事件处理函数的信息。每当一个事件发生时,JavaScript解释器就会自动查找界面对象中相应的事件句柄,调用注册在上面的事件处理函数。一般句柄的形式总是事件的名称前面加上前缀on,例如对应事件Click的句柄就是onClick。在HTML中,可以采用如下的语法来定义一个句柄,其实句柄就是一个对象的属性:eventHandler = JavaScript 语句拥有句柄属性的HTML标记,主要涉及到一些界面元素。这些元素可以把HTML同JavaScript代码相连接。
3.2 编程原理和计算方法
3.2.1 编程原理
在本课题中,采用前面所述的几种技术来实现图档结构树。整个界面采用WEB框架页面的形式来实现,在框架页面的左边用结构树来导航,把每个叶子节点通过JSP与数据库中的相关内容相关联,从而对图档数据库中的内容来进行分类,关于数据库的这部分内容将在后几章阐述;框架页面的右边用来显示详细的图档数据内容。下面具体讨论结构树的生成和编程原理。
首先,使用HTML中的<DIV>标记来预先定义好所有的节点,即每一个节点,包括叶子节点和非叶子节点,每一个使用一个层来表示,由于各个节点之间的逻辑关系,已经确定的他们各自的水平位置关系,如最高层次的节点位于最左边,第二层的节点位于最高层的右边,以此类推。因此,在一开始我们就可以把它们之间的水平位置关系固定好。这可以使用HTML中的" "标记,即相当于空格,来使每一个层次比较低的节点向右缩进,而又保持每个处于相同层次上的节点缩进的距离相等。如图3-1所示:
在页面被载入浏览器时,再调用初始化函数,使各个子节点都被隐藏掉,而只显示父节点。在每一个除了叶子节点以外的所有节点的HTML中,都通过定义Click事件的句柄来调用相应的JavaScript函数,来处理该节点的打开或关闭。下面是一个节点的HTML代码,也就是定义的一个层,其中加黑的部分就是句柄:
<DIV class=child id=departChild1>
<A target=_self href=javascript:void(null) onclick="expand('departChild1',3)"> <IMG border=0 height=16 src="parameter/folder_parent.gif" width=16>设计部门分类</a>
</DIV>
所谓关闭,就是将该节点下面的所有子节点所在的层设置为"隐藏";所谓打开,就是将该节点下面所有的子节点所在的层设置为"显示"。由于水平的位置关系是确定的,因此不用去管它,而垂直方向的位置,由于在这里的每一个"层"都是采用的相对定位方式,即它出现在文档流中自然位置上,当位于某节点上方的节点为"隐藏"状态时,该位置将被下面的这个节点自动填补,因此,各个节点在任何状态时,再垂直位置上将始终保持紧密连接状,而不会因为某个节点的隐藏而留下空白。
为了形象具体的表现每一个节点,使用两种不同的小图标来表示两类节点,即用folder_parent.gif来表示非叶子节点,用folder_leaf.gif来表示叶子节点。由于各个非叶子节点的超链接,仅仅是用来触发Click事件以处理该节点的打开或关闭状态,而不需要链接到其他的页面,因此,这里给href标记定义了一个空操作。而对于叶子节点来说,每一个叶子节点都代表着一类具有某个相同属性的数据集合,为了显示这些数据,通过超链接将其与访问数据库的jsp文件相连结以达到对图档数据库进行分类显示。
3.2.2 计算方法
3.2.2.1 初始化
在页面被加载时,执行的是对页面的初始化,也就是将所有非父节点全部隐藏。 其具体算法如下:首先,将HTML文当中的<DIV>标签建立数组,数组的长度就是该HTML文档中所有<DIV>标签的个数。这样数组中的每一个元素就对应每一个层,也就是一个节点。然后,通过检测数组中每一个元素的classname属性是parent 还是child,以此来判断该节点是父节点还是非父节点。如果是非父节点则隐藏之,否则,检测下一个数组元素,如此循环,直至将数组所有的元素,也就是所有的节点检测完。 初始化部分代码如下所示:
divColl = document.all.tags("DIV"); file://返回<DIV>标签数组
for (i=0; i<divColl.length; i++) {
whichEl = divColl(i);
if (whichEl.className == "child")
whichEl.style.display = "none"; } file://隐藏所有非父节点
下图是页面初始化的流程图:
3.2.2.2 节点处理
对于节点的处理,是由HTML中的Click事件触发的,通过句柄调用JavaScript中的处理函数expend(el,num),其中el为调用节点的id,num是该节点下面的子节点数,根据子节点的命名规则,则子节点id为"el+child+i",i的最大值为num。由此遍历调用节点的所有子节点。如果子节点是隐藏的则将其所有的都显示,如果子节点是显示的,则将其隐藏,当某个子节点不是叶子节点,也就是说其下面还有叶子节点,此时先将该节点隐藏然后再调用hidechild(name)函数,将该节点下面所有的孩子隐藏掉。这样就可以把调用节点下面的所有孩子节点都隐藏掉。
主要代码如下:
for(var i=1;i<=num;i++) file://对各个子节点进行操作
{
whichEl = eval(el + "Child"+i);
if (whichEl.style.display == "none") file://如果是隐藏的
{
whichEl.style.display = "block"; file://显示该节点
}
else file://如果是显示的
{
whichEl.style.display = "none"; file://隐藏该子节点
hideChild(el+"Child"+i); file://隐藏该子节点下面的孩子节点
}
}//for
图3-3 是节点处理流程图:
3.3 图档结构树图示
初始状态 开启状态
图 3-4 结构树图示
在图3-4左图中所示,目录1到目录4及备注这五个图标是父节点,他们所在的层的classname为parent,因此在初始化时没有被隐藏掉,而其他所有非父节点因为其classname为child,所以都被初始化函数隐藏掉了。于是,页面载入后,就如左图所示。
在右图中,描述的是整个树的所有节点,正如前面所述,处于第二层目录的几个图标,象"设计部门分类"、"全部档案"、"档案说明""子目录1"他们都处在同一条垂直线上。处在第三层上的目录也一样。通过此树型图,整个目录的层次关系和分类一目了然。
第四章 JavaServer Pages及JDBC基础
4.1 JavaServer Pages简介
静态HTML对于显示相对静态的内容是不错的选择;新的挑战在于创建交互的基于Web的应用程序,在这些程序中,页面的内容是基于用户的请求或者系统的状态,而不是预先定义的文字。对于这个问题的一个早期解决方案是使用CGI-BIN接口;开发人员编写与接口相关的单独的程序,以及基于Web的应用程序,后者通过Web服务器来调用前者。 这个方案有着严重的扩展性问题--每个新的CGI要求在服务器上新增一个进程。如果多个用户并发地访问该程序,这些进程将消耗该Web服务器所有的可用资源,并且系统性能降低到极其低下的地步。
某些Web服务器供应商已经尝试通过为他们的服务器提供"插件"(Plug-ins)和API来简化Web应用程序的开发。这些解决方案是与特定的Web服务器相关的,不能解决跨多个供应商的解决方案的问题。 当然还存在其他的解决方案,但是都不能使一个普通的页面设计者能够轻易地掌握。例如,像JavaServlet这样的技术就可以使得用Java语言编写交互的应用程序的服务器端的代码变得容易。一个JavaServlet就是一个基于Java技术的运行在服务器端的程序。 开发人员能够编写出这样的Servlet,以接收来自Web浏览器的HTTP请求,动态地生成响应, 然后发送包含HTML或XML文档的响应到浏览器。采用这种方法,整个网页必须都在JavaServlet中制作。如果开发人员或者Web管理人员想要调整页面显示,就不得不编辑并重新编译该JavaServlet,即使它在逻辑上已经能够运行了。采用这种方法生成带有动态内容的页面仍然需要应用程序的开发技巧。
很显然,目前所需要的是一个业界范围内的创建动态内容页面的解决方案。这个方案将解决当前方案所受到的限制,即:
1) 能够在任何Web或应用程序服务器上运行。
2) 将应用程序逻辑和页面显示分离。
3) 能够快速地开发和测试。
4) 简化开发基于Web的交互式应用程序的过程。
JavaServer Pages(JSP)技术就是被设计用来满足这样的要求的。 JSP规范是Web服务器 、 应用服务器、 交易系统以及开发工具供应商问广泛合作的结果。SUN公司领导开发出这个规范来整合和平衡已经存在的对Java编程环境进行支持的技术和工具,其结果是产生了一种新的开发Web应用程序的方法,给予使用基于组件应用逻辑的页面设计者以强大的功能。
JSP技术在多个方面加速了动态Web页面的开发:
(1) 将内容的生成和显示进行分离。使用JSP技术, Web页面开发人员可以使用HTML或者XML标记来设计和格式化最终页面,使用JSP标记或者小脚本来生成页面上的动态内容(内容是根据请求来变化的,例如请求帐户信息或者特定的一瓶酒的价格)。生成内容的逻辑被封装在JSP标记和JavaBeans/EJB组件中,并且捆绑在小脚本中,所有的脚本在服务器端运行。如果核心逻辑被封装在标识和JavaBeans/EJB中,那么其他人,如Web管理人员和页面设计者,能够编辑和使用JSP 面,而不影响内容的生成。在服务器端,JSP引擎解释JSP标记和小脚本,生成所请求的内容(例如,通过访问JavaBeans组件,使用 JDBC?技术访问数据库,或者包含文件),并且将结果以HTML(或者XML)页面的形式发送回浏览器。这有助于作者保护自己的代码,而又保证任何基于HTML的Web浏览器的完全可用性。
(2) 强调可重用的组件。经大多数JSP页面依赖于可重用的、跨平台的组件 (JavaBeans)来执行应用程序所要求的更为复杂的处理。开发人员能够共享和交换执行普通操作的组件,或者使得这些组件为更多的使用者或者客户团体所使用。基于组件的方法加速了总体开发过程。
(3) 采用标识简化页面开发。Web页面开发人员不会都是熟悉脚本语言的编程人员。JSP技术封装了许多功能,这些功能是在易用的、与JSP相关的XML标识中进行动态内容生成所需要的。
通过开发定制化标识库,JSP技术是可以扩展的。今后,第三方开发人员和其他人员可以为常用功能创建自己的标识库,这使得Web页面开发人员能够使用熟悉的工具和如同标识一样的执行特定功能的构件来工作。JSP技术很容易整合到多种应用体系结构中,以利用现存的工具和技巧,并且扩展到能够支持企业级的分布式应用。JSP技术能够支持高度复杂的基于Web的应用。由于JSP页面的脚本语言基于Java编程语言,而且所有的JSP页面都被编译成为JavaServlet Class,因此JSP页面就具有Java技术的所有好处,包括健壮的存储管理和安全性。作为Java平台的一部分,JSP拥有Java编程语言"一次编写,各处运行"的特点。随着越来越多的供应商将JSP支持添加到他们的产品中,你可以使用自己所选择的服务器和工具,更改工具或服务器并不影响当前的应用。
4.2 JDBC和数据库
4.2.1 SQL语言简介
SQL是英文Structure Query Language的缩写,意思为结构化查询语言。 SQL语言的主要功能就是同各种数据库建立联系,进行沟通。按照 ANSI(美国国家标准协会)的规定,SQL被作为关系型数据库管理系统的标准语言。 SQL语句可以用来执行各种各样的操作,例如更新数据库中的数据,从数据库中提取数据等。目前,绝大多数流行的关系型数据库管理系统都采用了SQL语言标准。
4.2.2 JDBC简 介
JDBC是一种用于执行SQL语句的JavaAPI, 它由一组用Java编程语言编写的类和接口组成。JDBC为工具/数据库开发人员提供了一个标准的API,使他们能够用纯JavaAPI来编写数据库应用程序。
有了JDBC,向各种关系数据库发送 SQL语句就是一件很容易的事。换言之,有了JDBCAPI,就不必为访问Sybase数据库专门写一个程序,为访问Oracle数据库又专门写一个程序。 你只需用JDBC API写一个程序就够了,它可向相应数据库应用程序发送SQL语句。而且,使用Java编程语言编写的应用程序,就无需去忧虑要为不同的平台编写不同的应用程序。将Java和JDBC结合起来将使程序员只需写一遍程序就可让它在任何平台上运行。
Java具有健壮、安全、易于使用、易于理解和可从网络上自动下载等特性,是编写数据库应用程序的杰出语言。所需要的只是Java应用程序与各种不同数据库之间进行对话的方法。而JDBC正是作为此种用途的机制。
4.2.3 JDBC的 用 途
简单地说,JDBC可做三件事:
1) 与 数 据 库 建 立 连 接 。
2) 发 送 SQL 语 句 。
3) 处 理 结 果 。
JDBC是个"低级"接口,也就是说,它用于直接调用SQL命令。在这方面它的功能极佳,并比其它的数据库连接API易于使用,但它同时也被设计为一种基础接口,在它之上可以建立高级接口和工具。高级接口是"对用户友好的"接口,它使用的是一种更易理解和更为方便的API如JDO),这种API在幕后被转换为诸如JDBC这样的低级接口。
4.2.4 JDBC与数据库的连接
Connection对象代表与数据库的连接。连接过程包括所执行的SQL语句和在该连接上所返回的结果。一个应用程序可与单个数据库建立一个或多个连接,或者可与许多数据库建立连接。 与数据库建立连接的标准方法是调用DriverManager.getConnection( )方法。该方法接受含有某个URL的字符串。 DriverManager类(即所谓的JDBC管理层)将尝试找到可与那个URL所代表的数据库进行连接的驱动程序。 DriverManager类存有已注册的Driver类的清单。当调用方法getConnection( )时,它将检查清单中的每个驱动程序,直到找到可与URL中指定的数据库进行连接的驱动程序为止。Driver的Connection( )方法使用这个URL来建立实际的连接。
4.2.5 JDBC URL
JDBC URL提供了一种标识数据库的方法,可以使相应的驱动程序能识别该数据库并与之建立连接。实际上,驱动程序编程员将决定用什么JDBC URL来标识特定的驱动程序。用户不必关心如何来形成JDBC URL;他们只需使用与所用的驱动程序一起提供的 URL即可。
JDBC URL 的标准语法如下所示,它由三部分组成,各部分用冒号分隔:
Jdbc:<子协议>:<子名称>
JDBC URL的三个部分可分解如下:
Jdbc--协议。JDBC中的协议总是 jdbc。
<子协议>--驱动程序或数据库连结机制的名称。子协议名的典型示例是:odbc,该名称是为用于指定ODBC风格的数据资源名称的URL专门保留的。例如,为了通过JDBC-ODBC桥来访问某个数据库,可以用如下所示的URL: jdbc:odbc:fred
<子名称>--一种标识数据库的方法。子名称可依不同的子协议而变化。它还可以有子名称的子名称。使用子名称的目的是为定位数据库提供足够的信息。
第五章 图档结构树与数据库的关联
5.1服务器环境的安装与配置
5.1.1 Java语言的安装
Java系统一般包含部分:环境、语言、应用程序接口、类库,作为Java开发工具的Java2SDK包含这四个部分,该软件包可以从java.sun.com处下载。下载的J2SE v1.3文件为j2sdk1_3_0-win.exe,在执行该文件后就自动安装完成Java的环境,在这里我将其安装在D:\jdk目录中,则整个Java执行文件存于D:\jdk\bin中,类文件存于D:\jdk\lib\tools.jar中,因此,为了方便起见,将下列路径加入autoexec.bat中:
PATH.;D:\JDK\BIN;
SET CLASSPATH=.;D:\JDK\LIB\TOOLS.JAR
这样就将Java语言的编译环境安装成功了。
5.1.2 服务器的安装
在这里我采用的服务器是Tomcat,它支持并实现Sun公司的Java Servlet SDK2.2版,以及JavaServer Pages1.1版,可是说是一个国际级的JSP服务器,也称为JSP引擎。Tomcat可融入Apache服务器中,Apache可安装在Unix、Linux、NT、Windows等平台,由此可见,JSP技术是跨平台的。
首先,从jakarta.apache.org/ 处下载 jakarta-tomcat.zip 文件,然后,将其解压C:\,为了简单起见,将C:\jakarta-tomcat目录改为 C:\tomcat,此时,服务器的根目录<SERVER_ROOT>为C:\tomcat。 然后在C:\tomcat\bin\tomcat.bat文件中插入下列两行设置,以说明服务器及Java的目录位置: SET TOMCAT_HOME=C:\TOMCAT
SET JAVA_HOME=D:\JDK
然后,运行C:\TOMCAT\BIN\STARTUP.BAT 试图启动服务器,但是系统提示:OUT OF MENERYSPACE,服务器启动没能成功。后经查阅资料,将DOS运行的内存初始环境设置为2816,再次运行,启动成功。启动浏览器,访问LOCALHOST:8080/ 进入TOMCAT例题画面。到此,服务器安装已经成功。下面进行网络应用程序目录结构的建立,在C:\TOMCAT下建立如下子目录:
/HOWJSP 这是根目录,用于存放JSP文件和HTML文件
/HOWJSP/GLOBAL 存放公用引入文件或网页文件
/HOWJSP/WEB-INF 存放其他的资源
/HOWJSP/WEB-INF/CLASSES 存放服务器端小程序类及其他公用类
为了让Tomcat了解网络应用程序howjsp,还必须将下列信息:
<Context path="/howjsp" docBase="howjsp"
defaultSessionTimeOut="30" isWAREExpanded="true"
isWARValidated="false " isInvokerEnabled="true"
isWorkDirPersistent="false" reloadable="true"/>
插入到C:\tomcat\conf\server.xml文件中的examples之后。这样工作目录就已经安装好了,启动服务器后,在浏览器中就可以访问localhost:8080/howjsp/ 下面的文件了。
5.2数据库与数据源的设置
数据库名称:Graphdoc.mdb
数据源名: Graphdoc
用户名: ""
用户口令: ""
数据院描述:Graph Document
表5-1是数据库中item表的字段名称、类型、长度等属性的表述:
字段名 字段类型 字段大小 字段描述
id 数字 长整型 图档编号
graphname 文本 50 图档名称
author1 文本 20 第一设计者
author2 文本 20 第二设计者
designDep 文本 50 设计部门
place 文本 20 图档存放地点
docdate 日期/时间 / 归档日期
表5-1 item的字段类型表
5.3 JSP程序流程
JSP首先加载JDBC-ODBC桥驱动程序,然后建立与DBMS连接,连接建立后,执行SQL语句,对数据库进行操作。最后将符合要求的数据取出来,并用超文本的格式反馈给浏览器,以网页的形式显示出来。
5.3.1 与数据库建立连接
第一步是加载驱动程序:
加载驱动程序非常的简单,只需要一句代码。这里使用JDBC-ODBC桥驱动: Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 驱动程序文档将会告诉你class name。因为当你调用class.forName的时候它已经自动加载了。当你加载了驱动程序后,那么就可以和DBMS建立连接了。
第二步是与DBMS建立链接:
看如下的代码:
Connection con=DriverManager.getConection("jdbc:odbc:graphdoc", "","");
这里因为使用JDBC-ODBC桥驱动程序,那么JDBC的URL应该是jdbc:odbc:接下来是数据源的名称。在这里,数据源的用户名为"",口令为""。当DriverManager.getConnection方法找到了建立链接的驱动程序和源,那么开始根据后面提供的用户名和口令开始与DBMS建立连接,如果通过那么连接建立完成。
5.3.2 访问数据库并将数据反馈
首先,执行SQL语句,以读出符合要求的数据。例如,这里我们要把所有设计部门为"ibm"的工程图纸全部找出来。执行如下代码:
ResultSet rs = statement.executeQuery("SELECT * FROM item where designDep='ibm'");
然后,还要将这些数据生成超文本的形式,我们可以使用循环语句,将所有的数据纪录用表格的形式生成网页。
部分代码如下:
while (rs.next())
{
out.println("<TR><TD>"+rs.getObject("id")+"</TD>");
out.println("<TD>"+rs.getString("graphname")+"</TD>");
out.println("<TD>"+rs.getString("author1")+"</TD>");
out.println("<TD>"+rs.getString("author2")+"</TD>");
out.println("<TD>"+rs.getString("designDep")+"</TD>");
out.println("<TD>"+rs.getString("place")+"</TD>");
out.println("<TD>"+rs.getString("docdate")+"</TD></TR>");
}
当然,这些并不是一个完整的表格代码,而只是表示一行单元格的HTML标识,其余部分的用以构成完整表格的HTML是静态的,而不是有JSP来动态生成的。
5.3.3 工作流程
5.3.4 实现图例
结 论
运用JavaScript脚本语言和JavaServer Pages 这两种技术,基本上可以满足本课题的设计要求,即通过树型目录的层次结构,来对数据库中具有不同属性的数据进行分类输出,同时并将这些数据作为网页的形式反馈给浏览器,这样就可以使客户端的用户非常方便的对数据库内容进行调阅。
作为工程图纸,其分类结构一般是相对固定的,而不会有经常的变动。因此,在这里我使用的是脚本语言来实现图档结构树,这样对树的处理可以在客户端完成,从而可以减轻服务器的负担。但是由于采用的是浏览器脚本来实现的。因此,如果要改变这棵树的结构时,就不得不要修改其源文件,这是本设计中值得改进的一个问题。当然,这个问题完全可以使用后面关联部分的JSP技术来解决。譬如,可以为树建立一个数据表,每一条纪录用来表示一个节点,在每一条纪录中可以设立多个数据项来表示该节点的属性,如:这个节点所处的层、当前的状态是打开还是关闭、该节点所属的父节点 等信息,这样整个树的生成信息都在这个数据库中,当需要改变树结构时,只需要改变相应数据库内容就行了,当然这些改变并不一定要直接去修改数据库,可以通过JSP把有修改权限的用户的修改信息传递给服务器。但是,这样的话当客户端的用户数很大的时候,对服务器的访问之频繁是可想而知的。因此,以上两种方法各有优缺点。
在与数据库关联这部分,每一个叶子节点对应一个JSP文件,以完成相应的数据库操作和反馈操作。这样有一个缺点就是当节点很多时,所需要的JSP文件就需要相应的增加。这个问题可以只用一个文件来进行处理,通过节点把各自不同的参数传递给该JSP文件,以执行不同的命令,从而输出不同的结果。
综上所述,本设计基本上满足了这个课题的要求,但是还有很多地方存在不足,值得进一步改进!
致 谢
在本课题的完成过程中,得到了陈良宽教授的悉心指导,并且在百忙之中审阅了全文,还提出了一些宝贵的建议。他那严谨的治学态度,值得我好好的学习。另外,还要感谢我的同学们,他们给我提供了很多的帮助。
同时还要感谢我们系的领导,他们为我提供了很好的上机环境,如果没有这么好的机房环境和上机条件,要想按时完成本课题是不可能的。
最后再一次感谢所有指导、帮助过我的人!
参 考 文 献
1、 王炜. JavaScript编程指南. 北京:电子工业出版社,1999
2、 罗小明,付胜兵. JavaScript与HTML实用教程. 北京:国防工业版社,1998
3、 James Jaworski(美). JavaScript与Jscript从入门到精通. 北京:电子工业出版社,2000
4、 Rick Darnell(美). JavaScript快速查询手册. 北京:机械工业出版社,1997
5、 Lee Purcell, Mary Jane Mara(美). JavaScript实用指南. 电子工业出版社,1997
6、 Robert Mullen(美). HTML4开发人员参考手册. 北京:机械工业出版社,1998
7、 N.兰达尔(美). HTML用户使用指南. 北京:科学出版社, 1996
8、 Ian S.Graham(美). HTML格式页资源手册. 北京:电子工业出版社,1998
9、 康博创作室. HTML网页设计指南. 北京:人民邮电出版社, 1999
10、Aaron Walsh & John Frouckowiak(美). Java宝典. 北京:电子工业出版社,1999
11、黄理,李积善. 用JSP轻松开发WEB网站. 北京:希望电子出版社,2001
12、王克宏 等. Java嵌入技术. 北京:清华大学出版社,1998
13、贺军,何雄. JSP网络程序设计. 北京:人民邮电出版社,2001
14、李巍 等. JSP编程入门与应用实例. 北京:清华大学出版社, 2001
15、杨珏. JSP网络开发技术. 北京:人民邮电出版社,2001