第三章 Enhydra 入门

本章将深入的介绍 Enhydra ,Enhydra 应用程序和创建 Enhydra 应用程序所用到的工具。本章的要点包括:

什么是 Enhydra?

Enhydra 是一个可运行多个Web应用程序的应用服务器,它还包括一套应用程序开发工具。

应用程序服务器 通常是运行于Web服务器和数据服务器之间的,将web服务器上动态产生的内容发送到客户端的浏览器

An Enhydra 应用程序 是使用 Enhydra 应用程序框架运行于多服务器的 Java 程序。图 3.1, “Enhydra 应用程序模型” 描述了书中 Enhydra 应用程序的基本原理。

图 3.1    Enhydra 应用程序模型

[Picture]

图 3.1所示,Enhydra 由三部分组成:

下表详细的描述了 Enhydra 和 Enhydra 应用程序。

详细信息 参考标题
Enhydra 应用程序结构 Enhydra 应用程序的剖析
多服务器 多服务器运行时的组成
应用程序框架 Enhydra 应用程序框架
Enhydra 工具 Enhydra 工具

Lutris Enhydra的新特性

Enhydra 3.5 增加了一些新的特性,包括:

更多的增加和修订的信息请参阅免费的版本。

Enhydra 应用程序剖析

一个 Enhydra 应用程序由两部分组成:

这两种应用程序模型有很多相似之处,但是还有很大的不同。通常一个 servlet 应用程序中的每一页(HTML, WML等)都有一个 servlet 。而一个 super-servlet 应用程序只包含一个 servlet。这个 servlet 包含了每一页的表现层对象

你可以使用 Enhydra工具 XMLC 和 DODS来创建这两种应用程序。你可以使用任何标准的 servlet 来运行这两种应用程序,譬如 Enhydra 多服务器。

关于这两种应用程序模型的更多的不同,请参阅“Servlet 与 super-servlet 应用程序”。

Enhydra super-servlet 应用程序

一个 Enhydra 应用程序至少包括:

这些对象运行于下文讲到的Enhydra应用程序框架中,详情请见“Enhydra 应用程序框架”一节。

应用程序对象
应用程序对象是 Enhydra 应用程序的主要中心。它是一个包含应用程序所有数据的 com.lutris.appserver.server.StandardApplication 的子类 。例如:

属性
你可以为存储应用程序信息的对象添加属性。例如,你的应用程序的一些页面需要共享一个数据集合时,你可以构造一个包含应用程序特性数据的矢量,使所有的页面都可以容易的访问它。

方法
每个应用程序都有下面的方法:

    你可以扩展startup的其它功能,例如从配置文件中读取设置信息。

    你可以根据需要扩展它;例如检查 HTTP 的基本授权。

通常应用程序对象不处理HTML,操作请求及其他的网络会话;它们是由表现层对象来处理的。下面将介绍表现层对象。

表现对象
在 Enhydra super-servlet 应用程序中,表现层对象能够产生供一个或多个页面使用的动态内容。

当一个浏览器的请求地址是以.po结尾时,将这个请求转给相应的表现层对象。Enhydra 然后调用这个表现层对象。例如,地址是 http://www.foo.com/myapp/Xyz.po ,Enhydra 会调用 Xyz 表现层对象。

注意:Enhydra 只调用以.po为后缀的地址的表现层对象。Web服务器通常会为其它的请求提供一个静态文件。

表现层对象必须使用 com.lutris.appserver.server.httpPresentation.HttpPresentation 接口。这个接口中必须由一个 run() 方法,Enhydra 调用它来通过 HTTP 请求。表现层对象与servlets 不同,servlets在一个时间里只能处理一个请求。 No concurrency control is required.

Enhydra 还提供一个响应对象。a 表现层对象可以通过它来为 HTTP 请求提供数据(与servlet的 service()方法相似)。表现层对象通常处理 GET 请求(如提交表单)和 HTML 写的响应。但是他们能够执行其它的函数(如通过 POST 请求读文件)。

Servlet 应用程序

