当前位置: 首页 > 图灵资讯 > 技术篇> XML和JSP的联手

XML和JSP的联手

来源:图灵教育
时间:2024-02-21 09:49:23

  概览:

  XML和JSP是这几天最热门的东西。本文介绍了如何结合这两种技术构建动态网站。您还可以同时查看DOM,XPath,XSL,以及Java-XML技术的其他示例代码。

  假设你已经认识JavaServerver了 Pages(JSP)Extensible Markup Language (XML)。但也许你仍然对如何综合使用它们感到困惑。

  JSP的应用程序很容易。你可以用它来设计网页,看起来像HTML。唯一的区别是JSP是动态执行的。例如,它们可以处理表单form和读写数据库。XML应用程序的描述相对困难。似乎所有的产品都支持它,每个人似乎都用它来实现不同的目的。

  在这篇文章中,你可以看到如何用XML设计一个相当先进的系统。许多网站收集了大量的数据,并以非常标准或非标准的方式显示它们。我将设计一个用XML文件存储在web服务器上的系统,并用JSP显示数据。

  XML vs 关系数据库

  "等一下!“您可能会问,”您是否使用XML文件存储数据?为什么不使用数据库?" 问这个问题很好。我的回答是,使用数据库对许多目的过于浪费。.要使用数据库,您必须安装并支持单独的服务器处理过程(a separate server process),它通常需要administrator来安装和支持它。你必须学习SQL, 并用SQL写下查询,然后转换数据,然后返回。如果您使用XML文件存储数据,则可以减少额外服务器的负载。此外,您还找到了一种简单的编辑数据的方法。不使用复杂的数据库工具,只需使用文本编辑器。很容易备份XML文件,与朋友分享,或下载到您的客户端。同样,您可以通过ftp轻松地将新数据上载到您的网站。

  XML还有一个更抽象的优点,那就是作为层次型的格式比关系型好。 它可以以非常直接的方式设计数据结构来满足您的需求。您不需要使用实体-关系编辑器或图表(schema)标准化。 假如你有一个元素(element)它包含了另一个元素,你可以直接在格式中表示它,而不需要使用表的关联。

  请注意,在许多应用程序中,依赖文件系统是不够的。若更新较多,文件系统将因同时写入而受损。在不损坏的情况下,数据库通常支持事务处理。复杂的查询统计数据要反复及时更新,此时数据库表现非常出色。当然,关系数据库也有很多优点,包括丰富的查询语言、图表工具、可伸缩性、访问控制等。

  (注:您可以使用简单的文件锁定来提供事务处理服务器,您也可以在java中执行一个服务器 XML index-and-search工具,但这已经是另一篇文章的主题了。)

  在以下情况下,就像大多数基于发布信息的中小型网站一样,您可能涉及的大多数数据访问都是阅读而不是写作。虽然数据可能很大,但它们并不经常更新和更改,你也不需要做非常复杂的查询。即使你需要这样做,你也会使用一个独立的查询工具,因此成熟RDBMS的优势消失了,面向对象的数据模型的优点可以体现出来。

  最后,为您的数据库提供SQL查询的查询器外壳,并将其转换为XML stream也是完全可能的。

  所以你可以选择这两种方法之一。XML正成为一种非常强大和方便的编程工具,作为存储和查询成熟数据库的前端工具。(OracleXSQL servlet就是这种技术的一个很好的例子。)

  应用:在线相册

  每个人都喜欢拍照!他们喜欢在度假时展示自己、亲戚、朋友和照片 Web 这是他们展示的好地方。-- 即使是千里之外的亲戚也能看到。我将重点定义一个单独的Picture对象。(这个应用的源代码可以在Resources中获得) 。对象描述了一张照片所需的字段:title,date,可选标题,以及图片来源的指向。

  一个图像需要它自己的字段:源文件( GIF/JPEG)帮助建立定位、宽度和高像素( 标记。 您可以看到一个非常简单的优点,即使用文件系统代替数据库时,您可以将图形文件存储在与数据文件相同的目录中。

  最后,让我们用一个元素来扩展图片记录,它定义了一套缩略图(thumbnail)用于内容表或其他地方。在这里,我使用了与以前定义相同的图片内容。

  XML的一张照片可以说是这样的:

   1999-08-08Trying in vain to get a tanalex-beach.jpg340200alex-beach-sm.jpg7272alex-beach-med.jpg15099

  注意使用XML, 你把一张单独图片的所有信息都放在一个单独的文件中,而不是分散在3-4个表中。我们称之为这个 .pix file

  -- 所以你的文件系统会是这样的:

  summer99//alex-beach.pixsummer99//alex-beach.jpgsummer99//alex-beach-sm.jpgsummer99//alex-beach-med.jpgsummer99//alex-snorkeling.pixetc.

  技术篇

  俗话说,剥猫皮的方法不止一种。同样,在JSP中放置XML数据的方法也不止一种。这里列出了一些方法(事实上,许多其他工具也可以做得同样好)

  DOM: 你可以使用类(classes)调用DOM接口(interface)分析检查XML文件。 XMLEntryList: 您可以使用我的代码将XML加载到name-value pairs 的java.util.List中。

  XPath: 你可以用一个 XPath处理器(如Resin)通过路径名在XML文件中定位元素。

  XSL:您可以使用XSL处理器将XML转换为HTML。

  Cocoon: 您可以使用开放源码的Cocoon framework

  操作自己的bean: 你可以写一个外壳(wrapper class),使用其他技术将数据加载到字定义的Javabean中。

  请注意,这些技术将与您从其他来源获得的XML相结合 stream也执行得很好,比如客户端或者应用服务器。

  JavaServer Pages

  JSP规格有很多替身,不同的JSP产品性能不同,不同的版本也不同。基于以下原因,我选择了Tomcat: 它支持大多数最新的JSP/servlet规范 它受到 Sun和Apache同意 您可以独立运行,而无需配置另一个Web服务器。 它打开源代码

  你可以选择任何你喜欢的JSP引擎,但你必须至少支持JSP 1.0规范。0.91和1.0有很多区别。JSWDK (Java Server Web Development Kit) 也许正好适合要求。

  JSP结构

  创建一个jsp网站 (Webapp), 我喜欢将公共函数、导入、常量和变量声明放入单独的文件initt.jsp中。 然后用 <%@include file="init.jsp"%>加载到每个文件中。 <%@include%> 就像C语言一样 #include, 在编译过程中,include将文本作为一部分加入并一起编译,相对而言, 标记是独立编译文件,然后在文件中嵌入一个调用。

  当JSP启动时,首先要找到的就是找到你想要的XML文件。它是如何知道你想在众多文件中找到哪一个的? 它来自于一个参数,用户将参数添加到调用jsp的URL中: picture.jsp?file=summer99//alex-beach.pix (或通过HTML表单传输文件参数)。 然而,当JSP接受这个参数时,你仍然只完成了一半的工作,因为你必须知道文件系统的根目录在哪里。例如,在Unix系统中,实际文件可能处于这样的路径:

  /home/alex/public_html/pictures/summer99//alex-beach.pix。

  JSP文件在执行状态下没有当前的路径概念。所以你是java.给io包一条绝对的路径。

  Servlet API可以提供将URL路径从相对于当前JSP或Servlet的路径转换为绝对文件系统路径的方法。方法如下:

  ServletContext.getRealPath(String)。

  每个JSP都有一个叫application的JSP Servletcontext对象。所以代码可以是: String picturefile =application.getRealPath("/" + request.getParameter("file"));

  或者 String picturefile =getServletContext().getRealPath("/" + request.getParameter("file"));

  它也可以在servlet中工作。(你必须添加它 / 由于这种方法需要传输request.getPathInfo()结果。)

  这里有一个重要的提示:每当您访问当地资源时,请仔细检查输入数据的合法性。黑客或粗心的用户可能会发送伪造或错误的数据来破坏您的网站。例如,请考虑以下表达式的结果:

  如果输入file=../../../../etc/passwd。这样用户就可以回读到您服务器的password文件!

  DOM (Document Object Model)

  DOM Document代表文档对象模型 Object Model。这是一个由World浏览XML文档的标准API Wide Web Consortium (W3C)发展。 接口在org中.w3c.在dom包中,文档见W3C站点。

  DOM分析工具有很多可用的工具。我选择了 XML4IBMJ。但是你可以使用任何其他DOM分析器。这是因为DOM是一个接口,而不是类别 --所有的DOM分析器(parser)这些接口的对象必须返回同样的处理。

  不幸的是,DOM虽然很标准,但还是有两个缺陷:

  1 虽然API也是面向对象的,但还是挺笨重的。

  DOM 因此,parser没有标准的API, 当每个分析器返回org时.w3c.对于不同的分析器,dom对象、文档对象-分析器的初始化和文件本身的加载通常是特定的。 上面描述的这个简单的图片文件可以在DOM中通过一些对象在树结构中表示如下: Document Node--> Element Node "picture"--> Text Node "\n " (whitespace)--> Element Node "title"--> Text Node "Alex On The Beach"--> Element Node "date"--> ... etc.为了取得“Alex On The Beach”,您需要做一些方法来调用DOM树,并且,分析器可能会选择分散。whitespace“一些文本nodes的数据,你必须使用循环和串联等。 (您可以通过调用normalize()来纠正此问题。)分析器也可能包含分离的XML实体(如 &), CDATA nodes或其他实体nodess (如big至少会变成三个node。也没有办法在DOM中简单地表达“”get me the text value of the title element." 总之,在DOM中游历有点笨重。也没有办法在DOM中简单地表达“”get me the text value of the title element." 简而言之,在DOM中旅行有点笨重。(见本文用XPath代替DOM章节。)

  2 从更高的角度来看,DOM的问题是XML对象不能像Java对象那样直接获得,需要通过 DOM 一个接一个地获得API。

  你可以参考我的Java-XML Data Binding技术讨论做了一些总结,也用这种直接使用Java的方法来获取XML数据。

  我写了一个叫做DOMUtils的小工具类,它包含了执行公共DOM任务的静态方法。例如,为了获得根(图片)元素的标题元素的文本内容,您可以编写以下代码:

  Document doc = DOMUtils.xml4jParse(picturefile);Element nodeRoot = doc.getDocumentElement();Node nodeTitle = DOMUtils.getChild(nodeRoot, "title");String title = (nodeTitle == null) ? null : DOMUtils.getTextValue(nodeTitle);