XML Server Pages(XSP) 笔记<!----><o:p></o:p>
1、基本概念
XSP可以将动态数据添加到XML 文档中以创建更丰富的网站,也可以使 Cocoon 2 集成现有数据源和/或 API 以在因特网上用多种格式发布数据。它是一种能够创建动态 XML 数据源以便将数据传输到 Cocoon 2 管道的 Cocoon 2 技术。通过使用 XML 标记和应用逻辑的组合来描述这些数据源,然后由 Cocoon 2 引擎自动将这种组合编译为 Java 类。XSP 为使用 Cocoon 2 开发应用程序提供了一个灵活的平台。例如,Cocoon 2 应用程序可以显示现有应用程序数据库中的信息,而且启用了更为多样的数据发送选项。通过提供一种通过 XML 界面显示数据源的方法,XSP 允许在诸如中间件和文档发布那样的应用程序集成环境中使用 Cocoon 2。
1.1 XSP 与 JSP<o:p></o:p>
1.1.1相同点:
1)由程序代码和标记的混合体组成
2)被编译成用于执行的二进制形式
3)允许创建定制标记库
1.1.2不同点:
1) XSP 为将任何编程语言中的代码与 XML 标记混合在一起提供了一个框架。
2) XSP 生成动态数据<o:p></o:p>
XSP 生成动态数据,而不是动态表示。与之不同,JSP 则是一种通常用于在一系列处理步骤的最后阶段产生 HTML 或 XML 的表示层技术。XSP 页面为 Cocoon 管道生成 XML 数据,而由管道创建了所期望的表示。<o:p></o:p>
<o:p></o:p>
1.2 XSP 编译过程
- 解析 XSP 文档 <o:p></o:p>
- 通过使用专用 XSLT 样式表转换 XSP 页面,以生成 Java 源代码 <o:p></o:p>
- 通过使用代码格式化器,在整齐地缩排和格式化源代码后,存储结果 Java 文件 <o:p></o:p>
- 将源代码编译成生成器 <o:p></o:p>
- 在请求管道中装入并执行已编译的生成器 <o:p></o:p>
<!----><v:shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype><v:shape id="_x0000_i1025" style="WIDTH: 277.5pt; HEIGHT: 400.5pt" alt="" type="#_x0000_t75"><v:imagedata o:href="http://img174.photo.163.com/bibi_ye/23032252/586367880.jpg" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image001.gif"></v:imagedata></v:shape><o:p></o:p>
<o:p></o:p>
1.3 一个XSP运行例子
Cocoon 2 提供了一个协调个别 XSP 页面的编译和执行的 ServerPagesGenerator
组件。在网站地图中,ServerPagesGenerator
声明如下:<o:p></o:p>
<map:generators default="file"><o:p></o:p>
<map:generator name="xsp" src="org.apache.cocoon.generation.ServerPagesGenerator"/><o:p></o:p>
<!-- ... other generator declarations ... --><o:p></o:p>
</map:generators><o:p></o:p>
要在管道中使用这个生成器,只须简单声明应当使用(而不是缺省值)并且指出在何处可以找到特定的 XSP 页面的源代码,如下所示:<o:p></o:p>
<map:pipeline><o:p></o:p>
<map:match pattern="tutorial/*.xml"><o:p></o:p>
<map:generate type="xsp" src="tutorial/{1}.xsp"/><o:p></o:p>
<map:serialize type="xml"/><o:p></o:p>
</map:match><o:p></o:p>
</map:pipeline><o:p></o:p>
<o:p></o:p>
2、语法
2.1 xsp:page 元素
xsp:page
元素是每个 XSP 文档的根元素。<o:p></o:p>
<xsp:page language="java" xmlns:xsp="http://apache.org/xsp"><o:p></o:p>
<!-- page contents --><o:p></o:p>
</xsp:page><o:p></o:p>
2.2 xsp:structure 和 xsp:include 元素
当添加利用标准或定制 Java API 的编程逻辑时,必须在 XSP 中指出生成的源代码中需要另外的 import 语句以确保编译成功地完成。xsp:structure
和 xsp:include
元素用于向代码生成过程提供这些附加提示。<o:p></o:p>
<xsp:page language="java" xmlns:xsp="http://apache.org/xsp"><o:p></o:p>
<xsp:structure><o:p></o:p>
<xsp:include>java.util.Calendar</xsp:include><o:p></o:p>
<xsp:include>java.text.*</xsp:include><o:p></o:p>
</xsp:structure><o:p></o:p>
<!-- page contents --><o:p></o:p>
</xsp:page><o:p></o:p>
<o:p></o:p>
2.3 xsp:logic 元素
xsp:logic
元素用于将 Java 代码块添加到 XSP。例如:<o:p></o:p>
<xsp:page language="java" xmlns:xsp="http://apache.org/xsp"><o:p></o:p>
<xsp:logic><o:p></o:p>
public String getTime()<o:p></o:p>
{<o:p></o:p>
return java.util.Calendar.getInstance().getTime().toString();<o:p></o:p>
}<o:p></o:p>
</xsp:logic><o:p></o:p>
<document/><o:p></o:p>
</xsp:page><o:p></o:p>
<o:p></o:p>
<xsp:page language="java" xmlns:xsp="http://apache.org/xsp"><o:p></o:p>
<document><o:p></o:p>
<xsp:logic><o:p></o:p>
SimpleDateFormat format = new SimpleDateFormat("EEE, MMM d, yyyy");<o:p></o:p>
String timestamp = format.format(<o:p></o:p>
java.util.Calendar.getInstance().getTime()<o:p></o:p>
);<o:p></o:p>
</xsp:logic><o:p></o:p>
<time><xsp:expr>timestamp</xsp:expr></time><o:p></o:p>
<!-- additional elements --><o:p></o:p>
</document><o:p></o:p>
</xsp:page>
<o:p></o:p>
这个代码包含了对 XSP 文档求值时创建时间戳记的逻辑。然后通过使用 xsp:expr
,这个时间戳记被添加到了 time
元素内的文档中。<o:p></o:p>
2.4 避免错误,保持良好的格式
2.4.1
程序代码与 XML 标记<o:p></o:p>
把 if (a < b && c > d) { ... }改为①if (a < b && c >) { ... }或者②<o:p></o:p>
<xsp:logic><o:p></o:p>
<![CDATA[<o:p></o:p>
if (a < b && c > d) { ... }<o:p></o:p>
]]><o:p></o:p>
</xsp:logic><o:p></o:p>
但是②
将忽略这些节内出现的任何 XSP 或用户元素,而将它们当作纯文本而不是 XML 标记进行处理,这样更可能导致隐蔽的、耗时的错误。<o:p></o:p>
2.4.2
xsp:logic
元素内 XML格式规则
以下有错:<o:p></o:p>
<search-results><o:p></o:p>
<xsp:logic><o:p></o:p>
if (firstResult())<o:p></o:p>
{<o:p></o:p>
<result id="first"><o:p></o:p>
} else<o:p></o:p>
{<o:p></o:p>
<result><o:p></o:p>
}<o:p></o:p>
<!-- ...result generation code here... --><o:p></o:p>
</result><o:p></o:p>
</xsp:logic><o:p></o:p>
</search-results><o:p></o:p>
应改为<o:p></o:p>
<search-results><o:p></o:p>
<xsp:logic><o:p></o:p>
if (firstResult())<o:p></o:p>
{<o:p></o:p>
<result id="first"><o:p></o:p>
<!--... handle first result..--><o:p></o:p>
</result><o:p></o:p>
} else<o:p></o:p>
{<o:p></o:p>
<result><o:p></o:p>
<!--...handle other results...--><o:p></o:p>
</result><o:p></o:p>
}<o:p></o:p>
</xsp:logic><o:p></o:p>
</search-results>
<o:p></o:p>
<o:p></o:p>
2.5 xsp:expr 元素
xsp:expr
元素等价于在 JSP 中实现类似角色的 <%= ... %>
表达式语法。<o:p></o:p>
<elements><o:p></o:p>
<xsp:logic><o:p></o:p>
for (int i=1; i<11; i++)<o:p></o:p>
{<o:p></o:p>
<element><xsp:expr>i</xsp:expr></element><o:p></o:p>
}<o:p></o:p>
</xsp:logic><o:p></o:p>
</elements><o:p></o:p>
2.6 通过使用 xsp:element 生成动态元素<o:p></o:p>
通过使用 xsp:element
,还可以动态地创建元素,它的工作原理类似于其 XSLT 等价机制的工作原理。<o:p></o:p>
<xsp:element><o:p></o:p>
<xsp:param name="name"><xsp:expr>"myElementName"</xsp:expr></xsp:param><o:p></o:p>
Element content<o:p></o:p>
</xsp:element><o:p></o:p>
还可以与一个特定的名称空间和前缀关联<o:p></o:p>
<xsp:element prefix="my" uri="http://www.examples.org"><o:p></o:p>
<xsp:param name="name"><xsp:expr>"myElementName"</xsp:expr></xsp:param><o:p></o:p>
Element content<o:p></o:p>
</xsp:element><o:p></o:p>
这个示例生成了以下 XML 输出:<o:p></o:p>
<my:myElementName xmlns:my="http://www.examples.org">Element content</my:myElementName><o:p></o:p>
还可能动态地生成名称空间 URI 和前缀。无须添加 prefix
和 uri
属性,而是使用带适当名称的附加 xsp:param
元素。下列代码等价于上面的示例:<o:p></o:p>
<xsp:element prefix="my" uri="http://www.examples.org"><o:p></o:p>
<xsp:param name="name"><xsp:expr>"myElementName"</xsp:expr></xsp:param><o:p></o:p>
<xsp:param name="prefix">"my"</xsp:param><o:p></o:p>
<xsp:param name="uri">"http://www.examples.org"</xsp:param><o:p></o:p>
Element content<o:p></o:p>
</xsp:element><o:p></o:p>
2.7 通过使用 xsp:attribute 生成动态属性
xsp:attribute
元素的工作原理类似于 xsp:element
,它允许动态创建属性的名称及其值:<o:p></o:p>
<xsp:element><o:p></o:p>
<xsp:param name="name"><xsp:expr>"myElementName"</xsp:expr></xsp:param><o:p></o:p>
<xsp:attribute name="myAttribute">myAttributeValue</xsp:attribute><o:p></o:p>
Element content<o:p></o:p>
</xsp:element><o:p></o:p>
这个属性的名称定义在 name
属性内,尽管是用与 xsp:element
类似的方法定义的,但它还能通过使用 xsp:param
子元素来定义。属性值被指定成元素内容。这可以是一个简单文本值或更有效地由 xsp:expr
元素生成。<o:p></o:p>
2.8 创建注释和处理指令<o:p></o:p>
2.8.1 创建注释:<o:p></o:p>
<xsp:comment>This is a comment</xsp:comment>
<o:p></o:p>
然后这个注释变成:<o:p></o:p>
<!-- This is a comment --><o:p></o:p>
2.8.2 创建处理指令类似于创建动态元素或属性:
<xsp:pi target="myApplication"><o:p></o:p>
<xsp:expr>"param1=value, param2=value, generatorTimestamp=" +<o:p></o:p>
System.currentTimeMillis()</xsp:expr><o:p></o:p>
</xsp:pi>
<o:p></o:p>
输出如下:<o:p></o:p>
<?myApplication param1=value, param2=value, generatorTimestamp=1017407796870?>
<o:p></o:p>
还可以通过在 xsp:param
元素内创建处理指令的目标来自动生成它,如同以下示例演示的那样:<o:p></o:p>
<xsp:pi><o:p></o:p>
<xsp:param name="target"><xsp:expr>"myApplication"</xsp:expr></xsp:param><o:p></o:p>
<xsp:expr>"param1=value, param2=value, generatorTimestamp=" +<o:p></o:p>
System.currentTimeMillis()</xsp:expr><o:p></o:p>
</xsp:pi><o:p></o:p>
<o:p></o:p>
3 逻辑单
逻辑单是能被钩接入代码生成过程以允许创建定制标记库的 XSLT 转换。这些逻辑单使 XSP 页面更容易处理,从而减少了直接嵌入代码的需要。
3.1 使用逻辑单
每个逻辑单都与一个特殊的名称空间关联。使用逻辑单仅仅涉及在 XSP 文档中声明相应的名称空间,然后在需要的时候添加来自那个名称空间的元素。<o:p></o:p>
<o:p></o:p>
<xsp:page language="java"<o:p></o:p>
xmlns:xsp="http://apache.org/xsp"<o:p></o:p>
xmlns:util="http://apache.org/xsp/util/2.0"><o:p></o:p>
<clock><o:p></o:p>
<day><util:time format="EE"/></day><o:p></o:p>
<month><util:time format="MMMM"/></month><o:p></o:p>
<year><util:time format="yyyy"/></year><o:p></o:p>
<time><util:time format="HH:mm:ss 'on' dd/MM/yyyy"/></time><o:p></o:p>
</clock><o:p></o:p>
</xsp:page><o:p></o:p>
3.2内置逻辑单<o:p></o:p>
3.2.1 环境逻辑单
在这个环境类别中有四个逻辑单,每个逻辑单都提供对与 Web 请求关联的处理环境的特殊方面的访问。这些逻辑单提供的功能类似于与 JSP 页面关联的隐式对象(例如,request
和 response
对象)提供的功能,并且是从 HTTP Servlet API 中直接提取的。<o:p></o:p>
分享到:
相关推荐
用过Apache Cocoon技术吗? 知道XSP吗? 这本资料可以让你快速入门。
Cocoon最初的型态是一个简单的Java servlet,全部使用标准W3C组件:用文档对象模型(DOM)来...就目前来说,我们可采取几种不同的方式来描述Cocoon:一个XML发布框架,一个数据源聚合器以及一系列管道和组件的集合。
统一必然带来极大的好处,那就是:有许许多多技术方案支持它、扩展它,例如:DOM、XSLT、SVG、VRML、SOAP、Cocoon、XSP等等。XML可以单独作为一种小型数据库,也可以作为大中型数据库(例如SQL Server、Oracle、...
cocoon
Stefano Mazzocchi于1999年1月创建了Cocoon项目,将其...Cocoon使用XML, Extensible Stylesheet Language Transformations (XSLT), 以及 Simple API for XML (SAX) 技术,以帮助创建、部署和维护XML服务器应用程序。
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用