java

位置:IT落伍者 >> java >> 浏览文章

XML在Java EE中的应用


发布日期:2022年05月22日
 
XML在Java EE中的应用

摘要本文从Java EE系统中对XML应用的需求出发详细论述了XML在Java企业级应用系统中的若干问题内容涵盖XML的解析处理XML的与Java的相互转换XML的展示与抓取XML数据的查询与持久化这几个方面并重点论述了企业应用中XML与Java的转换的技术难题并给出了一个实际可行的解决方案

XML在Java中应用的概述

XML是一种可扩展标记语言(EXtensible Markup Language)日被确立为 WC 标准由于是一种标记语言这使得成为XML跨平台的用于传输信息且独立于软件和硬件的工具

XML设计的目的是为了描述数据它使用使用文件类型声明(DTD)或者 XML Schema 来描述数据规范带有 DTD 或者 XML Schema 的 XML 被设计为具有自我描述性XML标签没有被预定义您必须自行定义标签

XML与HTML的最大的区别是两者目的不同XML作为数据载体来描述数据而HTML是为了格式化和展示数据

在Java EE应用中XML主要用来描述配置和数据的交换配置信息描述是最常见不过的了比如Java Web应用的描述符webxml包括很多开源框架的配置信息数据交换主要是XML的数据与其他格式的数据的转换XML与JavaXML与数据库表记录XML与HTML等转换

XML在Java应用存在的若干问题

Java是一门面向对象的语言在应用XML时不可避免存在以下几个方面的问题

XML数据解析

XML数据的存储

XML数据的转换

XML数据的查询

XML数据的形成

XML数据的展示

这些方面我们可以用一个模式图来表示如下图

上图是Java企业应中XML数据流图这个图分左右两不部分左边是XML数据的展示和抓取部分主要应用与客户端右边是Java对象的持久化技术在服务端不难看出在客户端和服务器端之间还应该有中间一个转换器工厂将XML与Java对象联系起来这个应用才完整中间这个双向的转换器是企业应用中的难点本文重点要论述的内容

XML的数据的客户端展示与抓取

XML数据展示是Java EE 应用中客户端的首要职责XML数据的展示技术很多常见的有XSLTXML数据岛技术AJAX或者其他客户端脚本技术都可以完成数据的展示这些技术都是目前比较流行的技术具体选择应该根据技术复杂度灵活性软件需求等方面来考虑 有关数据岛的原理如下

在HTML中通过使用非官方的 <xml> 标签可用来创建 XML 数据岛这项技术首先在Internet Explorer中得以支持其他浏览器的支持程度还需要进一步考证

数据岛注入是在jsp或者HTML页面中嵌入一个<xml id=[IslandId]src=[Islandxml]></xml>的标签来实现其中id是表示数据岛标识src是数据岛资源名称

在客户端请求带有数据岛的页面时首先通过JavaScript组件将数据岛中的数据展示到页面的表单域当客户端填写完成数据之后通过JavaScript组件将填写后的数据改写注入到XML数据岛中然后将数据岛数据发送给服务器端响应请求

另外除了数据岛技术之外还可以通过XSLT来展示XML数据这个展示也很方便但缺点是难以编写XSLT的文档也难以实现复杂交互因此实际中主要用于XML数据的格式化输出

XML是数据的载体通过相应的模板或组件技术可以方便将XML转换PDFExcelHTML文档等等这些一般都依赖一些组件工具来完成

XML数据的抓取是客户端另一个重要职责一般来说用户通过浏览器将数据发送给服务器在请求发出之前应该通过一种策略将请求数据抓取为XML然后将所有请求的数据一次性发送给服务器服务器拿到这个XML数据做一个XML到Java的转换然后处理请求业务

XML是客户端抓取是XML数据的来源之一另外还可以将关系数据库表记录封装为XML数据

从客户端抓XML常常通过JavaScript结合数据岛技术来实现这需要为页面数据信息模型建立XML数据的模板然后以数据岛的方法注入页面页面在数据的展示修改保存都直接操作数据岛中的XML结果将以XML格式的文本发送给服务器这里面有两个问题需要注意其一如何定义合理的XML数据模型或者模板其二基于数据安全性考虑XML模板应该遵循最小原则尽可能暴露XML数据岛中最少的数据信息

