javaee:XML在Java EE中使用方法及应用来源: 发布时间:星期四, 2009年2月12日 浏览:97次 评论:0
摘要:本文从Java EE系统中对XML应用需求出发详细论述了XML在Java企业级应用系统中若干问题内容涵盖XML解析处理、XML和Java相互转换、XML展示和抓取、XML数据查询和持久化这几个方面并重点论述了企业应用中XML和Java转换技术难题并给出了个实际可行解决方案 、XML在Java中应用概述 XML是种可扩展标记语言(EXtensible Markup Language)于1998年2月10日被确立为 W3C 标准由于是种标记语言这使得成为XML跨平台、用于传输信息且独立于软件Software和硬件工具 XML设计目是为了描述数据它使用使用文件类型声明(DTD)或者 XML Schema 来描述数据规范标准带有 DTD 或者 XML Schema XML 被设计为具有自我描述性XML标签没有被预定义您必须自行定义标签 XML和HTML最大区别是两者目区别XML作为数据载体来描述数据而HTML是为了格式化和展示数据 在Java EE应用中XML主要用来描述配置和数据交换配置信息描述是最常见不过了比如Java Web应用描述符web.xml包括很多开源框架配置信息数据交换主要是XML数据和其他格式数据转换XML和Java、XML和数据库表记录、XML和HTML等转换 2、XML在Java应用存在若干问题 Java是门面向对象语言在应用XML时不可避免存在以下几个方面问题: XML数据解析 XML数据存储 XML数据转换 XML数据查询 XML数据形成 XML数据展示 这些方面我们可以用个模式图来表示如下图: 上图是Java企业应中XML数据流图这个图分左右两不部分左边是XML数据展示和抓取部分主要应用和客户端右边是Java对象持久化技术在服务端不难看出在客户端和服务器端的间还应该有中间个转换器工厂将XML和Java对象联系起来这个应用才完整中间这个双向转换器是企业应用中难点本文重点要论述内容 3、XML数据客户端展示和抓取 XML数据展示是Java EE 应用中客户端首要职责XML数据展示技术很多常见有XSLT、XML数据岛技术、AJAX或者其他客户端脚本技术都可以完成数据展示这些技术都是目前比较流行技术具体选择应该根据技术复杂度、灵活性、软件Software需求等方面来考虑 有关数据岛原理如下: 在HTML中通过使用非官方 <xml> 标签可用来创建 XML 数据岛这项技术首先在Internet Explorer中得以支持其他浏览器支持程度还需要进步考证 数据岛注入是在jsp或者HTML页面中嵌入个<xml id="[IslandId]",src="[Island.xml]"></xml>标签来实现其中id是表示数据岛标识src是数据岛资源名称 在客户端请求带有数据岛页面时首先通过JavaScript组件将数据岛中数据展示到页面表单域当客户端填写完成数据的后通过JavaScript组件将填写后数据改写注入到XML数据岛中然后将数据岛数据发送给服务器端响应请求 另外除了数据岛技术的外还可以通过XSLT来展示XML数据这个展示也很方便但缺点是难以编写XSLT文档也难以实现复杂交互因此实际中主要用于XML数据格式化输出 XML是数据载体通过相应模板或组件技术可以方便将XML转换PDF、Excel、HTML文档等等这些般都依赖些组件工具来完成 XML数据抓取是客户端另个重要职责般来说用户通过浏览器将数据发送给服务器在请求发出的前应该通过种策略将请求数据抓取为XML然后将所有请求数据次性发送给服务器服务器拿到这个XML数据做个XML到Java转换然后处理请求业务 XML是客户端抓取是XML数据来源的另外还可以将关系数据库表记录封装为XML数据 从客户端抓XML常常通过JavaScript结合数据岛技术来实现这需要为页面数据信息模型建立XML数据模板然后以数据岛思路方法注入页面页面在数据展示修改保存都直接操作数据岛中XML结果将以XML格式文本发送给服务器这里面有两个问题需要注意:其如何定义合理XML数据模型或者模板;其 2基于数据安全性考虑XML模板应该遵循最小原则尽可能暴露XML数据岛中最少数据信息 4、XML文档解析 当客户端携带XML数据将请求发送给服务器端处理般都需要进行XML数据提取和转化比如将XML通过Java XML API或者Dom4j、Jdom等解析解析出来数据既可以构建Java Bean对象也可以直接将解析出来数据参和计算或控制这些都是根据实际需要来确定 XML数据Java解析是Java应用XML基础也是后面要讲述XML-Java数据转换器实现基础 目前Java XML解析器有很多并且基本上都是开源组件解析原理有 2:使用基于事件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所提供接口Dom4j就是其中个但非常优秀已成为Java XML解析事实标准 在使用Java组件或者API解析XML的前应该对XML DOM概念有个全面认识这是解析XML基础有关使用某个解析器解析XML技术都是解析器API如何应用问题在此不做具体介绍相关书籍文章比比皆是 5、XML和Java对象相互转换 为什么要在XML和Java的间做转换呢? 首先先分析下典型客户端要完成次注册会员请求过程客户填写登记信息JavaScript组件抓取数据写入数据岛然后将携带XML数据岛信息将请求服务器端处理服务器端接收到请求后获取XML数据并封装为区别实体对象然后通过OR-Mapping组件(比如Hibernate)写入到数据库当用户需要修改注册信息时需要从数据库取出数据通过OR-Mapping组件转换为Java实体对象然后将Java实体对象转换为XML在注入JSP或者HTML页面数据岛并展示到注册信息修改页面上将这两个过程用个图形标识如下: 从上图可以看出客户端请求会发送到服务层去做处理而服务层暴露给外部只有接口思路方法这些思路方法参数大多都是和领域活动层密切相关对象和参数服务层也不接受XML数据作为参数这时候在请求到达服务层的间将请求XML数据转换为Java Object是非常有必要相反当修改登记信息时客户端会请求要修改登记信息通过服务层查找到要修改信息后转换为XML注入到XML数据岛完成后再做保存操作即可 从上面过程看来存在个迫切要解决问题就是XML-Java Object的间相互转换这个转换相当于个桥梁将XML格式数据和页面表单域、Java对象、数据库表记录有机联系起来从而实现自由交换处理 至于XML数据展示和抓取、Java对象通过OR-Mapping框架实现持久化以及持久化数据转换为Java对象这些技术已经相当成熟有很多开源框架可以实现大名鼎鼎Hibernate就是个优秀OR-Mapping框架并且得到广泛应用本文将在下面篇幅中不去深刻介绍这些技术而将花费大篇幅去分析讲述XML和Java的间相互转换和处理 通常对于个Java EE应用系统来说领域层实体数量都是相当多从几十个到上千都有可能如果单纯用XML解析技术针对每个实体完成转换将是相当麻烦和复杂工作不但会导致很多重复工作而且实体增加属性或删除属性时候解析转换也需要随的改变维护起来无异于是异常噩梦给软件Software项目带来巨大风险 因此可以考虑设计个转换器工厂任何实体对象都可以通过转换器工厂自动转换为XML并且任何XML通过转换器工厂也自动生成Java对象从而将转换过程简化这个转换是由自动维护这样前台页面员仅仅关注自己页面书写和展示后台设计人员只考虑领域模型设计以及服务层开发节省了前后台人员相互交流时间也大大增加软件Software健壮性和维护代价减少了项目风险 如何设计个转换器工厂呢?下面将以登记业务为利详细介绍说明如何构建这样个转换器工厂 为了实现这个转换器工厂首先要考虑是如何实现个转换器将个对象转换为XML并且如何让这个过程可以逆转?这是实现个转换工厂最基础工作 在此不得不引入个开源组件XstreamXStream是个Java和XML相互转换工具使用非常简单并且可以自定义转换过程但是这个组件仅能做就是这些最基本工作有了这个组件我们可以不用考虑具体个Java对象和XML的间问题了而是将注意力转移到个转换器工厂构建上去 在构建Java Object和XML转换器工厂的前应该对这个工厂功能加以描述: 工厂目标是生产转换器转换器生成应该是自动传入个Java类就应该生成个转换器对象 转换器应该是双向可以从Java对象生成XML也可以反向从XML转向Java 转换器生成应该是可配置而不是手动编码去构建并且转换类支持类组合 下面就以个用户登录例子来介绍说明如何实现这个转换器工厂构建在此的前我们先看看实体模型以及目标XML数据模板 上面是模型UML类图个User类中包含两个相关联类UserProfile和Address类个用户对应个UserProfile(用户其他信息)和组Address(用户地址信息)我们就以这样个模型为研究对象实现个转换器工厂 在实现转换器的前先看看XStream是如何做到让对象转换为XML XStream应用核心就是要构建出实体模型然后将实体按照所表达信息组合成许多单元然后每个单元确定作为完整信息模型在本例中User、Address、UserProfile 3个实体类就是个单元User就是个完整信息模型表述用户信息现在假设我们已经拥有了个User对象如何将这个对象转换为XML代码如下: //创建转换器对象 XStream xStream = XStream; //为类所生成节点添加别名 xStream.alias("User", User.); xStream.alias("Address", Address.); xStream.alias("UserProfile", UserProfile.); //为用户信息模型成员加上别名 xStream.aliasField("UserProfile", User., "userProfile"); //将User对象转换为XML数据 String xml = xStream.toXML(user); .out.prln(xml); 我们可以看到这段代码非常简单甚至我们可以直接个转换器出来直接将对象转换为XML但是般来说别名是非常必要这段代码打印结果如下: <User> <id>100</id> <username>admin</username> <password>123456</password> <UserProfile> <id>1000</id> <sex>M</sex> <birthday>1982-04-03 19:54:14.421 CST</birthday> <telphone>66668888</telphone> <email>[email protected]</email> <userId>100</userId> </UserProfile> <addresses =""> <Address> <id>2000</id> <addr>郑州市花园路</addr> <postCode>450001</postCode> </Address> <Address> <id>2001</id> <addr>郑州市经 3路</addr> <postCode>450001</postCode> </Address> </addresses> </User> 如果我们需要将这个XML再转换为Java Object那么样容易只要将这个XML传递给相对应转换器即可代码如下: User u =(User)xStream.fromXML(xml); 以上代码还不足以给您带来惊喜企业应用中信息模型动辄好几百个如果个个去写这些转换器是件相当耗时而且容易出错工作必须想办法构建个转换器工厂让工厂自动构建出所需要转换器 为此可以考虑定义个配置文件将每个信息模型做为个单元写入其中并且在这些单元内部详细定义各个域别名等信息这样通过配置文件就可以获取到转换构建信息从而为工厂产品生产提供了依据构建配置文件信息如下: <?xml version="1.0" encoding="GBK"?> <!-- Document : InfoUnits.xml.xml Created _disibledevent=> <ID en="id" /> <MC en="username" /> <MM en="password"/> <UserProfile ="UserProfile."> <ID en = "id"/> <XB en = "sex"/> <SR en ="birthday"/> <DH en = "telphone"/> <YJDZ en ="email"/> <YHID en ="userId"/> </UserProfile> <Address-List> <Address = "Address."> <ID en = "id"/> <DZ en = "addr"/> <YB en = "postCode"/> </Address> </Address-List> </User> </InfoUnits> 未完待续``` 0
相关文章读者评论发表评论 |