IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope: Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  Lotus  >

为 Domino 构建 JSR 168 门户应用程序

developerWorks
文档选项

未显示需要 JavaScript 的文档选项

样例代码


级别: 高级

Raj Balasubramanian, IT 架构顾问, IBM

2006 年 1 月 04 日

在以前的一篇文章中,我们描述了如何创建一个 DXL 框架,从而通过 Web 操作 Lotus Domino 数据库。现在,我们将注意力转移到如何构建 JSR 168 门户应用程序来作为 Domino 数据库的前端。

在 developerWorks Lotus 文章 “访问 Notes/Domino 数据的定制 DXL 框架” 中,我们研究了三个简单的代理如何创建一个 DXL 框架,用来通过 Web 查看、创建和更新 Domino 数据库。在本文中,我们研究如何构建 JSR 168 门户应用程序来作为 Domino 数据库的前端。

本文假设您是有经验的 Domino 和 Web 开发人员,并读过以前的 DXL 框架文章。

JSR 168 portlet

本文中讨论的示例的用户界面是一组 JSR 168 portlet,它们提供了访问 Domino 应用程序的前端。为了正确地利用本文中的代码,我们将使用最佳设计实践来构建实用程序/数据访问类。本文介绍几个基于 JSR 168 的 portlet,这些 portlet 将利用以后一篇文章中将要讨论的数据访问类。设计这些类的方式使得它们不依赖于前端设计或平台。因此,在以后的文章中将在 Rich Application 设计中使用同样的类。同样,我们也可以很容易地使用这些类来访问任何 Domino 应用程序。

图 1 在系统级说明了本文中讨论的各种组件和交互。


图 1. 组件和交互
组件和交互

用户通常通过 Web 浏览器访问这个应用程序。这个应用程序是一个基于 JSR 168 的 portlet,它驻留在运行 Jetspeed 2 portlet 容器的 Tomcat 5.0.30 上。后端 Domino 服务器运行 6.5.1 版本,并容纳目标 Domino 应用程序(dxlnab.nsf),这是一个具有定制的 DXL 代理的 Domino Directory。(关于代理的细节请参见文章 “访问 Notes/Domino 数据的定制 DXL 框架”。)

前端

我们先看看前端。下面的图展示了最终应用程序的各种状态,这个应用程序使用添加的三个定制代理来访问 Domino Directory。对于本文,我们只从后端文档公开关键的字段(First Name、Last Name 和 Full Name)。以后将讨论如何添加更多的字段。

图 2 展示应用程序界面的初始屏幕。


图 2. 初始屏幕
初始屏幕

可以点击 DXL Notes View portlet 中列出的文档来查看文档的细节(见图 3)。


图 3. 文档细节
文档细节

当点击 “create” 按钮时,会出现图 4 所示的屏幕。


图 4. Create Document 屏幕
Create Document 屏幕

当点击 “edit” 按钮时,会看到图 5:


图 5. Edit 屏幕
Edit 屏幕

应用程序操作的基本流程如下:

  1. 进入有两个 portlet 的页面,即 View portlet 和 Doc portlet。View portlet 显示来自后端 Domino Directory 的 10 行视图数据。Previous 和 Next 按钮帮助进行视图导航。
  2. 然后可以点击每个视图项中的箭头(->)链接来查看文档的更多细节。(在我们的示例中,只显示几个字段,但是对于可以显示哪些字段并没有限制。)
  3. 然后可以选择编辑当前文档或者创建新文档。
  4. 如果选择编辑当前文档,会提供给定字段的编辑框(见图 5)。在这里,可以进行修改并且保存,修改会立即反映在 View portlet 中。还可以取消修改。
  5. 如果选择创建新文档,那么在 Doc portlet 中出现 Create Document 屏幕(图 4)。在这里,可以输入新的名/姓和全名,并保存新项目。View portlet 将更新以反映这一修改。同样,也可以取消修改。

关于 portlet 开发的说明

为了适合更广泛的读者,在本文中我们使用纯 Eclipse 构建 portlet 应用程序,而不使用更高级的工具,比如 Rational Application Developer。使用 Xdoclet 和 Maven 作为构建和部署工具。我们还在 Apache Jetspeed Portal 2 上部署和测试了这个应用程序。





回页首


portlet 设计

这两个基于 JSR 168 的 portlet 根据状态和用户执行的操作利用 doView 方法来显示各种 JSP 文档。在对应的 portlet 的 processAction 方法中捕获操作。然后,根据 processAction 中设置/处理的操作显示 JSP 文档(作为 doView 的一部分)。图 6 是应用程序的 JSP/基于状态的流程图。


