当前位置: 首页 > 图灵资讯 > 技术篇> Servlet 和 XML

Servlet 和 XML

来源:图灵教育
时间:2024-02-28 17:14:16

对 Java 对程序员来说,Servlet 和 XML 这两种技术是最令人兴奋的。本文是为 2000 年 2 月 17 日旧金山 City Java 用户组准备的演示文稿。你将在这篇文章中看到如何使用它? servlet 组成一个简单的 XML 构建一个文档 DOM 树,并在用户屏幕上显示部分内容,最后您将看到如何从数据库查询生成 XML。

我们将扩展本文讨论的示例 HTTPServlet 类。HTTPServlet 类别提供通常和 CGI 与程序相关的功能。它支持 put 和 get,并使您的代码正确 HTTP 要求标头的完全访问权,包括 UserAgent 域。我们将创造一些简单的东西 servlet,并说明它们是如何处理的 XML 标签标记的信息。在此过程中,我们还将解释文档对象模型 (DOM) 一些方法。这些简单的应用程序会让你知道 servlet 和 XML 当你们在一起时,你们能做些什么?

第一个 servlet 示例 作为一个开始,我们将编写一个来生成 XML 文档的 10 行 servlet。在构建理解 XML 的 servlet 我们将遵循以下三个步骤:

设置内容类型 text/xml。 创建 XML 文档。 将 XML 将文件写回客户机。

我们大多数人 Servlet 第二步主要集中在精力上。我们可以根据数据库查询创建一个。 XML 也可以基于从客户传输的文档 HTTP 参数可以生成,也可以使用其他类型的数据检索或生成方法。本文的示例将主要考虑 HTTP 查询参数和数据库。

一个基本的 servlet 对于第一个例子,第二步是“创建” XML “文件”并非我们所关心的;我们只是想生成一个有效的文件 XML 文档。我们已经将文档硬编码到源代码中,如清单 1 所示。

彩色编码 彩色编码清单是本文的一个特点,我们正在 dW 进行试验。我正在使用一些开源代码工具来生成我们的彩色代码清单。首先,我将文档(Java、HTML、XML 等)载入 Emacs 中。Emacs 定义了关键字、注释、函数名和其他编程语言组件的颜色(大约十种)。在 Emacs 加入文件并添加颜色后,我使用它 HTMLize 程序包,这是一种曾经流行的用途 Emacs Lisp 语言编写的开源代码实用工具。HTMLize 接收一个清单(这个清单看起来和 Emacs 完全相同),然后将其转换为 HTML。结果将是一个完全彩色编码的文件,突出显示关键字、注释、函数名等。

请拆除我们您对这些新的、改进的代码清单的想法。

如果您也想这样做,请参考参考资料中的相应链接。

清单 1. xmlfromscratch.java

public class xmlfromscratch extends HttpServlet { public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/xml"); PrintWriter out = response.getWriter(); out.println("<?xml version=\"1.0\"?xml version=\"1.0\"?>"); out.println("<greeting language=\"en_US\">"); out.println(" Hello, World!"); out.println("</greeting>"); } }

这个令人兴奋的代码生成的结果如下:

清单 2. xmlfromscratch.java 的结果

<?xml version="1.0"?> <greeting> Hello, World! </greeting>

您可以查看完整的清单 HTML 视图或直接查看 Java 源文件。

生成 XML 段 现在,我们已经创造了一个 servlet,它通过硬编码生成一个毫无意义的简单 XML 文档。在下一个 servlet 我们从零开始生成一个 DOM 树,然后将 DOM 树的一部分显示在请求者的屏幕上。发送回请求者的 DOM 这部分取决于树 servlet 接收到的 HTTP 参数。本例展示了几项有用的技术:使用 HTTP 参数控制 DOM 没有树木的处理和生成,就不需要树木的处理和生成 XML 源文档。

清单 3 显示了处理 HTTP 参数代码段:

清单 3. xmlfromdom.java

public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/xml"); PrintWriter out = response.getWriter(); Enumeration keys; String key; String requestedSubtree = ""; keys = request.getParameterNames(); while (keys.hasMoreElements()) { key = (String) keys.nextElement(); if (key.equalsIgnoreCase("subtree")) requestedSubtree = request.getParameter(key); }

正如上一个例子所示,我们将内容类型设置为 text/xml。之后,我们使用它 HttpServletRequest.getParameterNames 方法从 HTTP 在请求中检索所有参数。

处理完这些参数后,我们需要找到用户要求的信息。我们使用的信息是从对象中构建的 DOM 树;该 DOM 这棵树包含了莎士比亚十四行诗的文本,以及关于这首十四行诗的其他信息。我们将根据 HTTP subtree 参数返回 DOM 树的一部分。清单 4 显示了构建 DOM 树的部分代码:

清单 4. 构建 DOM 树

