帝国软件
  设为首页 加入收藏 关于我们
 
解密帝国网站管理系统
栏 目:
 
您的位置:首页 > 技术文档 > JAVA编程
使用 Jacl 脚本扩展 XML 工具
作者:未知 发布时间:2005-03-12 来源:JSP天空网
如何使用 Tcl 脚本语言的 Java 实现来扩展开放源码 XML 工具
Phil Whiles (philw@skyline-computing.co.uk)
自由 Java 开发人员,Skyline Computing Ltd.
2002 年 2 月

本文演示了如何使用 Jacl 来扩展开放源码 Apache XML 工具,Jacl 是流行的 Tcl 脚本语言的 Java 实现。使用 Jacl,您可以在 XML 或 XSL 中嵌入用脚本编写的功能。此外,由于其 Java 扩展,因此,您可以使用 Jacl 来同基于 Java 的 Apache 工具内的 Java 对象进行交互。虽然本文演示的是如何对 Ant 构建工具一起使用 Jacl,但是其中所讲述的方法对扩展诸如 Xalan 和 Cocoon 等其它 Apache XML 工具同样有效。另外还有至少十几个可重用代码样本演示了这一技术。
Jacl 向 Java 开发人员提供了另外一种处理 XML 的方法。Jacl 是流行的脚本语言 Tcl 的一种 Java 实现,使用它您可以深入底层并向使用 Ant 编写的 XML 构建或使用 Xalan 和 Cocoon 生成的转换中添加功能。(有关 Tcl 和 Jacl 的更多背景知识,请参阅侧栏“Jacl?Tcl?从没听说过吗?”。)Jacl 能为 XML 和 XSL 开发人员开创一个全新的世界。

两全其美
除了实现大多数 Tcl 命令集之外,Jacl 还提供了一些其自己的 Tcl 命令,这些命令允许程序员同 Java VM 交互。这些额外的命令允许 Jacl 代码创建 Java 对象,调用其中的方法,调用静态方法,内省 Java 对象甚至将 Jacl 侦听器绑定到 Java 事件。这种在同一个脚本中同时使用 Tcl 和 Java 代码的能力带来了许多可能性。试想为系统编写一套 Java 服务、组件或构件块。通过在同这些组件相同的 VM 中使用 Jacl,您可以以脚本方式执行和控制 Java 组件。

您也可以使用 Jacl 作为交互式 shell,在那里您可以以交互方式(也就是从通常的 shell 提示符中)创建 Java 对象并调用其中的方法,如清单 1 中所示。

清单 1. 交互式 Jacl Hello World
--> jaclsh
% package require java
1.2.6
% set s [java::new String "Hello World !"]
java0x1
% $s toString
Hello World !
%


Jacl? Tcl? 从没听说过吗?

Tcl 表示工具命令语言(Tool Command Language),它是一种流行的脚本编制语言,最初由加州大学伯克利分校的 John Ousterhout 教授开发。John Ousterhout 打算将 Tcl 作为一种将其它程序组件粘合在一起的语言,既可以以同其它脚本语言相同的方式将 Tcl 用作交互式 shell/脚本解释器,诸如 Bourne Shell 或 Korn Shell,也可以将其作为脚本解释器嵌入您自己的 C 应用程序。在这种方式下,它就变成了一种向您自己的程序中添加脚本编制控制的方法,并且它提供了一些接口,这些接口允许您用自己的以 C 语言实现的脚本命令扩展基本 Tcl 语言。

Tcl 还有各种扩展,诸如 Tk,UI 工具箱,以及 Expect,Expect 是一种扩展,用于自动化同其它基于 shell 的命令(例如 telnet 和 ftp)的交互。

Tcl,同其它脚本语言一样,需要在每个平台上安装一个本机 Tcl 解释器,并且对于当今大多数流行的平台都存在。

然而,Jacl 是 Tcl 解释器的 Java 实现:无须安装 Tcl 解释器,您仅需一个 Java VM 以及相关的 Jacl jar 文件。Jacl 通过其 Java 特性提供了一种真正的跨平台的脚本语言。

对于习惯了 Java 而又不想投入太多时间学习另外一种语言的程序员来说,Jacl 也是一种非常强大的通用脚本语言。Tcl 有相对清晰和简单的语法,Java 程序员可以以混合然后匹配的方式使用 Jacl:将 Jacl 用于那些脚本语言最适用的地方(简单文件处理、正则表达式解析、字符串替换、执行系统命令等等),并利用 Jacl 的 Java 扩展来访问完整的 Java API 以及重用现有的 API 知识。

