竹笋炒肉的cocoon学习笔记


cocoon是一个基于XMLWeb发布框架,提供了一套机制真正实现了内容,逻辑,和表现形式的分离
cocoon具有高效的可配置性和复杂的缓存机制.

1.cocoon的安装
cocoon本身是一个web application,需要在有Servlet engine的服务器中运行。
解开cocoon的安装包(现在稳定的版本是2.0.3),会有一个名为cocoon.war的WAR包,
这是安装唯一用到的文件。将它Copy到TOMCAT_HOME/webapps目录下,然后启动Tomcat,
Tomcat会自动解开cocoon.war到TOMCAT_HOME/webapps/cocoon目录,这时键入URL:
http://localhost:8080/cocoon ,如果看到cocoon的Welcome页面,就表明Cocoon已经
成功的安装了,非常简单。需要注意的是,这时应该关了tomcat,将cocoon.war删除,
原因是我们将要在以后的时间里不断的修改和配置TOMCAT_HOME/webapps/cocoon中的文件,
而cocoon.war已经无用了。

2.cocoon是一个高度的可配置性的环境,有几个文件是和配置有直接关系的。
TOMCAT_HOME/webapps/cocoon/WEB-INF/web.xml
TOMCAT_HOME/webapps/cocoon/WEB-INF/cocoon.xconf
TOMCAT_HOME/webapps/cocoon/WEB-INF/logkit.xconf
TOMCAT_HOME/webapps/cocoon/sitemap.xmap
cocoon本身是web application,自然有web.xml
cocoon.xconf是cocoon的配置文件,相当于JSP中的web.xml文件在JSP中的作用
logkit.xconf是cocoon的日志配置文件,灵活性很大
sitemap是cocoon的一个核心的概念,sitemap.xmap中有许多复杂的配置项,要
会配置他们,首先要对cocoon有一个整体的认识,随着你对cocoon认识的更多,
你对sitemap.xmap的配置也就越了解
 
3.cocoon的基本概念
Pipeline是Cocoon2(cocoon2和cocoon1是有很大的不同的,所以无需知道任何关于
cocoon1的东西)的基本概念.Pipeline由多个cocoon 组件构成,输入流经过Pipeline
到输出流,每个组件会对输入流进行处理,然后送到下一个组件处理,直到最后的
输出。处理的组件和输入流都是在前面提到的sitemap中配置的。
在一个应用中可以有多个Pipleline,每个Pipeline中可以有多个不同的处理,每个
处理和输入的URL有关
 
4.cocoon的基本组件
Matcher :是捕获URL地址,将其和Pipeline的一个处理流向关联
Generator :将输入流转换成Java 的SAX程序,为后续的处理提供SAX程序
Transformer :对Generators产生的SAX程序进行格式转换
Serializers :对经过Generators和Transformer转换的结果产生最后的输出流,
输出流可以是html,xml,wml,jpeg,png,pdf等不同格式的文件.
XSP:全称是eXtension Server Page,也有人叫XML Server Page,是Cocoon提供的一种
服务器脚本语言,类似于JSP或ASP,但是完全基于XML的,它可以作为Generator的输入流
 