XML文档的解析

当客户端携带XML数据将请求发送给服务器端的处理程序一般都需要进行XML数据的提取和转化比如将XML通过Java XML API或者DomjJdom等解析解析出来的数据既可以构建Java Bean对象也可以直接将解析出来的数据参与计算或控制这些都是根据实际需要来确定

XML数据Java解析是Java应用XML的基础也是后面要讲述的XML-Java数据转换器实现的基础

目前Java XML解析器有很多并且基本上都是开源的组件解析原理有二使用基于事件的XML简单API(Simple API for XML)称为SAX和基于树和节点的文档对象模型(Document Object Module)称为DOM

Sun公司提供了Java API for XML Parsing(JAXP)接口来使用SAX和DOM通过JAXP可以使用任何与JAXP兼容的XML解析器来处理XML但事实上并不是所有的Java XML解析工具都实现了JAXP所提供的接口Domj就是其中的一个但非常优秀已成为Java XML解析的事实标准

在使用Java组件或者API解析XML之前应该对XML DOM的概念有个全面认识这是解析XML基础有关使用某个解析器解析XML的技术都是解析器API的如何应用问题在此不做具体介绍因为相关的书籍文章比比皆是

XML与Java对象的相互转换

为什么要在XML与Java之间做转换呢?

首先先分析一下典型的客户端要完成一次注册会员请求过程客户填写登记信息JavaScript组件抓取数据写入数据岛然后将携带XML数据岛信息将请求服务器端处理服务器端接收到请求后获取XML数据并封装为不同的实体对象然后通过ORMapping组件(比如Hibernate)写入到数据库当用户需要修改注册信息时需要从数据库取出数据通过ORMapping组件转换为Java实体对象然后将Java实体对象转换为XML在注入JSP或者HTML页面的数据岛并展示到注册信息修改的页面上将这两个过程用一个图形标识如下

从上图可以看出客户端请求会发送到服务层去做处理而服务层暴露给外部只有接口方法这些方法的参数大多都是和领域活动层密切相关的对象和参数服务层也不接受XML数据作为参数这时候在请求到达服务层之间将请求的XML数据转换为Java Object是非常有必要的相反当修改登记信息时客户端会请求要修改登记信息通过服务层查找到要修改的信息后转换为XML注入到XML数据岛完成后再做保存操作即可

从上面的过程看来存在一个迫切要解决的问题就是XMLJava Object之间的相互转换这个转换相当于一个桥梁将XML格式数据与页面表单域Java对象数据库表记录有机的联系起来从而实现自由的交换处理

至于XML数据的展示与抓取Java对象通过ORMapping框架实现持久化以及持久化数据转换为Java对象这些技术已经相当的成熟有很多的开源框架可以实现大名鼎鼎的Hibernate就是一个优秀的ORMapping框架并且得到的广泛的应用因为本文将在下面的篇幅中不去深刻介绍这些技术而将花费大篇幅去分析讲述XML与Java之间的相互转换和处理

通常对于一个Java EE应用系统来说领域层的实体数量都是相当多的从几十个到上千都有可能如果单纯用XML解析技术针对每个实体完成转换将是相当麻烦和复杂的工作不但会导致很多重复的工作而且实体增加属性或删除属性的时候解析转换也需要随之改变维护起来无异于是异常噩梦给软件项目带来巨大的风险

因此可以考虑设计一个转换器工厂任何的实体对象都可以通过转换器工厂自动转换为XML并且任何的XML通过转换器工厂也自动生成Java对象从而将转换的过程简化这个转换是由程序自动维护的这样前台页面程序员仅仅关注自己页面的书写与展示后台的设计人员只考虑领域模型的设计以及服务层的开发节省了前后台人员相互交流的时间也大大的增加的软件的健壮性和维护的代价减少了项目的风险

如何设计一个转换器工厂呢?下面将以登记业务为利详细说明如何构建这样一个转换器工厂

为了实现这个转换器工厂首先要考虑的是如何实现一个转换器将一个对象转换为XML并且如何让这个过程可以逆转?因为这是实现一个转换工厂最基础的工作