安装
首先从 ActiveState 获取 Jacl(参阅参考资料)。然后,下载 jacl1.2.6 源代码压缩文档,解压缩/压缩/tar 该分发版,然后执行 README 中的构建指令。一旦配置并构建了 jacl,您将在平台构建目录内发现两个 jar 文件,jacl.jar 和 tcljava.jar。要在 UNIX 平台上运行交互式 Jacl shell,请运行 UNIX 平台构建目录下的 jaclsh。如果您运行的是 Windows,请使用清单 2 中的批处理文件。

您的环境必须将 jaclsh 文件的位置包含在其 PATH 里,并将两个 jar 文件包含在 CLASSPATH 里。(您甚至想要将 jaclsh 复制或符号链接到 /usr/local/bin。)

现在可以使用 Jacl 了。为了验证您的安装,请按清单 1 中示例中的方式使用 jaclsh 封装器。一旦验证了安装,您就可以开始编写 Jacl 脚本了。在 Linux 上,您可以通过简单地在脚本文件的顶部使用 shebang 指令来方便地编写 Jacl 脚本,如清单 3 中所示。

清单 3. shebang 指令
#!/usr/local/bin/jaclsh



或者,如果在您的平台上不能使用直接调用方法,您也可以使用清单 4。

清单 4. 启动 Jacl 的替代方法
#!/bin/sh
#
exec jaclsh "$0" ${1+"$@"}
package require java
puts [[java::new String "hello"] toString]



清单 4 中演示的启动 Jacl 的方法通过首先启动 sh 来进行。第二行是一个带有连续行符号的注释,它欺骗 sh 使其把脚本的剩余部分当作一个大注释。

由 Jacl 对 Tcl 所做的所有扩展都在 Tcl 名称空间 java 中,并且都使用 java:: 作前缀。要使用这些扩展,请使用 package 命令来装入 Java 扩展。

现在,您已经对获得、安装并开始使用 Jacl 来编写您自己的 Tcl/Java 混合程序有了足够的了解。要编写 XML 和 XSLT 脚本,您将需要执行另外一个重要步骤。

BSF: 在脚本语言中插入
到本文结束时,您将可以愉快地使用 Jacl 编写您的 Ant XML 和 Xalan XSLT ? 但是要做到这一点您还需要一些其它的东西。虽然由于 Jacl 提供了到 Java 功能的良好接口,本文提倡使用它,但 Ant 和 Xalan 都允许您使用几种脚本语言之一(或同时使用几种!)来扩展它们。怎样扩展呢? 使用 IBM Bean 脚本编制框架(IBM Bean Scripting Framework (BSF) ? 参阅参考资料)。

我们引述一下 BSF 主页,“Bean 脚本编制框架是一种将脚本编制合并到 Java 应用程序和 applet 中的体系结构”。BSF 允许应用程序提供脚本编制扩展而无须致力于选择使用何种脚本语言。实际上您必须使用一种符合 BSF 规范的脚本语言,并且它必须是用 Java 实现的。作为一名 Ant/Xalan 开发人员,您需要知道的关于 BSF 的所有知识是如何安装它。

安装仅仅只是下载 BSF 并将 lib 目录下的 bsf.jar 添加到您的类路径中。

Ant,跨平台构建工具
Ant,Apache Jakarta 小组的产品,是用作主要在 UNIX 下找到的标准 Make 实用程序的 Java 替代品。Ant 使用 XML 定义 Make 规则,并且缺省情况下尝试读取位于启动它的目录中的文件 build.xml。

任务
任务是 Ant“命令”,例如 javac、mkdir、echo 等等。Ant 提供了一组常见的任务,大多数 Java 开发人员会发现这些任务对于他们的构建需求来说已经足够全面。Ant 允许开发人员提供他们自己的任务。这只是简单地扩展 Ant 类 org.apache.tools.ant.Task 的事情,并提供读方法、写方法以及执行方法。这样,您就可以扩展 Ant 以执行您项目预定的行为。