5.一个简单的URL请求处理的过程是:
cocoon在sitemap中寻找和URL匹配的Matcher项,然后对应Generator中配置的输入流(通常是
XML文件或XSP文件A,用相关的Generator处理组件处理输入流,接着读取Transformer
的中的输入流B(通常是XSL文件),Transformer组件用B对A进行格式转换(如将XML文件
转换为HTML格式),一个管道中可以有0个或连续多个Transformer处理,最后Serializer
组件根据Serialize的类型(html,wml,pdf,jpeg等)产生最后的输出。
相关的Sitemap片断
<map:pipelines>
    <map:pipeline>
        <map:match pattern="hello">
        <map:generate src="hello.xsp" type="servERPages"/>
        <map:transform src="dynamic-page2html.xsl"/>
        <map:serialize/>
        </map:match>
    </map:pipeline>
</map:pipelines>


  接连看到几篇文章谈cocoon,因其中牵扯术语太多,看后一头雾水,遂起学习之心。


  网上找到很多谈cocoon的,IBM : developerWorks 中国网站 的在线教程写得最棒。下面就是学习笔记,觉得有意思就顺手记下来了。


  以下三行是取源码的命令。
  cvs -d :pserver:anoncvs@cvs.apache.org:/home/cvspublic login
  cvs -d :pserver:anoncvs@cvs.apache.org:/home/cvspublic -z3 checkout -r cocoon_20_branch XML-cocoon2
  cvs -d :pserver:anoncvs@cvs.apache.org:/home/cvspublic logout
  
  管道由一些输入数据以及随后对它进行的一些处理步骤构成。每个处理步骤接受前一步的输出作为输入,一直到达管道的末端并产生最终输出。


  Cocoon 包含许多常规管道组件,根据在管道中扮演的角色,它们分组成几种完全不同的类型。


  管道输入 — 生成器(如FileGenerator,HTMLGenerator,DirectoryGenerator)和阅读器(常用来读静态文件)
  处理步骤 — 转换器(如XSLT 转换器)和操作
  管道输出 — 序列化器(如XML,HTML,SVG,PDF序列化器 )
  条件的处理 — 匹配器和选择器


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


  对接收请求和为响应提供服务的逻辑周期如下:
  1、从用户接受请求。
  2、确定用来解释该请求并生成响应的适当管道(使用匹配器)。
  3、从可用的预配置的组件构造管道。
  4、指示管道为请求服务。
  5、将由管道生成的响应返回用户,可能对结果进行高速缓存以便以后使用。


  网站地图(sitemap)两个功能:
  1、声明组件;
  2、定义管道。


  XML Server Pages(XSP)编译过程如下图:


  XSP语法:
  1、xsp:page 元素是每个 XSP 文档的根元素。它必须有一个标识该页面包含的编程语言 — 具体说就是“Java”— 的语言属性。
  该页面元素可能包含:
   任意数目的 xsp:structure 元素
   任意数目的 xsp:logic 元素
   单个用户元素
  这最后一个限制非常重要。“用户元素”表示不在 XSP 名称空间中的任何元素,包括无名称空间的元素。之所以有这个限制是因为用户元素成为由 XSP 页面创建的 XML 文档的根元素,而 XML 文档只能有单个根元素。


  2、xsp:structure 和 xsp:include 元素用于向代码生成过程提供这些附加提示。这两个元素是一前一后使用的,xsp:structure 元素将许多 xsp:include 元素组合在一起。每个 xsp:include 定义一个要导入的附加 Java 包或类。


  3、xsp:logic 元素用于将 Java 代码块添加到 XSP。
  在这些元素作为 xsp:page 元素的直接子元素出现的任何地方(也就是,单个用户元素以外),这个代码块都应包含方法定义和/或成员变量。之所以存在这一点是因为出现在用户元素以外的代码不包含在生成器的 generate() 方法内。常规的 Java 语法规则意味着这个代码必须是成员或类(也就是,静态)变量或方法。
  xsp:logic 元素也可以使用在 XSP 页面的其它地方。在这种情况下,它们应该包含将被添加到已编译的生成器中的 generate() 方法的 Java 语句。这使 xsp:logic 元素类似于 JSP 页面中使用的 <% ... %>scriptlet 语法。


  4、CDATA 节,它向 XML 解析器发出信号以对于那节内容不采用良好格式规则
  <![CDATA[...]]>


  5、xsp:expr 元素用于封装一个表达式,该表达式的值将直接添加到输出文档。与此相反,xsp:logic 元素包含生成器的代码。因此,xsp:expr 元素等价于在 JSP 中实现类似角色的 <%= ... %> 表达式语法。例如:
<elements>
   <xsp:logic>
      for (int i=1; i<11; i++)
      {
         <element><xsp:expr>i</xsp:expr></element>
      }
   </xsp:logic>
</elements>

  6、通过使用 xsp:element 生成动态元素。如:
<xsp:element prefix="my" uri="http://www.examples.org">
   <xsp:param name="name"><xsp:expr>"myElementName"</xsp:expr></xsp:param>
   Element content
</xsp:element>
这个示例生成了以下 XML 输出:
<my:myElementName xmlns:my="http://www.examples.org">Element content</my:myElementName>


  7、通过使用 xsp:attribute 生成动态属性
<xsp:element>
   <xsp:param name="name"><xsp:expr>"myElementName"</xsp:expr></xsp:param>
   <xsp:attribute name="myAttribute">myAttributeValue</xsp:attribute>
   Element content
</xsp:element>
和(两个例程没关系)
<image>
   <xsp:attribute name="href"><xsp:expr>calculateImageURL()</xsp:expr></xsp:attribute>
</image>


  8、xsp:comment 和 xsp:pi 元素用于创建注释和处理指令。
<xsp:comment>This is a comment</xsp:comment>
然后这个注释变成:
<!-- This is a comment -->
请注意:尽管任何文本将被添加到注释,但任何嵌套标记都被忽略了。


创建处理指令类似于创建动态元素或属性。xsp:pi 元素应该有一个标识处理指令目标的嵌套参数。照例对 xsp:pi 元素的剩余内容求值。这里是一个简单示例:
<xsp:pi target="myApplication">
   <xsp:expr>"param1=value, param2=value, generatorTimestamp=" +
   System.currentTimeMillis()</xsp:expr>
</xsp:pi>
输出如下:
<?myApplication param1=value, param2=value, generatorTimestamp=1017407796870?>


  逻辑单是可以被添加到 XSP 页面的定制元素库,是通过使用 XSLT 转换实现的。这些转换将附加的代码块和/或 XSP 标记引入到 XSP 文档,这样扩展了产生 Generator 类的能力。
  每个逻辑单都与一个特殊的名称空间关联。使用逻辑单仅仅涉及在 XSP 文档中声明相应的名称空间,然后在需要的时候添加来自那个名称空间的元素。如
<xsp:page language="java"
         xmlns:xsp="http://apache.org/xsp"
         xmlns:util="http://apache.org/xsp/util/2.0">
   <clock>
      <day><util:time format="EE"/></day>
      <month><util:time format="MMMM"/></month>
      <year><util:time format="yyyy"/></year>
      <time><util:time format="HH:mm:ss 'on' dd/MM/yyyy"/></time>
   </clock>
</xsp:page>


请注意该页面声明了实用程序的名称空间 http://apache.org/xsp/util/2.0,并使用一个附加的元素,而没有插入任何附加 Java 代码。当对它求值时,这个页面产生:


<clock>
   <day>Fri</day>
   <month>March</month>
   <year>2002</year>
   <time>15:14:27 on 29/03/2002</time>
</clock>


  Cocoon 2 提供了许多预先定义的逻辑单,它们提供大量有用功能,而不必编写 Java 代码。根据这些预先定义的的逻辑单提供的功能类型,可以对它们进行松散分类:
  1、环境(Environmental)逻辑单 — 提供了对 Cocoon 处理环境的访问(例如,请求和响应) ,有以下四个:
  1)请求(request)逻辑单提供了对请求属性的访问,包括对请求参数、请求方法(例如,GET、POST 等等)以及请求标题的访问。当请求参数的某些方面用于改变输出文档的生成时,这个逻辑单就格外有用。
  2)响应(response)逻辑单提供对与当前请求关联的 HTTP 响应的限制访问;它只提供对请求标题的访问。XSP 文档不能用与 Java Servlet 或 JSP 页面相同的方法执行包含或转发,因为分离问题是 Cocoon 2 体系结构的核心部分。这个功能描述在网站地图中;XSP 页面生成 XML 内容而不指导处理。
  3)会话(session)逻辑单提供了对 HTTP 会话信息的访问,包括创建和删除会话以及添加和除去会话属性的能力。很明显,这个功能在必须为上下文维护用户会话的 Web 应用程序中是最有用的。Cocoon 2 中的会话管理正好等价于它的 JSP 对手。
  4)cookie 逻辑单提供了 cookie 维护功能,诸如添加和除去 cookie、允许优先存储到用户的浏览器中。



  2、实用程序逻辑单 — 多用途实用程序代码(例如,文件包含、日志记录、发送邮件等等)
  有三个逻辑单,每个逻辑单都提供了一些简单的实用程序功能。
  1)日期和时间


  2)日志(log)逻辑单处理用户请求时,它允许从 XSP 生成器上写入日志消息。如:
<log:debug>This is a debug message from an XSP generator</log:debug>
还有附加的 info、warn、error 和 fatal-error 元素用于写其它各种日志语句。


  3)发送邮件(sendmail) 逻辑单包含了一个提供从 XSP 页面对 JavaMail API 访问的有用元素,如:
<sendmail:send-mail from="myemail@email.com" to="user@user.com" smtphost="smtphost@email.com">
   <xsp:param name="subject"><xsp:expr>"The subject of this email..."</xsp:expr></xsp:param>
   <xsp:param name="body"><xsp:expr>"The body of this email..."</xsp:expr></xsp:param>
</sendmail:send-mail>


  3、数据操作 — 提供了对数据验证和与数据库关联的功能的访问
有两个逻辑单属于该类别,其中的一个提供了比另一个明显更多的功能。


  表单验证器(form validator)逻辑单从未真正单独使用。它向 Cocoon 表单验证器行为(Cocoon Form Validator Action)提供一个整齐的界面。这个行为能够对从 HTML 表单发送到 Cocoon 应用程序的数据执行基本验证操作,包括检查整数的最小和最大值、检查字符串的大小以及检查提供的某些参数。一个著名功能是能够测试传递的变量是否匹配给定的正则表达式。


  验证的结果存储在请求参数中。验证器(validator)逻辑单提供了解释来自 XSP 页面内的这些结果的方法。这样允许为用户动态生成错误消息。


  在数据被确认为有效之后,下一步是将那个数据存储到数据库中。esql 逻辑单提供了执行这一步的方法,并提供了更多的功能,包括选择、删除和更新数据库。本质上,esql 逻辑单提供了将 SQL 语句直接嵌入到 XSP 文档的方法。然后这个逻辑单生成相应的 JDBC 代码来实现 SQL 操作,这样通过使用 Cocoon 2 简化了对数据库数据的操作和检索。


没有评论: