IBM Lotus Forms 3.0.1 与 IBM DB2 9 的集成,第 2 部分

在 Lotus Forms 解决方案中充分利用 DB2 9 的 XML 功能

本文是系列文章中的第二部分,这个系列文章探究了 IBM® DB2 9 的 XML 功能,并借助从数据库以原生 XML 格式检索 Lotus Form 文档并将其嵌入在 Java™ Server Page(JSP)来将这些功能与 IBM Lotus® Forms 相集成。

Tamer Nassar, 软件工程师, EMC

Tamer Nassar Tamer Nassar 是 IBM CIO 办公室的一名软件工程师,自 2000 年就一直在 IBM 工作。他参与过很多不同的项目,用各种技术设计、实现和测试过大量端到端的企业解决方案。他感兴趣并擅长的领域包括 SOA、IT 架构和方法学、WebSphere Application Server、WebSphere Process Server、WebSphere MQ 和 WebSphere Message Broker。



Murali Vridhachalam, IT 架构师, EMC

Murali Vridhachalam 的照片Murali Vridhachalam 是一名通过了 Open Group 认证的 IT 架构师,自 2005 年早期就开始接触 XBRL。他曾在 IBM 首次通过 XBRL 提交财务报表时担任过主管架构师,这是 SEC 的 XBRL 自主文件项目的一部分。他目前感兴趣的领域包括 SOA 和使用 IBM 企业软件组合构建起来的 Software as a Service 功能。



2009 年 8 月 13 日

本系列的第一篇文章 “IBM Workplace Forms V2.6 与 IBM DB2 V9 集成” 向您展示了如何向一个表单添加提交按钮,如何实现一个 servlet 来在 DB2 9 中保存表单(及其基于 XML 的数据实例),如何使用 DB2 9 控制中心来验证表单数据是否已成功存储。在本文中,您将了解如何从数据库检索这些保存了的表单并将它们嵌入到 JSP,以在 Web 应用程序中保持同样的页面风格。

而且,您还可以下载第 2 部分的这个项目并将其与第 1 部分的项目相集成,以便可以以其原生格式从数据库读写 Lotus Form 文件。本文的下载部分包含了如下的归档文件:

  • DBExport.zip 包含了用 Lotus Forms 文档填充此表所需的 DB2 信息。
  • ReadFormAppPI.zip 包含本文的项目交换,这是您所需要的,以便能够在 DB2 中读取 Lotus Forms 文档并将它们嵌入在 JSP 页面内进行显示。
  • SaveReadFormAppPI.zip 包含本文与本系列的 第 1 部分 集成后的项目交换。此文件允许您在 DB2 中读写 Lotus Forms 文档并将它们嵌入在 JSP 页面内进行显示。

先决条件

本文假设您对 XML、DB2、Lotus Forms 和 Web 应用程序比较熟悉,并且完成了第 1 部分中所要求的所有集成。

如果在 acme.orders 表内没有任何订单,可以进行如下的操作:

  1. 解压缩 DBExport.zip 文件(此文件在本文的下载部分可以找到)。
  2. 将 DBExport 文件夹放入 C:\ 驱动器。
  3. 运行导入命令,用几个订单填充此表。

要导入此文件,可以从 DB2 命令行窗口运行如下命令:

CONNECT TO ORDERSDB;
IMPORT FROM "C:\DBExport\Out.ixf" OF IXF METHOD N (CUSTOMERNUM, CUSTOMERNAME,
ORDERDETAIL, ORDERFORM) MESSAGES "C:\DBExport\Msg.txt" INSERT INTO ACME.ORDERS
(CUSTOMERNUM, CUSTOMERNAME, ORDERDETAIL, ORDERFORM);
CONNECT RESET;

运行了这些命令后,应该能够看到 ACME.ORDERS 表内的订单,如图 1 所示。如果数据被正确导入,就可以删除 C:\DBExport 文件夹。

图 1. ACME.ORDERS 表
ACME.ORDERS 表

此项目使用 IBM WebSphere® Integration Developer 6.1、Lotus Forms 3.0.1 和 DB2 9.1 创建。


检索 Lotus Form 文档

在 DataHandler 类,请注意 getLotusForm(int intID) 方法,如清单 1 所示,此方法传递用户想要检索的 ordered/formid。

清单 1. getLotusForm(int intID) 方法
public String getLotusForm(int intID) throws Exception {

	// build the SQL query to get all the orders from the database
	String sqlQuery = "SELECT ORDERFORM FROM ACME.ORDERS where  ID = " + intID;

	System.out.println("sqlQuery: " + sqlQuery);
	FormDAO formDAO = new FormDAO();
	String strLotusForm = formDAO.getLotusFormFromDB2(sqlQuery);
	return strLotusForm;
}