缺省情况下,为文件存取操作提供了一组丰富的任务(例如复制和删除)以及同 Java 相关的任务(例如 Javadoc 和 Javac)。Ant 还允许用 Java 编写的扩展任务并将其合并到 build.xml 文件中。例如,您可能需要扩展任务,以与 Visual Age 进行对接、从数据库检索数据或为您的构建调用第三方工具中的方法。虽然这种机制提供了一种扩展 Ant 的功能强大的方法,但扩展却是用 100% 的 Java 编写的。这适合于许多情况,其中扩展扮演一个十分离散且独立的角色,但将脚本作为扩展机制的使用却允许将通常的脚本类型的命令聚合成一个功能更多、更强大的整体。

除了将新的用 Java 编码的任务添加到 Ant XML 构建中之外,您还可以使用 BSF 脚本来扩充它。Jacl 同 Ant 合作得非常好。有了 Java 基础,Jacl 代码(最终就是 Tcl)就可以使用扩展,这些扩展允许 Tcl 代码在解释 Jacl 代码的 VM 中创建并使用 Java 对象。这个 VM 同 Ant 的 VM 相同,这意味着作为解析 build.xml 的结果,Ant 所创建的任何 Java 对象可以通过 Jacl 代码看到和访问。

目标
build.xml 文件包含一个或多个目标,目标是标识一节可执行内容的元素类型。每个 build.xml 可以有一个缺省目标,并且这可以通过在命令行为 Ant 指定所需的目标来覆盖这一缺省值。Makefile 的必然结果将是诸如 install、clean、dist-clean 等的目标。

特性
Ant 以两种方式使用 Java 特性:作为 build.xml 的实体,以及作为 Ant 在运行时读取的标准 Java 特性文件内的实体。您可以使用特性来改变构建的行为,或者作为在 Jacl 脚本内,一种为常规 Ant 运行时提供有关一段 Jacl 脚本产生结果的反馈的方式。

安装 Ant
下载 Ant 时,请确保下载包含 Ant 源代码的版本。当与 Ant 一起使用 Jacl 时,这是非常有价值的;它们会给您带来生成大多数 Jacl 扩展所需的内部信息。解压缩源码分发版并执行构建 Ant 的指令。(在我使用的版本中有一个 bootstrap.sh,它构建所有所需的 jar 文件)。您需要添加到您的类路径中的 jar 文件是(可以从 Ant 根目录中看到):

./lib/jaxp.jar
./lib/parser.jar
./build/lib/ant.jar
./build/lib/optional.jar
现在,您已经有了完整的文件集,并已经安装了 bsf.jar、jacl.jar 和 tcljava.jar 这些 jar。BSF 框架使得 Ant“程序”内的所有对象对您的 Jacl 代码都是可见的,Ant“程序”毕竟在与 Jacl 代码相同的 VM 上运行。知道了 Ant 中使用什么类,Jacl 代码就能够调用它们的方法、访问字段,等等 ? 甚至能够动态地创建 Ant 类的实例。

开始脚本编制
一旦安装了 Ant 并运行了简单的 build.xml 文件,如何嵌入 Jacl 呢? 通过在 build.xml 中简单地使用 <script> 元素来实现。由于脚本无须有良好的格式,因此您必须将它隐藏在 CDATA 元素中,使它对于 XML 解析器不可见,如清单 5 中所示。

清单 5 中的脚本向您演示了如何嵌入原始的 Hello World 示例,它仅仅创建了一个新的 java.lang.String 对象并打印调用其中的 toString 方法所得的结果。在 Tcl/Jacl 中,任何由 [ ] 括起来的脚本都是内联执行的,并将其运行结果替换在其位置上。请注意,就象 Java 代码一样,java.lang 中的类自动可见并且无须导入。

为了充分利用 Jacl 作为扩展 Ant 的方式,请记住 Ant 正在对 build.xml 做什么。Ant 为其解析 build.xml 时所碰到的所有实体创建 Jakarta Ant 类实例。以顶级 project 实体为例。运行 Ant 的 VM 将只有一个,并且它属于类型 org.apache.tools.ant.Project。请查看一下该类型的源代码,您将会发现所有的方法和字段,它们将把您的 XML 接口视为项目元素。在清单 5 中的示例 build.xml 中,运行时会有一个 Jacl 脚本可访问的称为 script01 的 Java 对象,类型为 org.apache.tools.ant.Project。通过使用 Jacl 的 Java 扩展,您可以在运行时访问该对象以达到您自己的目的。为什么? 请继续阅读!