除了 super-servlet 应用程序外,你还可以用 Enhydra 创建和运行标准的 servlet 应用程序(有时称 Web 应用程序)。servlet应用程序符合 的规范,Java servlet API是 Sun 微系统 Java 2 企业版规范的一部分。这是交互式 Web 应用程序的流行标准。

关于 servlet 应用程序模型的详细信息,请参阅http://java.sun.com/products/servlet/index.html

在一个 servlet 应用程序中,每个 servlet 负责一个单独页的输出(即使没收到请求,这是惯例)。每一个 servlet 必须是 javax.servlet.http.HttpServlet 的子类,通常不管 doGet() 方法或者其它方法,例如 init()。应用程序的一般结构如图 3.2

虽然通常用 JavaServer Pages (JSPs) 来创建 servlet 应用程序的表现层,但是 XMLC 会更好,因为它提供了将页面代码(如HTML)和表现层逻辑代码分离的清洁器。值得庆幸的是你还可以用XMLC来帮你产生 servlet 应用程序的表现层代码。

图 3.2    Servlet 应用程序模型

[Picture]

Servlet 应用程序与 super-servlet 应用程序
尽管 servlet 应用程序模型与 super-servlet 应用程序模型有很多相似的地方,他们还是有些不同的。你可以在 Enhydra 多服务器上运行这两种应用程序,你可以使用 Enhydra 的 XMLC 和 DODS 工具来创建这两种应用程序。

由于 servlet API 执行它自己的表现层管理,它是不需要 Enhydra 的表现层管理器(见表现层管理器)。同样 servlet API 还提供了 session 管理,因此也不需要 Enhydra 的 Session 管理器(见 Session 管理器)。

两个应用程序模型的关键不同是表现层中的对象是如何例示的。在 super-servlet 应用程序中,每个请求将创建一个新的被请求表现对象的实例,并且以一个单独的线程来执行 PO 文件。而 servlet 应用程序刚好相反,一个特定 servlet 只有一个实例,它是多线程的(每给请求有一个线程)。因此在 servlet 应用程序中每个实例中的 POs 具有成员变量,任何一个成员变量对 servlet 实例中的所有线程都适用。

表现对象有几个特性不能在 servlet 应用程序中使用:

同时 Enhydra 有一个复杂的编译系统,特别适合编译基于 XMLC 的应用程序。但是你不能用它编译 servlet 的应用程序。

Enhydra 应用程序框架提供了很多有用的功能,它们包括:

尽管它们不是标准 servlet 应用程序模型的组成部分,但是使用它们可以节省很多开发时间;然而应用程序必须依赖 Enhydra 类库(包括在 enhydra.jar 文件中)。

应用程序层

不管你是否用过应用程序模型,你都应该将你的应用程序模块化的分为三部分或层,这样便于维护:

    拥有一个清晰的数据层的另一个好处是你可以使用数据对象设计工作台(DODS)来创建你的数据对象。DODS图形化的创建数据层上的数据对象,同时生成 Java 代码和用来创建相应数据库平台的 SQL 代码。关于DODS的更多内容,请参阅“数据对象设计工作台(DODS)”。

注意: Enhydra 应用程序框架只需要使用应用程序对象和表现对象就行了。商务和数据类库是自动产生的。

将应用程序分为三层减少了维护费用,因为它将应用程序的数据层和用户界面隔离开了。这样你可以改变数据层而不影响表现层。

多服务器运行时的组成部分

多服务器是 Enhydra 运行时的组成部分。它为 Enhydra 应用程序同 Web 服务器的通话及执行其它功能时提供服务。

为了了解 Enhydra 多服务器,你需要对 servlets 有一些了解。servlet 是动态扩展 Web 服务器功能的Java类。通常当浏览器送给 Web 服务器一个请求时,服务器会简单的通过识别请求地址来找到所需的文件,然后送给浏览器。然而当浏览器的请求是一个由 servlet 构成的页面时,服务器将请求信息送给 servlet,servlet 将建立动态响应并且将它返回给服务器。