在此不得不引入一个开源的组件XstreamXStream是一个Java和XML相互转换的工具使用非常的简单并且可以自定义转换的过程但是这个组件仅能做的就是这些最基本的工作有了这个组件我们可以不用考虑具体一个Java对象和XML之间问题了而是将注意力转移到一个转换器工厂的构建上去

在构建Java Object与XML转换器工厂之前应该对这个工厂的的功能加以描述

工厂的目标是生产转换器转换器的生成应该是自动的传入一个Java类就应该生成一个转换器对象

转换器的应该是双向的可以从Java对象生成XML也可以反向从XML转向Java

转换器的生成应该是可配置的而不是手动编码去构建并且转换类支持类的组合

下面就以一个用户登录的例子来说明如何实现这个转换器工厂的构建在此之前我们先看看实体模型以及目标的XML数据模板

上面是模型的UML类图一个User类中包含两个相关联的类UserProfile和Address类一个用户对应一个UserProfile(用户的其他信息)和一组Address(用户地址信息)我们就以这样一个模型为研究对象实现一个转换器工厂

在实现转换器之前先看看XStream是如何做到让对象转换为XML的

XStream的应用的核心就是要构建出实体模型然后将实体按照所表达的信息组合成许多单元然后每个单元确定作为完整信息模型在本例中UserAddressUserProfile三个实体类就是一个单元User就是一个完整的信息模型表述用户的信息现在假设我们已经拥有了一个User对象如何将这个对象转换为XML代码如下

//创建转换器对象

XStream xStream = new XStream();

//为类所生成的节点添加别名

xStreamalias(User Userclass);

xStreamalias(Address Addressclass);

xStreamalias(UserProfile UserProfileclass);

//为用户信息模型的成员加上别名

xStreamaliasField(UserProfile Userclass userProfile);

//将User对象转换为XML数据

String xml = xStreamtoXML(user);

Systemoutprintln(xml);

我们可以看到这段代码非常简单甚至我们可以直接new一个转换器出来直接将对象转换为XML但是一般来说别名是非常必要的这段代码打印的结果如下

<User>

<id></id>

<username>admin</username>

<password></password>

<UserProfile>

<id></id>

<sex>M</sex>

<birthday> :: CST</birthday>

<telphone></telphone>

<email></email>

<userId></userId>

</UserProfile>

<addresses class=set>

<Address>

<id></id>

<addr>郑州市花园路</addr>

<postCode></postCode>

</Address>

<Address>

<id></id>

<addr>郑州市经三路</addr>

<postCode></postCode>

</Address>

</addresses>

</User>

如果我们需要将这个XML再转换为Java Object那么一样的容易只要将这个XML传递给相对应的转换器即可代码如下

User u =(User)xStreamfromXML(xml);

以上代码还不足以给您带来惊喜因为企业应用中的信息模型动辄好几百个如果一个一个去写这些转换器是件相当耗时而且容易出错的工作必须想办法构建一个转换器工厂让工厂自动构建出所需要的转换器

为此可以考虑定义一个配置文件将每个信息模型做为一个单元写入其中并且在这些单元内部详细定义各个域的别名等信息这样通过配置文件就可以获取到转换构建信息从而为工厂产品的生产提供了依据构建的配置文件信息如下

<?xml version= encoding=GBK?>

<!

Document : InfoUnitsxmlxml

Created on : 下午:

Author : leizhimin

Description:

Purpose of the document follows

>

<InfoUnits>

<User class =Userclass>

<ID en=id />

<MC en=username />

<MM en=password/>

<UserProfile class=UserProfileclass>

<ID en = id/>

<XB en = sex/>

<SR en =birthday/>

<DH en = telphone/>

<YJDZ en =email/>

<YHID en =userId/>

</UserProfile>

<AddressList>

<Address class = Addressclass>

<ID en = id/>

<DZ en = addr/>

<YB en = postCode/>

</Address>

</AddressList>

</User>

</InfoUnits>

未完待续```

               

上一篇:JAVA中责任链模式

下一篇:JAVA与QQ网络通讯实例