设置特性
Ant 中的一个 Jacl 脚本块可以使用 project 对象来读取 ? 甚至设置 ? 特性值。这就象调用隐式项目实例中的读方法和写方法一样容易,但是需要警告的是:

每个被调用的目标有一个完全是自己的 project 实例的新副本。如果在一个目标中用 Jacl 脚本设置了特性,那么该目标直接调用的所有其它目标都可以看见该特性,但在 Ant“栈”中位于该目标之前的其它目标不能看到该特性。

清单 6 中的示例演示了如何设置和获取特性,还演示了该特性的作用域。第一节演示了一个纯 XML 示例,在该示例中使用 Ant <property> 任务设置特性。第二节演示了使用 Jacl 重新实现以设置特性的目标 b。无论您使用哪种方法设置特性,结果都是相同的,如最后一部分的 Ant 运行时输出所示。这演示了特性 x 在目标 c(已由 b 所调用过的)的作用域中,但返回到目标 a 时不再在作用域内。

清单 6. 设置和获取特性
(scope.xml)
<project name="scope" default="a">
<target name="a">
<antcall target="b"/>
<echo message="a:x=${x}" />
</target>

<target name="b">
<property name="x" value="1"/>
<antcall target="c"/>
</target>

<target name="c">
<echo message="c:x=${x}" />
</target>

</project>

(target b reimplemented in Jacl)
<target name="b">
<script language="jacl"> <![CDATA[
package require java
$scope setProperty x 1
]]></script>
<antcall target="c"/>
</target>

(Ant runtime output)

a:

b:

c:
[echo] c:x=1
[echo] a:x=${x}




获得输入
在构建执行期间,Ant 不提供任何方式以获取用户输入。主要通过使用特性来确定目标执行的顺序,用户不以交互方式参与确定该顺序。通过使用 Jacl,您可以添加这一交互,如清单 7 中所示。

清单 7 中的脚本打印“Shall I”提示,然后把从 stdin 获取的输入设置到 Tcl 变量 inpvar 中,然后可以使用该变量来控制脚本执行的分支。

通过使用 Jacl 的 java:: namespace 扩展,您可以添加一个更图形化的输入。清单 8 中的脚本演示了如何创建执行 Ant 构建时显示的 Java Swing UI。您可以使用这一技术编写完整的 UI。同纯 Java 不同,用 Jacl 编写 UI 的好处是 Jacl 版本是嵌入在 build.xml 文件中的,并且可以为 UI 提供缺省值和数据,这些值和数据可以从环境甚至从 build.xml 本身得到:

请注意在清单 8 中对脚本中的 Java 类进行了显式的命名:Jacl 有一个导入机制,但只限于要么一次导入一个类(即,java::import javax.swing.JFrame),要么从同一个包中导入一组类(即,java::import javax.swing JFrame JPanel JLabel JButton)。

当用 Tcl 创建一个新的 Java 对象时,返回的结果是对该对象的引用。在清单 8 中,UI 组件存储在 Jacl 变量中,稍后将用于调用那些对象中的方法。

java::bind 函数允许将脚本块同 Java 对象触发的事件相关联。在这种情况下,当按了任一 JButton 时,Jacl 变量 cont 的值都会改变。接下来将允许代码跳过 vwait cont 行而继续运行,这一行在 cont 变量未更改时阻止代码继续运行。

图 1 显示了这一脚本的输出。

图 1. 清单 8 中的脚本输出


在清单 8 的 script03 中,如果用户选择不“do xyz”,脚本作者可以打印一条帮助消息,并且根据构建文件的结构,构建会继续执行到其它目标。但是,假定在用户输入后或者根据其它会终止构建的因素而在脚本内做出了决定,那该怎么办呢?

Ant 提供一个 <fail> 元素,它允许构建以受控方式退出,并首先向用户打印一条失败消息。使用 Jacl,您可以动态创建 Ant 对象并在运行时使用它们,就如同它们是硬编码到 build.xml 中一样,如清单 9 中所示。

清单 9 动态创建了一个 <fail> 任务,使用一条失败消息来初始化它,然后将其添加到当前目标 hello 的任务列表中。可以通过获取当前项目的目标列表,通过名称(hello)找到当前目标,然后调用当前目标上的 addTask 方法来实现这一点。当脚本执行完时,将会执行 invisible 任务,并且该构建将会适当地失败。

如果您想从 Jacl 脚本中调用一个现有的目标作为替代会怎样呢?有一种方法可以实现这一点,它是对 Ant/Jacl 脚本工具集的一个强有力的补充。然而,实现这一点需要些许附加编码。我发现使用现有的 Ant API 以这种特别的方式来调用目标是不可能的,但是我可以通过以两种额外的方法扩展 Ant 提供的类之一来设法实现这一点。首先,您必须创建一个如清单 10 中所示的 Java 扩展类。

清单 10. 创建 Java 扩展类以从 Jacl 脚本内调用目标
(CallTargetMod.java)

import org.apache.tools.ant.*;
import org.apache.tools.ant.taskdefs.*;

public class CallTargetMod extends CallTarget
{
public void setTarget (Target target)
{
this.target=target;
}
public void setTaskName (String taskName)
{
this.taskName=taskName;
}
}



要在清单 10 中使用这一新扩展,请将其放置在类路径中并确保将下列行添加到 build.xml 中:


<taskdef name="calltargetmod" classname="CallTargetMod" />



为了从清单 10 中使用这一 CallTargetMod.java 扩展类,您需要动态地创建它的一个实例,对它进行初始化,然后调用其可执行方法,如清单 11 中所示。由于您可能很想在几个不同的脚本中重用这一技术,不论是在同一个 build.xml 文件中还是跨越几个不同的文件,因此我建议您将该额外的脚本分割成一个完全不同的文件并使用 Jacl source 命令。那样,不止一个脚本可以包含这一通用功能,维护起来也将更容易。

为使清单 11 中的过程起作用,您的 build.xml 必须将 <project> 名称定义为 myproject。由于 project 名称与 build.xml 的有效运行没有什么关系,因此使这段代码通用化的代价很小。

那么,做完这些之后,如何实际使用 CallTarget 呢?下面的 build.xml 演示了几个要点:

<project> 的公共命名
使用 <taskdef> 元素来告诉 Ant 哪个类实现了 calltargetmod 元素
使用“source”命令来重用 calltarget.jacl 代码
最后,如何在 Jacl 中调用新的并且是非常有用的 CallTarget 过程
清单 12. 使用 CallTarget
<project name="myproject" default="hello">

<taskdef name="calltargetmod" classname="CallTargetMod" />

<target name="hello">
<script language="jacl"> <![CDATA[
package require java
source calltarget.jacl
calltarget hello targetXYZ
]]></script>
</target>

<target name="targetXYZ">
<echo message="This is targetXYZ !!">
</target>
</project>




在一个可能有很多 build.xml 文件的大型项目中,建议您用 Ant 进一步将通用代码分开。在一个 XML 文件中,您可以存储所有的 XML 目标,这些目标实现了您可能在不同的 build.xml 文件中所用到的公共功能;这甚至无须有完整的良好形式 ? 它可以只是在运行时包含在每个依赖的 build.xml 文件中的一个 XML 片段。这可以通过使用清单 13 中所示的 XML include 技巧来实现。

当运行清单 13 时,会在运行时将公共文件 common.xml(它含有公共的 XML 目标)的内容插入到 %IncludeBuildCommon 出现的地方。

通过使用清单 10 中的 calltargetmod 扩展,您可以在 Ant 构建中实现一些优秀的功能,这些功能不可能使用其它方式实现。我将给出几个示例。

首先,您可以创建一个实现切换功能的目标,该功能允许执行路径根据一个 Ant 特性值流向分支中的一个方向。首先,通过重用 calltargetmod(最好放在推荐的 common.xml 文件中)和使用 calltargetmod 的 build.xml,创建清单 14 中实现切换功能本身的 XML 片段,如清单所示。

switch 目标使用 Tcl 函数 split 来表示 cases 特性值,这会导致产生 Tcl 列表变量 lcases。您可以以多种方式使用这一技巧。例如,您可以设置一个列出一组文件的特性,Jacl 脚本随后可以分割这些文件并将其用于操作。它可能会对每个文件执行一个操作,读取每个文件的内容,等等。

函数 lsearch 搜索整个 cases 列表以查找 on 参数的一个匹配。生成的索引然后用于获取目标以从目标列表 ltargets 调用。接下来使用 calltarget 函数来调用匹配的目标或缺省目标。

请注意,switch 目标的所有参数作为对象都可以隐式地用于 Jacl。