同样地,在 FormDAO 类,使用 getLotusFormFromDB2() 方法,可以建立与数据库的连接并从 ACME.ORDERS 表内的 ORDERFORM 列检索所存储的整个 Lotus Forms 文档。

此后,可以将结果保存在一个以 XML 格式表示这个 Lotus Forms 文档的字符串内并将其传递回 servlet。

此外,还需要确保 XML 表单被正确格式化并进行了 UTF-8 编码。

在如清单 2 所示的代码内,我们检查并清理了 XML,确保编码全部为 UTF-8。

清单 2. XML 格式的 Lotus Forms 文档
public String getLotusFormFromDB2(String sqlQuery) throws ServletException, SQLException {
	 
	Statement stmt;
	ResultSet rs = null;
	Connection conn = null;

	String result = "";

	try {
		// open the connection
		DBController dbCon = new DBController();
		conn = dbCon.getConnection();

		// execute query
		stmt = conn.createStatement(); // Create a Statement object
		rs = stmt.executeQuery(sqlQuery);

		// read result as string
		result = "";
		try {
			rs.next();
			result = rs.getString(1); // Retrieve
			rs.close(); // Close the ResultSet
			stmt.close();
		} catch (SQLException e2) {
			System.out.println("No results: " + sqlQuery);
			result = "";
		}
	} catch (SQLException e) {
		e.printStackTrace();
		result = e.toString();

		// Re-throw Exception as ServletException.
		throw new ServletException("Error in getLotusFormFromDB2 method. Error
                                              message: " + e.getMessage());
	} catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} finally {
		// always disconnect
		conn.close();
	}
	return result;
}

在 JSP 内嵌入这个 Lotus Forms 文档

可以将这个 Lotus Forms 文档作为要在 JSP 页面内显示的属性传递给 JSP:

request.setAttribute("LotusForm", xmlData);
request.getRequestDispatcher("displayLotusForm.jsp").forward(request, response);

另外一种方式(我们在例子中并未使用)是允许使用 servlet 内的 PrintWriter 打印嵌入在此页面内的表单。参见清单 3。

清单 3. PrintWriter 代码片段
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
String htmlHeader = "<HTML><BODY><OBJECT id=\"Object1\" 
height=\"900\" width=\"900\"   classid=\"CLSID:354913B2-7190-49C0-944B-1507C9125367\">
<PARAM name=\"XFDLID\" value=\"XFDLData\"><PARAM name=\"detach_id\" 
value=\"2507088000\"><PARAM name=\"retain_Viewer\" VALUE=\"on\">
<PARAM NAME=\"refresh_url\" value=\"envAware.html\"><PARAM NAME=\"TTL\" 
VALUE=\"17\"></OBJECT> <SCRIPT language=\"XFDL\" id=\"XFDLData\" 
type=\"application/vnd.xfdl; wrapped=comment\"> <!-- ";
String htmlFooter = " --> </SCRIPT><P>Return to 
<A href=\"simpleHTML.html\">Form</A></P></BODY></HTML>";
htmlData = htmlHeader +xmlData+htmlFooter ;
System.out.println(htmlData);
out.println(htmlData);
out.close();

在 displayLotusForm.jsp 内,必须读取这个 Lotus Forms 属性并将其嵌入在 JSP 内,如清单 4 所示。此外,还可以基于表单的大小修改这个对象的大小。

清单 4. 在 JSP 内嵌入 Lotus Forms 属性
<%
	String LotusForm = (String) request.getAttribute("LotusForm");
	 
%>

<CENTER>
<TABLE border="0" cellpadding="2" width="100%">
  <TBODY>
  <TR>
  <TD><SCRIPT language="XFDL" id="XFDLData" 
  type="application/vnd.xfdl; wrapped=comment"> 
                       
	<!-- 
	<%=LotusForm %>
	--> 

	</SCRIPT> 
		 <OBJECT id="IBMLotusForm" height="700" width="85%" border="0"
		vspace="10" hspace="10" style="font-family:Helvetica"
		classid="CLSID:354913B2-7190-49C0-944B-1507C9125367">
		<PARAM NAME="XFDLID" VALUE="XFDLData">
		    <!--[if !IE]>--> 
            <OBJECT id="IBMLotusForm" height="700" width="85%"
			border="0" vspace="10" hspace="10" style="font-family:Helvetica"
			type="application/vnd.xfdl">
			<PARAM name="XFDLID" value="XFDLData">
			</OBJECT> 
                <!--<![endif]--> 
                </OBJECT>
             </TD>

		</TR>
	</TBODY>
</TABLE>

可以将 XFDL 文件本身包括在 JSP 页面内以便保留导航按钮、页眉和页脚。需要将其作为一个 include 添加,如清单 5 中的 PurchaseOrder.jsp 代码片段所示。

清单 5. PurchaseOrder.jsp 代码片段
<TD>
<SCRIPT language="XFDL" id="XFDLData" type="application/vnd.xfdl; wrapped=comment"> 
<!--
<jsp:include page='PurchaseOrder.xfdl'/>
-->
	</SCRIPT> 
	<OBJECT id="IBMLotusForm" height="700" width="85%" border="0"
		vspace="10" hspace="10" style="font-family:Helvetica"
		classid="CLSID:354913B2-7190-49C0-944B-1507C9125367">
		<PARAM NAME="XFDLID" VALUE="XFDLData">
		<!--[if !IE]>--> 
	       <OBJECT id="IBMLotusForm" height="700" width="85%"
		border="0" vspace="10" hspace="10" style="font-family:Helvetica"
				type="application/vnd.xfdl">
				<PARAM NAME="XFDLID" VALUE="XFDLData">
		   </OBJECT> 
		<!--<![endif]--> 
	</OBJECT>
</TD>

在服务器上运行

要运行这个 ReadFormApp 项目(只在系列文章的本部分中涉及),请遵循如下步骤:

  1. 右键单击 SaveReadFormApp 文件夹中的 index.html。
  2. 选择 Run As - Run on Server。在所显示的 index.html 页面内,可以看到一个链接,即 Go to orders list。

要运行集成的这个 SaveReadFormApp 项目(在系列文章的第 1 和第 2 部分均有论及),请遵照如下步骤:

  1. 右键单击 index.html。
  2. 选择 Run on Server。在所显示的 index.html 页面内,可以看到如下三个链接,如图 2 所示:
    • Create new order - lotus form embedded in jsp page
    • Create new order
    • Go to orders list
图 2. index.html 页面
index.html 页面

当单击 Create new order - lotus form embedded in jsp page 时,PurchaseOrder.jsp 就会显示嵌入在 JSP 页面内的这个 Lotus Forms 文档 PurchaseOrder.xfdl,如图 3 所示。

图 3. 嵌入在 JSP 页面内的 PurchaseOrder.xfdl
嵌入在 JSP 页面内的 PurchaseOrder.xfdl

当在服务器上运行 PurchaseOrder.xfdl 文档时,可以得到与 servlet 名称相同的 URL,这是一个优点。这意味着无需更改 Lotus Forms URL 内的服务器名或端口号就可以在服务器上安装此项目。


技巧

在集成 Lotus Forms 和 DB2 9 时,请牢记如下的一些技巧:

  • 如果 XFDL 文件作为 XML 打开,并且已经安装了 Lotus Forms 阅读器,可以通过选择 Environment - Virtual Hosts - default host - MIME-Types 进入管理控制台。请确保为扩展名 xfdl 和 xfd 选择了 MIME-Type application/vnd.xfdl。否则,请添加这些值后重启此服务器。
  • 如果 XFDL 文件没能在 Mozilla Firefox 中打开,请确保在嵌入这个 XFDL 时,定义了正确的对象。
  • 如果右键单击此文件后,没有看到 Run on Server 这一选项,请选择 Windows - Preferences。然后选择 General - Capabilities - Development。选择 Advanced,然后选择 Miscellaneous Eclipse Functionality 这一选项。

结束语

在本文中,您了解了如何从 DB2 数据库中,以基于 XML 的数据实例结构的格式检索 Lotus Forms 文档;您通过从 XML 字段检索数据实现了这个目的。此外,您还掌握了如何将所检索到的 Lotus Forms 文档嵌入到 JSP 页面内,以便 Web 应用程序的外观能够保持一致。最后,您还知道了如何打开 JSP 页面内的 XFDL 文件,并让表单提交独立于服务器名和端口号。通过以 XML 格式向此数据库读写这个 Lotus Forms 文档,我们就能够将自己的逻辑设计为具有通用性,并能将任何 Lotus Forms 文档保存到 DB2 9。


下载

描述名字大小
DBExport.zip11.4KB
ReadFormAppPI.zip16.7KB
SaveReadFormAppPI.zip.zip34.3KB

参考资料

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Lotus, Information Management
ArticleID=419150
ArticleTitle=IBM Lotus Forms 3.0.1 与 IBM DB2 9 的集成,第 2 部分
publish-date=08132009