基于Cocoon的应用有哪些?

基于Cocoon的应用有哪些?

把一个月前翻译的一篇拿来当开头,以后有时间慢慢补齐

 

1. xml被吹的天花乱坠说起

有那么一段时间,每个人都在谈论xml,所有的应用服务器支持xml,所有的B2B应用加入xml , web services 使用xml, 甚至连数据库也是使用xml。但是没有多少人在使用xml的时候真正的去考虑为什么要在自己的应用里使用它。

一说起xml,我们就会想起html,然而xml和html如何在本质上区别开来呢。首先,我们可以很形象的说明这个问题:html是一种告诉浏览器如何在windows里描画东西,比如在这里画一张图画,那里画一个字,这里有画另外一种颜色。他并没有再告诉浏览器更多的东西,让我们看个例子:

<html>

<body>

<p>你好,我是一个html页面</p>

<p align="center">雨林的编程</p>

</body>

</html>

这个html告诉了浏览器:

2 我是一个 html页面

2 我有一个body

2 我有一个段落

2 包含了句子 “你好,我是一个html页面”和“雨林的编程”

但假如你是一个非洲人,你并不懂中文,那么请你回答这个问题:谁写了这个页面?

你根本不能对以上程序进行什么语义上的分析,你只知道你能在屏幕上画出一些东西。换句话说,你的语义分析能力只限于知道如何去画。但是假如你接收到如下页面:

<page>

<author> sdfdsf</author>

<content>

<param>dsfdfdf</param>

</content>

</page>

再回答上面那个问题,你可以轻易的得到答案:sdfdsf。因此xml使你具有了语义分析的能力。对于计算机来说,这是值得人们“吹捧”的。

但是,又让我们来看看下一个xml文档。

<dsfds>

<sdfsdf>dsfdsfsdf</ sdfsdf>

<fgsdfg>

<erterefr>sadfsdfsdf</ erterefr>

</ fgsdfg>

</ dsfds>

上面那个仍然是xml文档,你仍然可以对它进行语义分析,但你却不会得到任何所谓“正确”的结果,因为你要怎么解释它都行。于是,我们看到,只有xml,那么它并不如我们所吹捧的那么强大。

现在,你是否可以有一些总结了,对,其实只有xml,它自己什么也做不了,它本有语义,告诉你它所描述的是什么,但是你如果不对它进行分析,那么它对你一点价值都没有。于是我们要解决和利用它所带来的其他问题就要引入其他的一些帮助。

但我们可以使用xml带有语义的特点,用它定义我们的数据。要如何使所有人都能读取它不产生“误解”,我们引入了DTD。现在我们可以用它了,而如何去使用它又是另外一个问题,比如用html可以告诉显示器如何去打印出来,用xml呢?只有它当然不行,那我们为什么不把它转化成html呢?于是我们引入了一些将xml转化成html的技术。就是xsl。

现在我们可以将xml在显示器上打印出来的。那么再想想,既然可以将xml转化成html在显示器所理解,那当然就可以将它转化成可以被其他设备所理解的格式(这当然是html所不能做的)。于是发现我们虽然只有一个xml数据文件,但是,它却能很容易的被其他所有设备所理解。这就是xml的强大功能所在了!

我们在看看,xml变成html的过程:

XML page ---(transformation)--> HTML page

^

|

transformation rules

这个过程你要写一个有transformation rules的程序,然后运行你的程序,读入你的xml数据,再产生html格式。但是,下一次,我通过我的手机来请求这个书记,那它就要转化为wap,又如果我想通过pdf来把打印这些东西,有要写个pdf转化程序,然后在读入我的xml数据,。。。,如此下去,这是一个很烦琐的事情,有没有其他东西能更好更方便的为我解决这个问题吗?那就是Cocoon了。

1. 分离你的注意力

Cocoon 并非第一个在服务端对xml进行转化的产品,事实上很早以前就有这种产品了那么既然如此,Cocoon又增加了那些功能?

那么让我们来介绍Cocoon一个最重要的创新。Separation of Concerns (SoC).分离你的注意力。为什么要分离你的注意力。

这个世界上不是所有人都具有相同的能力。在某方面你是专家,而在另外一方面你可能是弱智的。所以在你的开发团队中,你并不需要关心所有的东西,而应该更关心你所专长的方面。那样你的团队才能发挥最大的功效。于是你就要把你的注意力从那些地方分离开来。

Cocoon xml 发布框架就是要把你从某些东西中分离,让你将注意力集中与某一些事情。

先让我们看看cocoon 框架:

它把逻辑、内容、表现三部份分开来。

为什么要这样分呢?因为程序员、美工有着非常不同的技巧和工作习惯。如果要美工整天去思考如何把某一部分界面隐藏起来,而程序员则去思考如何把界面搞的更完美。那将是非常滑稽和浪费人力的事情。

而具于Cocoon框架下,程序员只去考虑如何编写逻辑,如何去产生内容,而美工则只需要考虑如何去把这些内容表现出来。

2. Cocoon 的基本机制

Cocoon基本机制是通过处理xml文档来解决问题,它内部一套自动处理xml文档的机制。它引入了unix下的一个概念“pipeline”(管道)。如图:

pipeline就象一条流水线,上面安装了不同的组件。管道的开头和结尾分别安装了Matcher匹配器和Serializer系列化器,中间安装一些transformer转化器来进行数据转化。在管道内部通过从sax事件流在不同的组件中来实现文档的处理的。让我们看看他的基本流程:

2 Matcher(匹配器) 出发,发出请求

2 通过Generator(生成器)来从xml文档中产生数据流

2 通过Transformer(转化器)来转化xml文档

2 通过Aggregation(聚合器)来聚合xml文档

2 最后通过Serializer(系列化器)来系列化xml文档

pipeline处理流程图:

Cocoon 的处理是从http request发生的。最后有也就有一个http response.再让我们看看pipeline处理过程的顺序图,就会更加明白了:

下面让我们来看看Cocoon你一种很重要的技术:xsp(xml server page).

Xsp是一种动态产生xml数据的技术。他本身也是一个xml文档,不过要根据如下要求来定义这个xml文档:

2 文档的根元素为<xsp:page>

2 <xsp:page>在必须有一个 language 定义属性

2 必须定义xsp的命名空间namespace

2 为了使xsp更加有用。要求至少有一个<xsp:logic>和<xsp:expr>元素。

看一xsp的例子:

<?xml version="1.0" encoding="utf-8"?>

<xsp:page language="java"

xmlns:xsp="http://apache.org/xsp"

xmlns:xsp-formval="http://apache.org/xsp/form-validator/2.0"

xmlns:xsp-request="http://apache.org/xsp/request/2.0"

xmlns:esql="http://apache.org/cocoon/SQL/v2"

xmlns:xsp-session="http://apache.org/xsp/session/2.0"

create-session="yes">

<tips><xsp:attribute name="currentUserRole"><xsp-session:get-attribute name="role"/></xsp:attribute>

<xsp:expr><xsp-session:get-attribute name="tips"/></xsp:expr>

<xsp:logic>

if(<xsp-session:get-attribute name="u_id"/>!=null)

{

<tips><xsp:expr><xsp-session:get-attribute name="u_id"/></xsp:expr></tips>

}

else if(<xsp-session:get-attribute name="u_id"/>==null)

{

<tips>the u_id is null</tips>

}

if(<xsp-session:get-attribute name="r_id"/>!=null)

{

<tips>the r_id is <xsp-session:get-attribute name="r_id"/></tips>

}

else if(<xsp-session:get-attribute name="r_id"/>==null)

{

<tips>the r_id is null</tips>

}

</xsp:logic>

</tips>

</xsp:page>

由于cocoon是从处理http请求开始的,所以我们可以象在jsp中一样在xsp里使用一些http 对象。如request、response、session 等。我们可以通过在xsp中添加<xsp:logic>来添加java代码进行一些逻辑控制,就象在jsp中添加<%%>来添加java代码。然后通过<xsp:expr>把<xsp:logic>中的代码结果输出到目标xml文档中,这一点又很象jsp中的<%=%>。所以xsp理解起来并不困难。