图 6. JSP/基于状态的流程图
JSP/基于状态的流程图

这两个 portlet 使用 PortletSession 进行通信(更多信息参见 JSR 168 FAQ 页面)。View portlet 将文档对象设置在 PortletSession 中的变量中,这个变量具有应用程序级范围(PortletSession.APPLICATION_SCOPE)。Doc portlet 在显示时寻找这个变量,如果这个变量存在,那么显示文档。如果这个变量不存在,portlet 就显示一个普通消息。

portlet 本身是用 Facade(外观)和 Value Object(值对象)模式设计的。这两个 portlet 中的 portlet 类作为控制器,它将所有服务工作委派给一个外观。外观根据执行的操作返回或使用适当的值对象。portlet 的所有视图都是使用 JSP 构建的。这种设计使我们不必考虑后端中以后可能出现的修改,如果后端改变了,那么只需重新编写外观。图 7 是类图,说明了各个类及其交互。


图 7. 类和交互
类和交互

dxlobj 和 dxldao 包是为本文设计的通用数据访问类。可以使用它们访问 Team Room 或定制的 NSF 应用程序。这些 Data Access Object(DAO)按照通用方式设计,不依赖于后端应用程序的具体细节。

这两个 portlet,View(raj.portlets.DXLView)和 Doc(raj.portlets.DXLDoc),依靠外观(raj.facade.NABFront)来执行访问后端 Domino 应用程序的所有工作。这些 portlet 的设计是与应用程序相关的,因为视图与它显示的应用程序数据相关。外观为 View portlet 返回一个 people 值对象(raj.vo.People),或者为 Doc portlet 返回一个 person 值对象(raj.vo.Person)。外观还接收一个 person 值对象以便在后端中更新或创建 person 项。这两个值对象包含一些属性,这些属性与后端 Domino 文档中的字段相关。例如,raj.vo.Person 中的 fname 属性与后端 Domino 数据库中 Person 表单中的 FirstName 字段对应。前面说过,对于本文,只从后端应用程序公开三个字段。我们将解释如何在创建和编辑模式下在 portlet 的文档视图中公开 Company Name,从而深入讨论类和 portlet 设计。

可以看到,portlet 的设计是与应用程序高度相关的。因此,如果您有一个 Teamroom 数据库并希望这两个 portlet 访问 Domino Teamroom,那么可以建立 Teamroom View 和 Teamroom Doc portlet 以及适当的值对象,这些对象公开后端 Domino 数据库中需要公开的字段(数据)。





回页首


DAO 设计

我们来看看数据访问实用程序的设计。决定实现一个实用程序类来进行数据访问的关键原因是,希望确保可以使用相同的类来连接任何类型的 Domino 数据库。设计是与数据库无关的。这个实用程序还能够支持不同的身份验证类型。当前实现了基本身份验证和基于会话的身份验证(LTPA)。如果需要 SSL 支持,那么可以修改实用程序类来添加这种支持,而视图(就像 MVC 中的视图一样)可以保持不变。

定制的 DXL DAO 类使用来自 Apache Jakarta 项目的 HttpClient 子项目。使用这些类连接 Domino 服务器以收发 DXL 数据。为了进行 XML 解析,要使用 org.xml.sax(用于 SAX 处理)和 javax.xml 包。实际的包可以从本文结尾处的 “下载” 一节下载。“下载” 一节还列出了类的 Java Doc 以供参考。





回页首


将各个部分组合起来

这两个 JSR 168 portlet(raj.portlets.DXLDoc 和 raj.portlets.DXLView)将数据的装载和更新委派给 raj.facade.NABFront 类,这个类又将工作委派给 DAO 实用程序。portlet 本身使用 portlet 上下文获取连接 Domino 数据库所需的运行时参数(名称、视图、身份验证类型、凭证、Domino 服务器和端口,等等)。也可以在应用程序上下文中获取这些运行时参数,从而让 portlet 共享它们。

View portlet

为了进行说明,我们来看看 View portlet(raj.portlets.DXLView)是如何工作的。

  1. 当 portlet 容器装载这个 portlet 时对它进行初始化。初始化包括从 portlet 上下文装载运行时参数。在这个方法中,初始化一个 DAOConfig 对象并从 portlet 上下文填充它。
  2. 当用户访问包含这个 portlet 的页面时,portlet 容器调用这个 portlet 的 doView 方法,这个方法对工人类 NABFront 进行初始化,传递 DAOConfig 对象。View portlet 的 doView 方法调用 NABFront 的 getPeople 方法。
  3. NABFront 对 DXLDAOFactory 进行初始化,并获得一个句柄来获取 DXLViewObject。
  4. DXLDAOFactory 对 ViewXML 进行初始化,并调用 ViewXML 的 process 方法。
  5. ViewXML 中的 process 方法使用 HttpConnect 的 getData 方法从目标 Domino 服务器获取 XML。(DAOConfig 对象拥有访问所需的细节,比如哪个服务器、端口、数据库、视图,等等。)
  6. ViewXML 使用 SAX 解析器处理 XML,创建一个 DXLViewObject 并将其传递给 DXLDAOFactory。
  7. DXLDAOFactory 将 DXLViewObject 传递给 NABFront。
  8. NABFront 从 DXLViewObject 中提取出特定数据,并将局部化的 People 对象传递回 portlet。
  9. portlet 的 doView 方法将 People 对象设置在一个请求属性中,并将请求发送给视图 jsp(page/view.jsp)。
  10. 用户就会在 portlet 中看到视图的显示。

文档细节

现在,我们看看 DXLDoc portlet 如何显示文档细节。

  1. 当 portlet 容器装载这个 portlet 时对它进行初始化。初始化包括从 portlet 上下文装载运行时参数。在这个方法中,初始化一个 DAOConfig 对象并从 portlet 上下文填充它。
  2. 当用户查看 View portlet 中的文档列表并点击一个文档来查看细节时,processAction 方法被触发,这个方法调用已经初始化的 NABFront 的 getPerson 方法,并传递所选文档的 UNID。
  3. NABFront 调用 getDocObject。
  4. DXLDAOFactory 对 DocDXL 进行初始化并调用 parseXML 方法。
  5. DocDXL 中的 parseXML 方法使用 HttpConnect 的 getData 方法从目标 Domino 服务器获取 XML(文档的 DXL)。(DAOConfig 对象拥有访问所需的细节,比如哪个服务器、端口、数据库、视图,等等。)
  6. DocDXL 使用 DOM 解析器处理 XML,创建一个 DXLViewNoteObject 并将其传递给 DXLDAOFactory。
  7. DXLDAOFactory 将 DXLViewNoteObject 传递给 NABFront。
  8. NABFront 从 DXLViewNoteObject 中提取出特定数据并将局部化的 Person 对象传递回 portlet。
  9. View portlet 的 processAction 方法将这个 Person 对象设置在一个 dxlperson 请求参数中。这个属性的范围设置为 APPLICATION_SCOPE。
  10. Doc portlet 的 doView 方法将 People 对象设置在一个请求属性中,并将请求发送给视图 jsp(page/view.jsp),这个 jsp 显示 people 视图。用户就会在 portlet 中看到视图的显示。
  11. doView 方法从 dxlperson 请求属性获取 Person 对象,并将请求发送给视图 jsp(page/viewdoc.jsp)。
  12. 用户就会在 Doc portlet 中看到所选文档的细节。

编辑文档的过程是相似的,但是要使用不同的 URL,并使用 HttpConnect 的 POST 方法保存来自 Doc portlet 的数据。创建文档的操作与编辑操作相似,但是不需要任何来自 View portlet 的信息。这个功能使用的 URL 也不一样。

如果希望显示另一个字段(例如在 Doc portlet 中),步骤如下:

  1. 更新 raj.vo.Person 中的 Person 值对象,添加另一个字段以及相应的 getter/setter。
  2. 修改外观 NABFront 以便用来自后端的值填充字段,这需要将这个字段与 DXL 中适当的项目名称关联起来。
  3. 修改门户应用程序中的 viewdoc.jsp,从而在 JSP 页面上显示来自 Person 对象的适当值。





回页首


结束语

在本文中,我们讨论了如何利用 “A custom DXL framework for accessing Notes/Domino data” 中描述的定制 DXL 框架来构建一个访问 Domino Directory 的 JSR 168 portlet 应用程序。在基于 Java 的平台上,访问方法的核心是使用本文中介绍的 Data Access Object(DAO)。在以后的一篇文章中,我们将进一步讨论 DAO,并描述一个基于 Eclipse 的富客户机 Linux 应用程序如何访问同一个 Domino Directory。






回页首


下载

描述名字大小下载方法
Sample DXL portletsDXLPortlets.war235KBHTTP
dxlobj.jar filedxlobj.jar16KBHTTP
dxldao.jar filedxldao.jar3KBHTTP
关于下载方法的信息


参考资料



关于作者

Raj Balasubramanian 是 IBM Software Services for Lotus(ISSL)的 IT 架构顾问。他负责与客户洽谈提供应用程序和与基础设施有关的项目。在走访客户、阅读数学书籍之余,他喜欢和他的儿子谈论机器人和新的火星漫游。




对本文的评价










回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款