Document doc = null; Element author = null; Element lines = null; Element title = null; public void initialize() { doc = (Document)Class. forName("org.apache.xerces.dom.DocumentImpl"). newInstance(); if (doc != null) { Element root = doc.createElement("sonnet"); root.setAttribute("type", "Shakespearean"); author = doc.createElement("author"); Element lastName = doc.createElement("last-name"); lastName.appendChild(doc.createTextNode("Shakespeare")); author.appendChild(lastName);

我们创造了一个 Java 这类实例,这类实现了 DOM Document 接口,然后我们要求节点为我们创建各种节点。通过分析,你可以很容易地重写这个应用程序 XML 文件生成 DOM 树。为了简化这个例子(并减少我的工作量),我们定义了一些例子变量来保存为它提供服务的节点值。这些值在类声明的顶部发表声明 initialize 初始化的方法。

最后一步是要求 DOM 树部分发送给用户。我们使用递归法来实现这一任务,printDOMTree,它处理节点及其所有子节点。因为这种方法是递归的,我们是从文档根节点还是从文档根节点 DOM 树的其它节点开始并不重要。如果我们要求的是我们知道的节点,我们可以将节点传递给方法 printDOMTree。否则,我们可以传递 Document 节点。清单 5 显示此步骤。

清单 5. printDOMTree

if (requestedSubtree.equalsIgnoreCase("author")) printDOMTree(author, out); else if (requestedSubtree.equalsIgnoreCase("lines")) printDOMTree(lines, out); else if (requestedSubtree.equalsIgnoreCase("title")) printDOMTree(title, out); else printDOMTree(doc, out);

如果 subtree 参数是 author,则结果是:

<author> <last-name>Shakespeare</last-name> <first-name>William</first-name> <nationality>British</nationality> <year-of-birth>1564</year-of-birth> <year-of-death>1616</year-of-death> </author>

如果 subtree 参数是 title,则结果是:

<title>Sonnet 130</title>

您可以查看完整的清单 HTML 视图或直接查看 Java 源文件。

与数据库对接 我们的最后一个例子是根据数据库查询生成的 XML。有很多方法可以做到这一点(请参考) developerWorks 的文章 Generating XML from a Data Store);我们将使用这个例子 IBM 的 XML Extender for DB2(请参考参考资料)。这个免费产品可以让你在那里 DB2 中存储 XML 文档。我们的查询来自 DB2 提取这些文档,然后将其传输给用户。

如果您使用 Oracle 8i 代替 DB2,你会发现它自称具有类似的功能(请参考参考资料)。不理解 XML 您可以将数据库 XML 文档存储为字符大对象 (CLOB),并以文本块的形式检索文档。

但是,在安装数据库后,您需要完成以下三件事来使代码工作:

首先,将 DbOwner、DbUserid 和 DbPasswd 变量改为适合系统的适当值。

////////////////////////////////////////////////////////////// // 必须正确更改这三个字符串,否则 // // servlet 不会工作。 // ////////////////////////////////////////////////////////////// DbUserid = "xxxxxxxx"; DbPasswd = "xxxxxxxx"; DbOwner = "xxxxxxxx"; 下一步,使用适合您的系统 JDBC 我们正在使用驱动程序。 DB2。

static String JDBCDriver = "COM.ibm.db2.jdbc.app.DB2Driver"; ... try { Class.forName("COM.ibm.db2.jdbc.app.DB2Driver").newInstance(); } catch (Exception e) { System.out.println("Can't get the driver!"); e.printStackTrace(); } 如果你愿意,你可以改掉下面的 SQL 查询语句。"); e.printStackTrace(); } 如果你愿意,你可以改掉下面的 SQL 查询句子。为了简化示例,这里只检索 sales_order_view 表的 order 列中的全部 XML 文档。

// 我们在这里是对的 SQL 语句硬编码;如果用户输入 // 限制查询,情况会更加复杂。 String query = "select order from " + DbOwner + ".sales_order_view";

在 service 方法,我们的 servlet 连接 执行一组DB2查询(结果是一组 XML 文档),分析查询结果,并将分析数据写入输出流。列表 6 显示与此关系最密切的代码部分:

清单 6. xmlfromdb2.java

// 我们在这里是对的 SQL 语句硬编码;如果用户输入 // 限制查询,情况会更加复杂。 String query = "select order from " + DbOwner + ".sales_order_view"; res.setContentType("text/xml"); try { ConInfo index = new ConInfo(); Connection con = getCon(index); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(query); ... // 显示结果集。我们从每一行中取出 XML 文档, // 分析,然后打印 DOM 树。我们从每一行中取出 XML 文档, // 分析,然后打印 DOM 树。当没有更多的行时,rs.next() 返回 // false。 while (rs.next()) { String nextOrder = rs.getString(1).trim(); Document doc = null; StringReader sr = new StringReader(nextOrder); InputSource iSrc = new InputSource(sr); try { parser.parse(iSrc); doc = parser.getDocument(); } catch (Exception e) { System.err.println("Sorry, an error occurred: " + e); } if (doc != null) printDOMTree(doc, out); }

要了解所有细节,您可以查看完整的清单 HTML 或直接查看Java 源文件。

小结 尽管这些 servlet 例子中没有一个能改变世界,但它们确实显示出来了 XML 和 servlet 合作有多好。Servlet 这是一种伟大的向客户发送内容的机制, XML 是发送结构化数据的完美机制。你也可以用 servlet 在服务器上处理 XML 并将其内容发送给客户机。最重要的是,这两种技术都是跨平台技术,可以给您的应用程序带来更大的灵活性和可移动性。