Java Servlet API 是 Java 标准的扩展,它是Java 2 企业版(J2EE)的一部分。一些Web服务器直接支持 Servlet API ,而另一些需要 servlet 附加助手,如 Apache Web 服务器的 JServ。Enhydra 3.0和更新的版本支持 Servlet API 2.2版本。

每个应用程序运行时被看作一个单独的 servlet,不同于由一个 servlet 动态产生页面的一般的 servlet 应用程序。Enhydra 多服务器是一个能处理servlet的servlet环境,例如 Enhydra 应用程序既不是通过 Web 服务器也不是通过它自己来运行的。多服务器可以自己特有的小规模环境中运行应用程序。为了产生更好的运行环境,你可以将多服务器与 Web 服务器连接在一起。

注意:因为一个 Enhydra 应用程序是一个 servlet,你可以在任何标准的 servlet 运行环境中运行它,而不需要多服务器。

Enhydra 多服务器对每个应用程序(servlet)都有一个类装入器。因为servlets与类装入器是一对一的通信,我们可以安装和运行新的应用程序而不必停止服务器。要更新现有的应用程序,只需简单的重新启动类装入器就行了。

Enhydra 控制器

Enhydra 控制器通过将用户负载分给几个 Enhydra 多服务器来为应用程序提供更好的性能。

负载平衡法则提供了会话能力和The load-balancing algorithm supports session affinity and weighted round-robin distribution with server failover. Session affinity means that a particular session instance will always access the same Multiserver instance. The weighted round-robin, load-balancing scheme takes into account the capacity of each Multiserver instance and the number of existing connections. Server failover ensures that if a Multiserver goes down, all application connections are automatically transferred to another Multiserver instance.

Enhydra 控制器新的连接方法——Enhydra控制器连接方法——和一套新的Web服务器扩展模块。Enhydra 控制器的工作:

关于 Enhydra 控制器的更多信息和安装指南,请看 Enhydra 的在线的安装文档。

多服务器管理控制台

Enhydra 多服务器提供了一个通过 Web 浏览器管理应用程序的管理控制台。这个管理控制台能让你完成以下功能:

关于管理控制器的详细信息,请见“多服务器管理控制器”一节。

Enhydra 应用程序框架

Enhydra 应用程序框架包括:

通常,应用程序框架包括 com.lutris.appserver.server.* 包中的所有的类,在 Enhydra 应用程序运行时这些类提供给底部结构使用。

The图 3.3, “Enhydra 应用程序和 Enhydra 框架” 描述了在上下文的Enhydra应用程序框架中提到的Enhydra应用程序的一般结构。

图 3.3    Enhydra 应用程序和 Enhydra 框架

[Picture]

表现管理器

在 Enhydra 应用程序中,Enhydra 表现管理器 处理表现对象的载入和执行。表现管理器为表现对象连接了URLs并且调用了表现对象的 run() 方法。

每个 Enhydra 应用程序有一个表现管理器的实例。为了提高性能,表现管理器在必要的时候将表现对象和相关的文件保留在内存中。表现管理器还为 session 管理器定位一个会话提供了解答。这个解答既不是 cookie 也不是添加在应用程序的URL字串。

每一个应用程序拥有com.lutris.appserver.server.httpPresentation.HttpPresentationManager类实例的表现管理器。com.lutris.appserver.server.httpPresentation 包包括了表现管理器和表现对象使用到的类和接口。

Session 管理器

Enhydra Session 管理器 能够通过 session 来维持一个应用程序的状态。session 是在特定的时间里同一使用者(浏览器的客户端)的一系列请求。Enhydra 执行 session 管理,你可以扩展的创建更复杂的状态模型。

Enhydra 通过创建一个 Session 对象来维持每一个用户的状态。当用户第一次对应用程序发出请求时,Session 管理器将创建一个新的 Session 对象并且将赋给它一个特定的 session ID。Session 管理器将根据 session ID 得到 Session 对象来满足后面的请求。应用程序可以将用户的详细信息添加给 Session 对象,然后再通过应用程序将请求对象加入到 Session 对象里。

