级别: 中级 Tamer Nassar, 软件工程师, IBM Murali Vridhachalam, IT 架构师, IBM
2009 年 8 月 13 日 本文是系列文章中的第二部分,这个系列文章探究了 IBM® DB2 9 的 XML 功能,并借助从数据库以原生 XML 格式检索 Lotus Form 文档并将其嵌入在 Java™ Server Page(JSP)来将这些功能与 IBM Lotus® Forms 相集成。
本系列的第一篇文章 “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 表内没有任何订单,可以进行如下的操作:
- 解压缩 DBExport.zip 文件(此文件在本文的下载部分可以找到)。
- 将 DBExport 文件夹放入 C:\ 驱动器。
- 运行导入命令,用几个订单填充此表。
要导入此文件,可以从 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 表
此项目使用 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 项目(只在系列文章的本部分中涉及),请遵循如下步骤:
- 右键单击 SaveReadFormApp 文件夹中的 index.html。
- 选择 Run As - Run on Server。在所显示的 index.html 页面内,可以看到一个链接,即 Go to orders list。
要运行集成的这个 SaveReadFormApp 项目(在系列文章的第 1 和第 2 部分均有论及),请遵照如下步骤:
- 右键单击 index.html。
- 选择 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 页面
当单击 Create new order - lotus form embedded in jsp page 时,PurchaseOrder.jsp 就会显示嵌入在 JSP 页面内的这个 Lotus Forms 文档 PurchaseOrder.xfdl,如图 3 所示。
图 3. 嵌入在 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.zip | 11.4KB | HTTP | | ReadFormAppPI.zip | 16.7KB | HTTP | | SaveReadFormAppPI.zip.zip | 34.3KB | HTTP |
参考资料
作者简介  | 
|  | Tamer Nassar 是 IBM CIO 办公室的一名软件工程师,自 2000 年就一直在 IBM 工作。他参与过很多不同的项目,用各种技术设计、实现和测试过大量端到端的企业解决方案。他感兴趣并擅长的领域包括 SOA、IT 架构和方法学、WebSphere Application Server、WebSphere Process Server、WebSphere MQ 和 WebSphere Message Broker。 |
 | 
|  | Murali Vridhachalam 是一名通过了 Open Group 认证的 IT 架构师,自 2005 年早期就开始接触 XBRL。他曾在 IBM 首次通过 XBRL 提交财务报表时担任过主管架构师,这是 SEC 的 XBRL 自主文件项目的一部分。他目前感兴趣的领域包括 SOA 和使用 IBM 企业软件组合构建起来的 Software as a Service 功能。 |
对本文的评价
|