最后更新时间:2007-08-29 关键字: web

来自:http://blog.csdn.net/buaawhl/archive/2006/07/14/920842.aspx

请注意新的引擎RoseForJ

RoseForJ的思路是 Velocity在XML DOM领域的扩展。

如果说,Fastm = JDynamiTe + Wicket;DOMPlus = XMLC + Wicket,那么RoseForJ=xmlc+wicket+velocity

Scripted Template


前面讲述了评估指标。下面分别各项技术进行单项说明。

(1) Scripted Template

HTML和Server Side Script混杂在一起的显示层技术。

包括JSP, Velocity, Freemarker, Taglib, Tapestry, XSL等。

 

Server Side的这些Scripted Template技术比较流行,耳闻能详。前面进行指标描述的时候,各种参数,也基本上涉及到了。就不具体展开进行单项的用法说明和特性分析。

JSP, Velocity, Freemarker的优势在于这些技术对用户后台Java代码侵入性非常低,这些Template都可以任意替换,而不影响用户后台Java代码。

 

下面讲述另外两类不是很常见的技术。

(2)Template Manipulation

Java代码直接操作Template(比如,HTML DOM)产生结果的显示层技术。

包括XMLC, JDynamiTe, Rife等。

 

(3) Model Match

Java代码负责提供符合显示层要求的Data Model,显示层框架本身把Data Model和Template进行匹配,产生结果。

包括Wicket, Fastm, DOMPlus, 等。

Template Manipulation
Java代码直接操作Template(比如,HTML DOM)产生结果的显示层技术。

包括XMLC, JDynamiTe, Rife等。

这类技术都具有良好的所见即所得特性。

(1)XMLC
http://xmlc.enhydra.org/

XMLC把一个HTML文件翻译成一个Java HTML DOM Class,

比如,

... ...

这些具有id的HTML元素,在Java HTML DOM Class都产生了对应的方法。

HTMLElement getElementPara1()

public void setTextPara1(String text)

HTMLTitleElement getElementTitle()

HTMLInputElement getElementNameInput();

 

比如, CLASS="class1 class2">

就产生了如下的Constant Fields.

   public static final String NAME_myName;

   public static final String CLASS_class1;

   public static final String CLASS_class2;

 

具体操作代码如下,

HTMLObject htmlObj = new HelloHTML();

// Construct head

HTMLHeadingElement head = htmlObj.createElement("h1");

Text headText = htmlObj.createText("Hello World");

head.appendChild(htmlTest);

 

// Construct anchor

HTMLAnchorElement anchor = htmlObj.createElement("a");

anchor.setHref("Welcome.po");

Text anchorText = htmlObj.createText("Welcome Page");

anchor.appendChild(anchorText);

 

// Replace contents of id-labeled node.

Element replace = htmlObj.getElementReplaceme();

Element parent = replace.getParent();

 

// Start with the last new child so we can use insertBefore

parent.replaceChild(anchor, replace);

parent.insertBefore(head, anchor);

 

可以看到,用户的Action Code里面充满了HTML DOM Node的添加删除操作。而且里面使用的代码都不是标准的DOM操作方法,而是代码生成的方法。代码侵入性非常强,如果要换成别的Template,比如JSP, velocity所有的代码都要作废。

当然XMLC产生的是一个DOM,后面还是可以接续XSL的。

 

一般来说,XML DOM操作只能针对完整的Node。一般需要替换整个Attribute,整个Text。

对于,http://www.mobi99.cn

另外有一个不常见的需求。动态替换Java Script代码的里面的某一部分。这时候,XMLC就完全无能为力了。或许也可以引入外来的Text Parser Engine,比如Velocity, Freemarker, Fastm, JDynamicTe等来做这件事情。

 

XMLC的主要问题还是空间效率问题。每次请求,用户需要产生一个Java DOM Class副本,进行操作。如果有多个用户访问同一个Page,那么就同时存在多个Java DOM Class副本。

当然里面的静态文本资源是共享的,我们看到上面的Java DOM Class里面,产生了很多String常数。

但是DOM Node结构本身的尺寸就比较大。即使采用了一些优化简化的DOM Parser,去除了用不到的结构,整个尺寸还是比较大。

(2) JDynamiTe
http://jdynamite.sourceforge.net/doc/jdynamite.html

 

JDynamiTe是PHPLib Template的移植。采用XML Comment的方式标记动态结构块。

我们来看一个典型的两层循环的例子。