如果一个用户已经空闲(没有向应用程序发出请求)超过了配置文件中的指定时间,用户的 session 将无效。Session 管理器将会释放相应的 Session 对象。这将会使用户进入应用程序前要求登陆的安全设计成为可能。在这样的设计中,用户输入正确的密码会得到应用程序其它部分的使用权限。但是一旦用户的 session 因为超时而无效时,应用程序会要求用户重新的登陆。

每一个应用程序拥有com.lutris.appserver.server.session.StandardSessionManager类实例的 Session 管理器。当它被创建时,Session 管理器会从配置文件 appName.conf 中读取到 session 持续的最大时间, session 空闲的最大时间一集应用程序的其它相关信息。

com.lutris.appserver.server.session 包包括了 Session 管理器和管理session的应用程序使用到的类和接口。

数据库管理器

Enhydra 数据库管理器Database Manager 控制着应用程序数据库连接的一个层。数据库管理器管理的是逻辑数据库。一个逻辑数据库 提取出不同类型数据库本质的不同点。一个逻辑数据库使用 Java Database Connectivity (JDBC) 来与其他的如 Oracle, Sybase, Informix, Microsoft SQL Server, PostgreSQL, InterBase和 InstantDB的数据库服务器通话。

数据库管理器负责数据库的连接状态,SQL 声明这将生效,将会利于它的发展。数据库管理器明确包括:

每一个应用程序拥有com.lutris.appserver.server.sql.StandardDatabaseManager类实例的数据库管理器。当它被创建时,数据库管理器从配置文件中读取到所使用到的逻辑数据库,目前的数据库的类型以及其它相关信息。

com.lutris.appserver.server.sql 包包括了数据库管理器和数据对象使用到的所有类和接口。

Enhydra 工具

Enhydra 包括以下可以帮你创建应用程序的工具:

Enhydra 应用程序向导

Enhydra 应用程序向导是命令行和图形界面的工具。该向导能创建 Enhydra 应用程序的基本框架。该向导还可以让你在很短的时间里创建并运行一个新的“stub”应用程序,使你的开发项目有飞跃。一个使用图形界面(GUI)应用程序向导的例子请看“创建你的第一个应用程序”

注意:Lutris Enhydra 3.5 版本的应用程序向导已经改进了。以前应用程序向导是在命令行键入 newapp 及项目名称和参数的命令行的工具。作为命令行的工具来启动应用程序向导的命令和参数已经改变了。应用程序向导产生的文件和目录的基本框架也已经改变了。

Enhydra 应用程序向导还集成了 Enhydra Kelp 工具,你可以使用完整的图形开发环境(IDE)来创建你的应用程序基本框架。

关于 Enhydra 应用程序向导的另外信息,可查阅开发指南第二章“使用应用程序向导创建 Enhydra 应用程序”

可扩展标记语言编译器 (XMLC)

可扩展标记语言编译器(XMLC) 创建一个 Java 对象,它是可扩展标记语言(XML)文件的镜像。XML,World Wide Web Consortium (W3C)的定义是在Web上构造文件和数据的通用格式。XMLC 使用Document Object Model (DOM),W3C 的标准接口,能进行程序的存取和升级XML文件的内容和结构。

注意:尽管 XMLC 使用 XML 文件工作,本书将着重讲它在 HTML 页面的应用。

XMLC 让你将应用程序中的HTML模版分离开。这些模版是页面设计者从程序员创建的Java代码中创建的。这些功能提供了增强模块性,便于团队开发和应用程序的维护。页面设计者可以在不更改代码的情况下来改变应用程序的用户界面,同时程序员可以改变“back-end”Java代码而不必管HTML文件。

这个命令行工具从一个 HTML 输入文件中产生一个 Java 类。应用程序可以运行时使用这个 Java 类改变内容或任何标签的 ID 属性或 CLASS 属性。使用XMLC的例子请见“指南:建立 Enhydra 应用程序”

