XDoclet 提供了自己的模板引擎。该模板引擎在概念上类似于 JavaServer Pages(JSP)技术。它实质上包含两类标记:块标记(block tag)和内容标记(content tag)。块标记控制如 Java 编程语言中的 if
和 for
语句之类的流。内容标记打印当前解析树上下文的片段,如类名称、方法名称和参数,等等。
我可以整天谈论 XDoclet,但是如果您象我一样,那么您会希望我“给出代码”。无需多言,这里有一个简单的模板,它寻找所有的实体 Bean(EntityBean),然后打印出它们的类名称及其所有 cmp 字段的名称:
<XDtClass:forAllClasses type="javax.ejb.EntityBean">
Classname=<XDtClass:className/>
<XDtProperty:forAllPropertiesWithTag tagName="ejb.persistence">
CMP Field = <XDtMethod:propertyName/>
</XDtProperty:forAllPropertiesWithTag>
</XDtClass:forAllClasses>
这个简单的模板同时演示了块标记和内容标记。forAllClasses
是一个块标记示例,它遍历传递给模板引擎的所有类,这些类是通过调用 XDoclet 的 ant 构建文件中的 fileset
传递的。forAllClasses
使用 type
属性(type="javax.ejb.EntityBean"
)过滤掉不属于类型 javax.ejb.EntityBean 的那些类。
className
是内容标记的一个示例,它打印出当前类的名称。
forAllProperitesWithTag
是另一个块标记示例。它遍历实现类中所有具有 XDoclet 标记 @ejb.persistence
的特性(这些特性与该 bean 的 cmp 字段相关)。最后,propertyName
是内容标记的另外一个示例,因为它在遍历过程中显示当前特性名称。
由于其他所有示例都建立在这些简单概念之上,因此让我们对这些概念作一下划分。下图用黑色粗体字体显示了块标记,用红色粗体字体显示了内容标记。另外,这些块还用圆矩形框来演示其范围。
该项目的这个代码模板的输出如下:
Classname=EmployeeBean CMP Field = id CMP Field = firstName CMP Field = lastName CMP Field = phone Classname=DeptBean CMP Field = id CMP Field = name
要运行该模板,您的 ant 构建文件中将需要下列代码:
<target name="templatedoclet" > <taskdef name="templatedoclet" classname="xdoclet.DocletTask" classpathref="xdocpath" /> <templatedoclet destdir="test"> <fileset dir="${src}"> <include name="**/*Bean.java"/> </fileset> <template templateFile="template/template.xdt" destinationfile="test.txt"/> </templatedoclet> </target>
templatedoclet
任务用来执行模板。fileset
子元素用于指定:您只想要 src 目录中以“Bean.java”结尾的文件。模板子任务用于指定被使用的模板文件以及目标文件。上面的示例执行我较早的时候定义的模板(template/template.xdt)并将结果输出到 text.txt。请参阅下图以获取更多详细信息。
要真正地理解如何有效地开发定制 XDoclet 模板,您应该理解 XDoclet 体系结构 ― 因此请允许我先解释一下体系结构,然后再进一步讨论。