另外,通过早一些使用 calltargetmod,您可以在 build.xml 中实现 ifelse 语句。简单地将目标 ifelse 的定义添加到 common.xml 文件,然后如清单 15 后面的 build.xml 所示的那样使用它。

这一扩展允许您在 XML 中使用 if/else 条件,而无须每次都使用 Jacl 脚本,就象上面的 switch 一样。ifelse 目标只编写一次,只需从标准构建 XML 中调用就可以重用。由于 Tcl 中有内置的表达式处理和字符串到标量的转换,所以可以使用这一扩展来比较字符串和数值。

结束语
到此本文就结束了。您现在应该可以通过编写 Jacl 脚本来扩展您的 Ant build.xml 了。Jacl 将为 Ant 构建过程开发人员开创各种可能性。您也可以以相同的方式使用 Jacl 来扩展 Xalan 和 Cocoon,而且 IBM WebSphere 现在使用 Jacl 作为其命令行接口 WSCP 的脚本语言,因此您也可以在那里使用您新获得的知识。或许,本文甚至会说服您将 Jacl 作为您的 Java 项目的独立脚本语言。

参考资料


在 ActiveState 站点找到 Jacl。ActiveState 上的 Getting Started with Tcl 页面含有大量的链接,包括书籍、在线教程、Usenet 组和 FAQ。
从 Apache Jakarta 项目下载 Ant。
从 Apache XML 项目下载 Xalan。
从 developerWorks 开放源码专区的 Bean 脚本编制框架主页下载 BSF。
找到更多关于 IBM 的 WebSphere 的信息,WebSphere 使用 Jacl 作为脚本语言。
查看专业的 XML 开发人员认证,它是 IBM 专业开发人员计划的一部分。另外请查看 XML@Whiz,它是一个第三方的认证培训站点,里面有价值 50 美元的带有模拟认证测试的教程,还有一个(带有较少测试和问题的)免费试用版。
推荐读物


Brent B. Welsh 编著的 Practical Programming in Tcl and Tk(Prentice Hall,ISBN 0-13-616830-2)
关于作者
Phil Whiles 是一名自由 Java 开发人员,他从事 IT 业已经 15 年了,其间参与了电信、交互式数字电视以及 B2B Web 开发方面的许多软件开发项目。他喜欢在解决方案中集成不同的技术这一挑战性的工作,并且在使用 Ant、Xalan、Java 和 Jacl 为大型客户实现大型 Java 项目构建系统方面取得了巨大的成功。可以通过 philw@skyline-computing.co.uk 和与联系。 
  
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
 ·使用JavaServer Pages技术生成动  (2005-03-12)
 ·使用J2EE建立基于XML的网络服务  (2005-03-12)
 ·使用Java Swing 创建一个XML编辑  (2005-03-12)
 ·使用Java Swing 创建一个XML编辑  (2005-03-12)
 ·使用Java Swing 创建一个XML编辑  (2005-03-12)
 ·Java中的XML:使用Castor进行数据  (2005-03-12)
 ·使用JAXB处理XML文档??先睹为快  (2005-03-12)
 ·使用xml+jsp技术实现网页内容动态  (2005-03-12)
 ·使用Factory Method模式  (2005-03-12)
 ·使用Observer模式  (2005-03-12)

   栏目导行
  PHP编程
  ASP编程
  ASP.NET编程
  JAVA编程
   站点最新
·致合作伙伴的欢迎信
·媒体报道
·帝国软件合作伙伴计划协议
·DiscuzX2.5会员整合通行证发布
·帝国CMS 7.0版本功能建议收集
·帝国网站管理系统2012年授权购买说
·PHPWind8.7会员整合通行证发布
·[官方插件]帝国CMS-访问统计插件
·[官方插件]帝国CMS-sitemap插件
·[官方插件]帝国CMS内容页评论AJAX分
   类别最新
·谈谈JDBC
·JDBC专题介绍
·JDBC接口技术
·利用weblogic的POOL(连接池)连接
·Jsp中调用Oracle存储过程的小例子
·JSP数据库操作例程
·JSP数据库连接大全
·用连接池提高Servlet访问数据库的效
·一种简单JDBC连接池的实现
·数据库连接池Java实现小结
 
关于帝国 | 广告服务 | 联系我们 | 程序开发 | 网站地图 | 留言板 帝国网站管理系统