动态的重编译
XMLC 动态的重编译让你在应用程序运行时改变 HTML 的版面而不需要重新启动应用程序。鉴于这个特点,我们可以对静态内容的 HTML 页面作任何改动。应用程序会自动的收集这些改动。 只要你不是添加或改变页面标记的任何ID和CLASS属性,你就不必重建和重新运行应用程序。

数据对象设计工作台(DODS)

图3.4所示的数据对象设计工作台(DODS),是一个图形化的工具,你可以使用它来定义的你的数据模型。

图 3.4    DODS 图形用户界面

[Picture]

DODS 数据模型的数据对象是与数据库中表格中的内容相对应的。每个数据对象拥有描述数据库列的属性和其他数据库对象的参考属性。参考属性能让你建立数据库对象的层次(如多对一或多对多的关系)。

一旦你定义了你的数据模型,DODS 将产生执行它所用到的所有代码。例如:

对于每一个数据对象,DODS 将产生一系列源文件。例如,如果你的数据模型包括一个名为“thing”的实体的定义,DODS将会产生以下内容:

    该类为每一个属性提供了“set”和“get”方法,提供了处理缓存的方法,同时它还是Enhydra 框架中 GenericDO 类的子类。在这个例子中,这个类被命名为 ThingDO

    询问类返回 ThingDO 对象的集合。这些对象描述了表格中的行与应用程序匹配的标准。

当 DODS 产生源代码时,它将创建你所设计的包的层次的目录结构。DODS在每个目录中生成了一个 make 文件,运行这个 make 文件将会生成源代码。剩下你所要做的是使用 SQL 文件来建立数据库,添加应用程序的更多感兴趣的组成部分。

使用DODS 的实例,请参见“DODS的使用”

Kelp 工具

Kelp 工具可以让你在 Borland JBuilder 或 Oracle JDeveloper 集成开发环境下(IDEs) 开发 Enhydra 应用程序。

注意:You 你可以使用 Kelp来代替Enhydra 运行环境的原本和 make 文件。

图 3.5 展示了Kelp的大体轮廓,它具有依赖于IDE的特性。请见开发向导第四章 “Enhydra Kelp 的使用” 中的文件,它们包括了Java IDE 支持 Kelp 工具的详细特性。

图 3.5    使用 Kelp 产生的 JBuilder 工程

[Picture]

Enhydra 应用程序向导
集成 Kelp 的 Enhydra 应用程序向导产生 Enhydra 应用程序,你可以在 IDE 中开发、运行和调试它。该向导还可以让你调整你的新应用程序的名称,目录和包。它产生的文件将在“创建你的第一个应用程序”中讲述。它还能产生建立和运行新应用程序步骤的 Readme.html 文件。

XMLC 编译向导
编译向导ompiler wizard 让你设置XMLC的选项,选择要编译的 HTML 文件和从 JBuilder 中调用XMLC 编译器。

向导还提供了一个纪录包名字目录的映射表。当你在一个目录中保存你的 HTML 文件而与你希望使用到的 DOM 类的包种子不相符时,这个表是很有用的。例如 DiscRack 实例工程中的 resources 目录下的HTML文件编译时不需要使用表现包。

XMLC 特性记录
特性纪录 会让你完全控制如何使用 XMLC 从 HYML 文件中建立一个 DOM 类。特性纪录可以让你为整个工程定制类名称和设置XMLC选项,同时对个别HTML文件也适用。

例如, DiscRack 实例包括三个 XMLC 选项的文件:一个表现包的和两个表现包中更多包的。你可以使用 XMLC 特性纪录来定位 resource 目录中的同 presentation 目录中的XMLC选项文件对应的每个 HTML 文件。

Enhydra 实例工程
Enhydra 实例工程是一个IDE工程文件,你可以使用它在 IDE 中创建、调试和运行的你的应用程序。这个工程还示范了如何使用 XMLC 来执行产生几个动态页面的任务。当你运行这个Enhydra实例工程时,页面将会出现HTML标记和执行每个任务所需要的 Java 方法。