`
bibiye
  • 浏览: 172364 次
社区版块
存档分类
最新评论

Cocoon学习笔记 -- 基础篇

阅读更多

一、什么是cocoon,它能做什么<!----><o:p></o:p>

Cocoon 是一种 Java 服务器框架,它允许使用 XSLT(XML 样式表语言转换 (XML Stylesheet Language-Transformation))转换动态发布 XML 内容。通过依靠 XML 描述内容以及使用 XSLT 将内容转换成多种格式,Cocoon 提供了用于构建内容、逻辑和表示在很大程度上彼此分离的应用程序的平台。 <o:p></o:p>

Cocoon 使用管道的概念来描述将内容发布到 Web 的过程。管道由一些输入数据以及随后对它进行的一些处理步骤构成。每个处理步骤接受前一步的输出作为输入,一直到达管道的末端并产生最终输出。它包含各种各样的可重用组件,这些组件可以配置成使用最低限度的 Java 开发生成复杂的行为。例如,通过单独使用 XML 和 XSLT,Cocoon 可用于:<o:p></o:p>

  • 提供静态文件和动态生成的响应 <o:p></o:p>
  • 使用任意数量的处理将用户请求透明地映射到物理资源 <o:p></o:p>
  • 执行简单和多级 XSLT 转换 <o:p></o:p>
  • 将参数动态传递到 XSLT 变换 <o:p></o:p>
  • 生成各种各样的输出格式,包括 XMLHTMLPNGJPEGSVG PDF <o:p></o:p>

 <o:p></o:p>

二、Cocoon 2 体系结构的原理<o:p></o:p>

首先,处理 XML 文档可分成几个离散的步骤。这些步骤的组合描述处理管道。管道由输入、某些处理以及输出构成。Cocoon 2 使用 SAX 事件作为每个处理步骤之间的连接。
第二,可以使用特殊类型的组件来对管道中的每个阶段建模。例如,用生成器生成输入,用序列化器生成输出。
第三,对用户请求的响应包括确定为请求(与其输入一起)服务的正确管道,然后指示管道执行其处理以生成给用户的响应。 <o:p></o:p>

2.1管道组件<o:p></o:p>

Cocoon 包含许多常规管道组件,可以用有用的方法将它们连接起来。根据这些组件在管道中扮演的角色,可以将它们分组成几种完全不同的类型。<o:p></o:p>

  • 管道输入 — 生成器和阅读器 <o:p></o:p>
  • 处理步骤 — 转换器和操作 <o:p></o:p>
  • 管道输出 — 序列化器 <o:p></o:p>
  • 条件的处理 — 匹配器和选择器 <o:p></o:p>

Cocoon 管道通常至少由生成器和序列化器组成,但可能含有任意数量的处理步骤。将数据作为 SAX 事件通过 Cocoon 管道传递。 <o:p></o:p>

2.1.1输入-生成器和阅读器:<o:p></o:p>

生成器负责读取数据源(例如,文件),然后将该数据作为一系列 SAX 事件传递到管道。因此,最简单的生成器是 SAX 解析器。通常,任何可以被映像成一系列 SAX 事件的数据源都可以成为生成器的基础。
在 Cocoon 中有许多可用的生成器。最有用的是:<o:p></o:p>

  • FileGenerator:从文件系统或 Web 读取 XML 文件 <o:p></o:p>
  • HTMLGenerator: 从文件系统或 Web 读取 HTML 文件 <o:p></o:p>
  • DirectoryGenerator:读取文件系统以提供目录清单 <o:p></o:p>

阅读器 Cocoon 管道模型中的特例,因为它们不是理解 XML 的组件。阅读器只是访问外部资源,然后将它直接复制到响应。通常使用它们来提供静态文件(例如,图像或 CSS 样式表)。可以将阅读器视为自包含的管道;它们生成输入数据,然后将数据序列化成响应。<o:p></o:p>

2.1.2处理-转换器和操作<o:p></o:p>

    转换器 Cocoon 管道中的主要处理步骤。它们接受 SAX 事件作为输入,执行一些有用的处理,然后将结果作为 SAX 事件传入管道。一种查看转换器的有用方法是作为在 SAX 事件流通过它时修改 SAX 事件流的组件。在这一点上,它们类似于 SAX 过滤器。
    使用最广泛的转换器是 XSLT 转换器。它将其输入传递到执行 XSLT 转换的 XSLT 处理器中。然后将转换的结果作为 SAX 事件反馈到管道。
    操作是将附加动态行为插入管道的一种方法,并且通常为特殊应用程序定制。但是,某些一般的操作与 Cocoon 捆在一起,例如,执行数据库交互,表单验证和发送邮件等。操作的成功完成还会影响是否执行后续处理步骤。<o:p></o:p>

2.1.3 输出:序列化器<o:p></o:p>

    序列化器 Cocoon 管道中的端点。它们负责接收直接从生成器(在可能最短的管道中)或者以前的处理步骤(例如转换器)产生的 SAX 事件流,然后将它们解释成适合于响应的格式。特定格式取决于正在使用的确切序列化器。
    最简单的序列化器是 XML 序列化器,它只是将 SAX 事件转换回 XML 文档。其它序列化器可以生成 HTML、纯文本、PDF 文档甚至图像。所有这些序列化器都期望 SAX 事件流符合一个特殊的 XML 词汇表:
<o:p></o:p>

  • HTML 序列化器:将 XHTML 转换成有效的 HTML <o:p></o:p>
  • SVG 序列化器:将 SVG 转换成 JPEG 或 PNG 图像 <o:p></o:p>
  • PDF 序列化器:将 XSL-FO 转换成 PDF 文档 <o:p></o:p>

接受 XML 内容、对它进行处理,然后为其提供多种格式的能力是 Cocoon 框架的真正力量所在。 <o:p></o:p>

2.1.4条件:匹配器和选择器

任何特殊管道可能涉及某些条件节。例如,确切的处理步骤可能取决于请求参数、用户浏览器等之类的因素。
    匹配器是两个条件组件中最简单的部分,等价于简单的
if 语句。如果某个条件为真,则对特殊管道或者管道的一节进行求值。
    第二种条件组件是选择器,它与
if-then-else 语句类似。当几个选项之一可用时使用选择器,它通常用于在管道创建条件节,而匹配器则用于测试是否应该进入一个特殊管道。
    这些组件中的每一个都有几种实现。它们都遵循测试请求某些方面(例如,主机名、用户代理、参数或 URL)或用户会话的公共模式。可以使用通配符或正则表达式来完成匹配,而通常选择器枚举所有可能的值。

<o:p></o:p>

2.2让管道工作<o:p></o:p>

对接收请求和为响应提供服务的逻辑周期的描述可以归纳如下:

对接收请求和为响应提供服务的逻辑周期的描述可以归纳如下:<o:p></o:p>

  1. 从用户接受请求。 <o:p></o:p>
  2. 确定用来解释该请求并生成响应的适当管道(使用匹配器)。 <o:p></o:p>
  3. 从可用的预配置的组件构造管道。 <o:p></o:p>
  4. 指示管道为请求服务。 <o:p></o:p>
  5. 将由管道生成的响应返回用户,可能对结果进行高速缓存以便以后使用。 <o:p></o:p>

这是 Cocoon 用来将 XML 发布到 Web 的基本请求-响应周期。要管理这一周期,Cocoon 提供了一个称为 sitemap 的 XML 配置文件。<o:p></o:p>

三、安装和配置cocoon<o:p></o:p>

Cocoon 部署到 Tomcat 中很简单,只需将 cocoon.war 复制到 $CATALINA_HOME/ webapps 目录中,然后重新启动 Tomcat。
         除了sitemap,Cocoon 只有两个配置文件。可以在
$CATALINA_HOME/webapps/cocoon/WEB-INF 中找到它们:
       log.xconf:配置 Cocoon 日志记录。Cocoon 将 Apache Log4J 用于内部日志记录(请参阅参考资料)。缺省情况下,Cocoon 将日志文件写入
$CATALINA_HOME\webapps\cocoon\WEB-INF\logs
       cocoon.xconf:配置 Cocoon 高速缓存、数据源和许多其它高级选项。
       出于开发目的,在
cocoon.xconf 中进行一处更改是很有帮助的。找到下列项:
<sitemap file="sitemap.xmap" reload-method="asynchron" check-reload="yes" logger="sitemap"/>   
       现在,将
reload-method 属性的值更改为 synchron。这改变了 Cocoon 如何对网站地图的更改作出响应,网站地图是配置 Cocoon 应用程序的中心位置。将行为更改为 synchon 意味着 Cocoon 将在对任何请求提供服务之前立即作用于更改。缺省异步行为意味着它将在后台读取更改,因此它们将不会马上显示出来。在开发期间,当立即结果是更可取的,但是对于必须继续尽可能快的为用户服务的活动应用程序来说并不是最理想的时候,这可能令人沮丧。<o:p></o:p>

 <o:p></o:p>

四、网站地图<o:p></o:p>

网站地图是管理 Cocoon 网站的中心位置,它完成两个功能:<o:p></o:p>

  • 它是在管道中使用组件之前声明它们的位置。<o:p></o:p>

 <o:p></o:p>

  • 它是使用声明的组件来定义管道的位置。 <o:p></o:p>

 <o:p></o:p>

下面是一个带说明的比较完整的配置文件:<o:p></o:p>

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

<map:sitemap

  xmlns:map="http://apache.org/cocoon/sitemap/1.0">

 <o:p></o:p>

  <map:components>

 <o:p></o:p>

 <o:p></o:p>

<map:generators default="file">

  <map:generator name="file" src="org.apache.cocoon.generation.FileGenerator"/>

  <map:generator name="csv" src="com.mycompany.CSVGenerator"/>

 <o:p></o:p>

</map:generators>

 <o:p></o:p>

<map:transformers default="xslt">

  <map:transformer  name="xslt" src="org.apache.cocoon.transformation.TraxTransformer"/>

   <map:transform src="transforms/content2rss.xsl"/>

   <map:transform src="transforms/content2svg.xsl"/>

              <map:transform src="transforms/content2fo.xsl"/>

             

<!--Cocoon 支持从网站地图中传递参数。第一种方法是使用 map:parameter 元素来完成该任务。

参数的 name value 都被指定成 map:parameter 元素的属性。

使用这一方法将固定的和动态的参数都传递到样式表中是有可能的。

第二个参数元素的值将由匹配模式中的第一个通配符设置。

只要样式表包含 xsl:param 元素,参数就能正确地被传递到转换。-->

<map:transform src="transforms/content2html.xsl">

  <map:parameter name="myFixedParam" value="fixed-value"/>

  <map:parameter name="myDynamicParam" value="{1}"/>

</map:transform>

 <o:p></o:p>

<!--另一种将参数传递到样式表的方法允许传递所有 URL 请求参数。例如,如果对

 http://localhost:8080/content.html?param1=value1&param2=value2 的请求导致触发这个管道,

 则两个参数(param1 param2)将被传递到样式表。 -->

 <o:p></o:p>

<map:transform src="transforms/content2html.xsl">

  <map:parameter name="use-request-parameters" value="true"/>

</map:transform>           

<!--

当请求中可能被传递的参数个数是可变时,这一方法很有用。但是,这是以牺牲一点性能为代价的,因为 Cocoon 对使用这一方法的转换的结果进行高速缓存的能力低于那些使用固定参数的转换。如果任何 URL 参数改变了,即使不由样式表直接使用,也不会使用高速缓存的结果。-->

</map:transformers>

 <o:p></o:p>

<map:readers default="resource">

  <map:reader name="resource" src="org.apache.cocoon.reading.ResourceReader"/>

</map:readers>

 <o:p></o:p>

<map:serializers default="html">

         <map:serialize type="xml"/>

  <map:serializer name="xml" mime-type="text/xml" src="org.apache.cocoon.serialization.XMLSerializer"/>

  <map:serializer name="html" mime-type="text/html" src="org.apache.cocoon.serialization.HTMLSerializer"/>

  <map:serializer name="svg2png" src="org.apache.cocoon.serialization.SVGSerializer" mime-type="image/png"/>

  <map:serializer name="fo2pdf" src="org.apache.cocoon.serialization.FOPSerializer" mime-type="application/pdf"/>

</map:serializers>

 <o:p></o:p>

<map:matchers default="wildcard">

  <map:matcher name="wildcard" src="org.apache.cocoon.matching.WildcardURIMatcher"/>

</map:matchers>

 <o:p></o:p>

 <o:p></o:p>

 </map:components>

 <o:p></o:p>

<map:pipelines>

  <map:pipeline>

     <map:match pattern="index.html">

        <map:read src="static/index.html" mime-type="text/html"/>

     </map:match>

  </map:pipeline>

<map:pipelines>

 <o:p></o:p>

  <map:pipeline>

     <map:match pattern="*.css">

        <map:read src="styles/{1}.css" mime-type="text/css"/>

     </map:match>

     <map:match pattern="**.html">

        <map:read src="static/{1}.html" mime-type="text/html"/>

     </map:match>

  </map:pipeline>

<!--

单一星号与任意数目的字符匹配,除了正斜杠

双星号与包括正斜杠之外的任意数目字符匹配

index.html 的匹配模式应该在 *.html 之前声明,否则,它将永远不会被匹配。

-->

 <o:p></o:p>

<!--

首先,声明管道以及用来触发它的匹配模式:

-->

<map:pipe>

  <map:match pattern="content/*.html">

<!--下一步,添加一个生成器以从 content 目录中读取 XML 文档:-->

    <map:generate  src="content/{1}.xml"/>

            <!--下一步,添加一个转换器来通过使用特定样式表转换 XML 文档:-->

                <map:transform  src="transforms/content2html.xsl"/>

<!--最后,使用一个序列化器将转换结果变成返回给用户的 HTML 文档:-->

    <map:serialize type="html"/>

  </map:match>

</map:pipe>

 <!--

请求 URL http://localhost:8080/content/document.html 触发这一管道并使 Cocoon 首先对 document.xml 进行解析,然后在将结果传回浏览器之前使用 $COCOON_HOME/transforms/content2html.xsl 来转换它。

-->

</map:sitemap>

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics