随笔:2 文章:0 评论:2 引用:0
BlogJava 首页 发新随笔
发新文章 联系 聚合管理

2007年2月8日

本文主要讲述的是Dom4j在把Document保存到文件过程中出现的一个中文问题,文中不足之处欢迎大家批评指教。
  Dom4j是一个比较优秀的java开源xml解析项目,支持DOM, SAX and JAXP.,并提供对XPath查询语言的强大支持。因此,在EasyJF团队的很多开源项目中,如EasyJWeb、EasyDBO等都是使用Dom4j来处理xml文件相关操作。
 
1、从一个xml文件中载入一个Dom到内存:
  FileInputStream in = new FileInputStream(new File(fileName));
  SAXReader reader = new SAXReader();
  doc = reader.read(in);
2、把Dom中的数据写入到xml文件中
  使用Dom4j,要把一个Dom中的数据写入到文件非常简单,API如下:
   public void write(Writer writer) throws IOException;
  因此,假如我们要把一个Document写入到c:\test.xml文件中,可以简单的使用下面的代码即可:
        java.io.Writer wr= new java.io.FileWrite(filename);
  doc.write(wr);
        wr.close();//注意,必须要执行close()方法,才会实现真正的写入
  
  这种用法也是Dom4j所推荐我们使用的非常简单的方法。然而,当我们的dom中包含有中文字符数据的时候,这种方法写入的xml文档却无法使直觉打开。会提示类似如下的错误:
   org.dom4j.DocumentException: invalid byte 1 of 1-byte UTF-8 sequence (0xb2) Nested exception: invalid byte 1 of 1-byte UTF-8 sequence (0xb2)
 at org.dom4j.io.SAXReader.read(SAXReader.java:484)
 at org.dom4j.io.SAXReader.read(SAXReader.java:343)
 at 
  我们可以看生成的xml文件编码,内容是utf-8的,但文件格式确是ANSI的,如下图所示:

 
原因分析:
  由于FileWriter默认的输出编码是ANSI编码,而Dom4j中的wirte方法提供的内容实际是以UTF-8保存的,因此造成了包括中文字符的XML文件无法正常阅读。
 
解决方法:
   不能使用简单的FileWriter,而应该是使用一个能指定具体输出编码的Writer,在JDK的io包中, OutputStreamWriter可以指定输出编码。
  正确的代码如下:
    java.io.OutputStream out=new java.io.FileOutputStream(fileName);
   java.io.Writer wr=new java.io.OutputStreamWriter(out,"UTF-8");   
   doc.write(wr);   
   wr.close();
   out.close();

  简化一下可以写成下面的样式:

   java.io.Writer wr=new java.io.OutputStreamWriter(new java.io.FileOutputStream(fileName),"UTF-8");   
   doc.write(wr);   
   wr.close();

小结:
  由于大多数优秀的基础性开源项目都是老外开发,他们不大可能在中文平台下进行测试,用例数据也很少会使用中文平台,因此,我们即使按照这些开源项目的通用说明文档及用户指南去操作,也会出现很多不可预知的错误。这也是为什么本人要参与组建开源团队EasyJF,提倡搞国产开源,并开发一些基础性的开源框架如EasyJWeb、EasyDBO的一个初衷。
  当然,这里提出的中文问题,算是一个还“没来得及商量”以及要通过一些罕见的处理才能正确运行的中文问题。因此,同样归并到了“中文问题没商量”系列中。

(注:本文作者,EasyJF开源团队 大峡,转载请保留作者声明!)
posted @ 2007-02-08 15:03 shakebaby 阅读(1008) | 评论 (1)编辑 收藏

2007年1月27日

Service Component Architecture(SCA) 是一组标准,描述了一个通过SOA构建应用系统的模型。SCA扩展并补充了之前服务实现的方法,构建在一些开放的标准之上,比如Web Services。

SCA提倡基于SOA的业务应用能够用组件(component)的形式来实现业务逻辑,这些组件通过面向服务的接口提供功能(服务),或者使用别的组件通过面向服务的接口提供的功能,即服务引用(Service references)。SCA将构建一个SOA的应用切分为两个主要步骤:
 1.服务组件的实现:提供或者使用(consume)服务;
 2.服务组件的组装:用来构建完整的业务应用,通过连接服务引用与服务(Through the wiring     of service reference to services)。
Figure 1. Service Component Architecture

Service Component Architecture

SCA服务的实现支持使用多种的编程语言,既包括传统的面向对象或过程的语言,如:Java,PHP,C++,COBOL,以XML为核心的BPEL,XSLT等,又包括一些声明语言(declarative language)如:SQL和XQuery。SCA同样支持异步的和面向消息的调用以及同步的调用返回模式。

SCA支持绑定(Bindings)一组访问机制用来调用服务,包括Web Services,Messaging Systems 和 CORBA IIOP,Bindings 是声明式的(are handled declarativly)独立于实现代码,SCA通过使用策略定义了基础功能的使用,目的是为了更方便的应用到业务系统。

SCA提倡使用Service Data Object(SDO)来表示服务中使用或返回的业务数据,提供对业务数据统一的访问来满足对SCA自己提供的业务服务的统一访问。

SCA规范由许多文档共同描述,每一文档描述SCA中的一个方面。装配模型(Assembly Model)描述了组件间的配线连接。装配模型独立于实现语言。客户端和实现 描述了服务的实现和服务客户端—— 每一种实现语言有其自己的客户端和针对该语言的SCA模型实现规范。

原文

posted @ 2007-01-27 18:35 shakebaby 阅读(292) | 评论 (1)编辑 收藏
CALENDER
<2024年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用链接

留言簿(1)

随笔分类

随笔档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜


Powered By: 博客园
模板提供沪江博客