代码生成不是
![](/icons/88626yi.gif)
个新概念
![](/icons/88626dou2.gif)
它出现有
![](/icons/88626yi.gif)
段时间了
![](/icons/88626dou.gif)
而且作为提高生产力
![](/icons/88626de.gif)
![](/icons/88626yi.gif)
种方式
![](/icons/88626dou.gif)
随着模型驱动开发(MDD)
![](/icons/88626de.gif)
发展而普及开来
![](/icons/88626dou2.gif)
Eclipse 项目有
![](/icons/88626yi.gif)
个称为 JET
![](/icons/88626de.gif)
技术项目就是
![](/icons/88626yi.gif)
个专门
![](/icons/88626de.gif)
代码生成器
![](/icons/88626dou2.gif)
JET 所能生成
![](/icons/88626de.gif)
不仅仅是 “代码”
![](/icons/88626dou.gif)
无论如何
![](/icons/88626dou.gif)
在本文中我们称这些非编码
![](/icons/88626de.gif)
物件为工件(art
![](/icons/88626if.gif)
iact)
![](/icons/88626dou2.gif)
开始
在本节中
![](/icons/88626dou.gif)
我们将介绍 JET 项目设置基础
![](/icons/88626dou.gif)
讨论 JET 项目
![](/icons/88626de.gif)
结构
![](/icons/88626dou.gif)
然后运行
![](/icons/88626yi.gif)
个快速转换
![](/icons/88626dou2.gif)
创建
![](/icons/88626yi.gif)
个 JET 项目
在实际接触 JET 的前
![](/icons/88626dou.gif)
我们需要创建
![](/icons/88626yi.gif)
个项目
![](/icons/88626dou2.gif)
使用创建项目
![](/icons/88626de.gif)
标准 Eclipse 思路方法来实现
![](/icons/88626dou2.gif)
就 JET 来说
![](/icons/88626dou.gif)
使用命令 File > New > Other > EMFT JET Transformations > EMFT JET Transformation Project(请参见图 1)创建
![](/icons/88626yi.gif)
个 EMFT JET Transformation Project
![](/icons/88626dou2.gif)
图 1. JET 项目向导
![](http://www.crazycoder.cn/WebFiles/20092/11c76667-aa05-4c4d-9563-ea34881dd7e2.jpg)
JET 项目结构
让我们分析项目结构来搞清楚 JET 是如何工作
![](/icons/88626de.gif)
![](/icons/88626dou2.gif)
在上面
![](/icons/88626de.gif)
部分
![](/icons/88626dou.gif)
我们创建了
![](/icons/88626yi.gif)
个 JET 项目(参见图 2)
![](/icons/88626dou2.gif)
在该 JET 项目中
![](/icons/88626dou.gif)
我们需要浏览 6个文件
![](/icons/88626dou2.gif)
图 2. JET 项目结构
![](http://www.crazycoder.cn/WebFiles/20092/28afb7ca-3291-4a3c-a35a-71d1b0eb77c1.jpg)
Eclipse 项目文件(MANIFEST.MF, plugin.xml, build.properties) 这是使用 Eclipse 项目时所创建
![](/icons/88626de.gif)
标准文件
![](/icons/88626dou2.gif)
对于这些文件需要注意
![](/icons/88626de.gif)
![](/icons/88626yi.gif)
件重要事情是:在 plugin.xml 中
![](/icons/88626dou.gif)
JET 将自动添加 org.eclipse.jet.transform
![](/icons/88626dou2.gif)
通过扩展该扩展点
![](/icons/88626dou.gif)
我们让 JET 知道我们在提供
![](/icons/88626yi.gif)
个 JET 转换
![](/icons/88626dou2.gif)
控制和模板文件(dump.jet,
![](/icons/88626main.gif)
.jet) 这是在转换中所使用
![](/icons/88626de.gif)
模板和控制文件
![](/icons/88626dou2.gif)
将在下面
![](/icons/88626de.gif)
概念部分讨论其细节
![](/icons/88626dou2.gif)
输入模型(sample.xml) 这里我们可以看到用于转换
![](/icons/88626de.gif)
![](/icons/88626yi.gif)
个举例输入文件
![](/icons/88626dou2.gif)
注意该输入可以来自任何源
![](/icons/88626dou.gif)
并不限于项目
![](/icons/88626dou2.gif)
运行 JET 转换
![](/icons/88626yi.gif)
旦有了
![](/icons/88626yi.gif)
个项目
![](/icons/88626dou.gif)
拥有合适
![](/icons/88626de.gif)
模板、控制文件和
![](/icons/88626yi.gif)
个输入模型
![](/icons/88626dou.gif)
我们就可以运行转换
![](/icons/88626dou2.gif)
通过熟悉
![](/icons/88626de.gif)
Eclipse 概念 —— 启动配置(参见图 3)
![](/icons/88626dou.gif)
JET 提供了
![](/icons/88626yi.gif)
个方便
![](/icons/88626de.gif)
方式来
![](/icons/88626diaoyong.gif)
转换
![](/icons/88626dou2.gif)
要访问 JET 启动配置
![](/icons/88626dou.gif)
我们转到 Run > JET Transformation
![](/icons/88626dou.gif)
填充合适
![](/icons/88626de.gif)
选项
![](/icons/88626dou.gif)
然后单击 Run
![](/icons/88626dou2.gif)
图 3. JET 启动配置
![](http://www.crazycoder.cn/WebFiles/20092/91b28428-6f75-47d8-ad5e-449571ed8e0f.jpg)
概念
JET 是指定模板输出工件
![](/icons/88626de.gif)
语言
![](/icons/88626dou2.gif)
实现
![](/icons/88626yi.gif)
些应用
![](/icons/88626chengxu.gif)
![](/icons/88626de.gif)
模板集合被称为蓝图(bluepr
![](/icons/88626int.gif)
)(用我们
![](/icons/88626de.gif)
术语)
![](/icons/88626dou2.gif)
JET 范例可以用下列等式表示:
参数 + 蓝图 = 所需
![](/icons/88626de.gif)
工件
蓝图是由 JET 创建
![](/icons/88626de.gif)
![](/icons/88626dou.gif)
而参数是由蓝图用户提供
![](/icons/88626de.gif)
![](/icons/88626dou2.gif)
蓝图由 3个区别
![](/icons/88626de.gif)
文件集组成:
1. 参数 用于蓝图
![](/icons/88626de.gif)
参数使用 XML 格式
![](/icons/88626dou2.gif)
这赋予它强大
![](/icons/88626de.gif)
表现力
![](/icons/88626dou.gif)
![](/icons/88626yinwei.gif)
XML 允许使用层次化关系、允许每个节点具有属性
![](/icons/88626dou2.gif)
输入参数被称为输入模型
![](/icons/88626dou2.gif)
蓝图将定义描述其期望参数
![](/icons/88626de.gif)
模式
![](/icons/88626dou2.gif)
例如
![](/icons/88626dou.gif)
下面是蓝图创建网络嗅探器
![](/icons/88626de.gif)
输入例子:
清单 1. 网络嗅探器蓝图
![](/icons/88626de.gif)
输入
<app project="NetworkSn
fer" >
<sn
fer name="sampler" sample_probability=".7" >
<logFile name="packet_types" />
<packet type="TCP" subType="SYN" >
<logToFile name="packet_types" />
<findResponse type="TCP" subType="ACK" timeout="1" />
</packet>
<packet type="UDP" >
<logToFile name="packet_types" />
</packet>
</sn
fer>
</app>
蓝图将转换这些输入参数为实现该网络嗅探器
![](/icons/88626de.gif)
代码
![](/icons/88626dou2.gif)
蓝图
![](/icons/88626de.gif)
参数可视为自定义编程语言
![](/icons/88626dou.gif)
而蓝图扮演 “编译器”
![](/icons/88626de.gif)
角色
![](/icons/88626dou.gif)
将输入转换为本机工件
![](/icons/88626dou2.gif)
2. 控制文件 这些文件控制代码生成
![](/icons/88626de.gif)
执行
![](/icons/88626dou2.gif)
控制标记中最重要
![](/icons/88626de.gif)
标记是 <ws:file>
![](/icons/88626dou.gif)
它将执行
![](/icons/88626yi.gif)
个模板并将结果转储至指定
![](/icons/88626de.gif)
文件
![](/icons/88626dou2.gif)
代码生成执行从
![](/icons/88626main.gif)
.jet 开始
![](/icons/88626dou.gif)
这和
![](/icons/88626chengxu.gif)
![](/icons/88626hanshu.gif)
类似
![](/icons/88626dou2.gif)
3. 模板文件 模板文件指定如何以及何种情况下生成文本
![](/icons/88626dou2.gif)
该文本可以是代码、配置文件或其他
![](/icons/88626dou2.gif)
XPath
既然任何 JET 蓝图
![](/icons/88626de.gif)
输入都是
![](/icons/88626yi.gif)
个 XML 模型
![](/icons/88626dou.gif)
XPath 语言被用来引用节点和属性
![](/icons/88626dou2.gif)
此外
![](/icons/88626dou.gif)
在表达式里 XPath 有自己
![](/icons/88626de.gif)
参数使用方式
![](/icons/88626dou.gif)
这在 JET 里使用得非常多
![](/icons/88626dou2.gif)
要点如下:
路径表达式 和文件系统路径相似
![](/icons/88626dou2.gif)
路径是由斜杠分开
![](/icons/88626de.gif)
![](/icons/88626yi.gif)
系列步(/)
从左向右估算步
![](/icons/88626dou.gif)
如果这样做
![](/icons/88626dou.gif)
通常会下行模型树
每步通过其名字定义树节点(尽管存在其他可能性)
在步
![](/icons/88626de.gif)
结尾
![](/icons/88626dou.gif)
步可以在方括号([ 和 ])中编写可选
![](/icons/88626de.gif)
过滤器条件
![](/icons/88626chushi.gif)
斜杠(/)指示表达式开始于模型树
![](/icons/88626de.gif)
根
路径表达式还可以以变量开始
![](/icons/88626dou.gif)
变量是以美元符号($)开头
![](/icons/88626de.gif)
名字
有关 JET 中
![](/icons/88626de.gif)
XPath
![](/icons/88626dou.gif)
应记住以下几个要点:
变量是由几个 JET 标记定义
![](/icons/88626de.gif)
- 注意 var 属性
![](/icons/88626dou2.gif)
它们可能也是由 c:
![](/icons/88626set.gif)
Variable 标签定义
![](/icons/88626de.gif)
需要路径表达式
![](/icons/88626de.gif)
JET 标签有
![](/icons/88626yi.gif)
个 select 属性
任何标签属性都可能包含
![](/icons/88626yi.gif)
个动态
![](/icons/88626de.gif)
XPath 表达式
![](/icons/88626dou.gif)
是由括号({ 和 })所包含
![](/icons/88626de.gif)
XPath 表达式
JET 标签
下例将使用下列输入模型
![](/icons/88626dou2.gif)
清单 2. 输入模型
<app middle="Hello" >
<person name="Chris" gender="Male" />
<person name="Nick" gender="Male" />
<person name="Lee" gender="Male" />
<person name="Yasmary" gender="Female" />
</app>
ws:file 该标签属于蓝图
![](/icons/88626de.gif)
control 部分
![](/icons/88626dou.gif)
它
![](/icons/88626chushi.gif)
化
![](/icons/88626yi.gif)
个模板
![](/icons/88626dou2.gif)
例如:
<ws:file template="templates/house.java.jet"
path="{$org.eclipse.jet.resource.project.name}/house1.java">
将在输入模型上运行 house.java.jet 模板并将结果转储在 $(Project Root)/house1.java 中
![](/icons/88626dou2.gif)
{$org.eclipse.jet.resource.project.name} 是
![](/icons/88626yi.gif)
个动态 XPath 表达式
![](/icons/88626dou.gif)
用 org.eclipse.jet.resource.project.name 变量
![](/icons/88626de.gif)
值替换部分
![](/icons/88626zifu.gif)
串
![](/icons/88626dou2.gif)
该变量是由 JET 引擎定义
![](/icons/88626de.gif)
![](/icons/88626dou2.gif)
c:get 该标签将输出 XPath 表达式
![](/icons/88626de.gif)
结果
![](/icons/88626dou2.gif)
例如
![](/icons/88626dou.gif)
Pre<c:get select="/app/@middle" />Post 将输出 PreHelloPost
![](/icons/88626dou2.gif)
注意 select 参数将使用 XPath 表达式
![](/icons/88626dou2.gif)
要在期望静态
![](/icons/88626zifu.gif)
串
![](/icons/88626de.gif)
参数中使用 XPath 表达式
![](/icons/88626dou.gif)
可以通过将表达式封装在括号({ 和 })中来
![](/icons/88626diaoyong.gif)
动态 XPath 表达式
![](/icons/88626dou2.gif)
c:iterate 该标签将遍历具有特定名称
![](/icons/88626de.gif)
节点
![](/icons/88626dou.gif)
为每个节点执行 iterate
![](/icons/88626de.gif)
主体
![](/icons/88626dou2.gif)
例如:
<c:iterate select="/app/person" var="currNode" delimiter="," >
Name = <c:get select="$currNode/@name" />
</c:iterate>
将输出 Name = Chris, Name = Nick, Name = Lee, Name = Yasmary
![](/icons/88626dou2.gif)
iterate 标签通常也用于控制模板
![](/icons/88626de.gif)
其实标记
![](/icons/88626dou2.gif)
例如
![](/icons/88626dou.gif)
如果要为模型中
![](/icons/88626de.gif)
每个人创建 Java™ 类
![](/icons/88626dou.gif)
可使用如下代码:
<c:iterate select="/app/person" var="currPerson">
<ws:file template="templates/PersonClass.java.jet"
path="{$org.eclipse.jet.resource.project.name}/{$currPerson/@name}.java"/>
</c:iterate>
这将创建 4个 Java 类文件:Chris.java、Nick.java、Lee.java 和 Yasmary.java
![](/icons/88626dou2.gif)
注意启动标记 path 属性中
![](/icons/88626de.gif)
{$currPerson/@name}
![](/icons/88626zifu.gif)
串
![](/icons/88626dou2.gif)
既然 path 参数不需要 XPath 表达式(像 select 参数
![](/icons/88626yi.gif)
样)
![](/icons/88626dou.gif)
{...}
![](/icons/88626zifu.gif)
告知 JET 引擎通过计算 XPath 表达式代替这部分
![](/icons/88626zifu.gif)
串
![](/icons/88626dou2.gif)
$currPerson/@name 告诉引擎用 currPerson 节点(是定义在 iterate 标签中
![](/icons/88626de.gif)
变量)
![](/icons/88626de.gif)
name 属性来代替其
![](/icons/88626zifu.gif)
串
![](/icons/88626dou2.gif)
此外
![](/icons/88626dou.gif)
在 PersonClass.java.jet 模板中
![](/icons/88626dou.gif)
它可以引用定义在 iterate 标签中
![](/icons/88626de.gif)
currPerson 节点变量
![](/icons/88626dou2.gif)
例如
![](/icons/88626dou.gif)
假设 PersonClass.java.jet 如下所示:
清单 3. PersonClass.java.jet
<c:get select="$currPerson/@name" />Person {
public String getName
{
"<c:get select="$currPerson/@name" />";
}
public void shout
{
.out.pr
ln("Hello!!!");
}
}
Yasmary.java
![](/icons/88626de.gif)
形式将如下:
清单 4. Yasmary.java
YasmaryPerson {
public String getName
{
"Yasmary";
}
public void shout
{
.out.pr
ln("Hello!!!");
}
}
Lee.java
![](/icons/88626de.gif)
形式如下:
清单 5. Lee.java
LeePerson {
public String getName
{
"Lee";
}
public void shout
{
.out.pr
ln("Hello!!!");
}
}
c:choose 和 c:when 这些标签允许模板根据值有条件地转储文本
![](/icons/88626dou2.gif)
例如
![](/icons/88626dou.gif)
下列代码:
清单 6. c:choose/c:when 举例
<c:iterate select="/app/person" var="p" >
<c:choose select="$p/@gender" >
<c:when test="'Male'" > Brother </c:when>
<c:when test="'Female'" > Sister </c:when>
</c:choose>
</c:iterate>
将输出:
Brother
Brother
Brother
Sister
注意 c:when 标签需要 test 参数
![](/icons/88626dou.gif)
这需要
![](/icons/88626yi.gif)
个 XPath 表达式
![](/icons/88626dou2.gif)
既然我们要通过
![](/icons/88626yi.gif)
个常量比较 select 参数
![](/icons/88626dou.gif)
可用单引号 ('') 包含常量
![](/icons/88626dou2.gif)
c:
![](/icons/88626set.gif)
该标签允许模板动态更改输入模型
![](/icons/88626de.gif)
属性
![](/icons/88626dou2.gif)
![](/icons/88626yi.gif)
个例子是:在
![](/icons/88626yi.gif)
个
![](/icons/88626zifu.gif)
串以多个方式映射输出文本时
![](/icons/88626dou.gif)
像 Chris 可能映射到 Chris、chris、ChrisClass、CHRIS_CONSTANT 等
![](/icons/88626dou2.gif)
c:
![](/icons/88626set.gif)
将其内容设置为指定
![](/icons/88626de.gif)
属性
![](/icons/88626dou2.gif)
下面
![](/icons/88626de.gif)
例子为每个人存储名为
![](/icons/88626class.gif)
Name
![](/icons/88626de.gif)
属性并在名字的后简单添加词 Class
![](/icons/88626dou2.gif)
清单 7. c:
![](/icons/88626set.gif)
例子
<c:iterate select="/app/person" var="p" >
<c:
select="$p" name="
Name" >
<c:get select="$p/@name" />Class</c:
>
</c:iterate>
![](/icons/88626set.gif)
Variable 该标签允许模板声明和使用
![](/icons/88626yi.gif)
个全局变量
![](/icons/88626dou.gif)
使用 XPath
![](/icons/88626de.gif)
全部能力来在任何时候操纵该变量
![](/icons/88626dou2.gif)
例如
![](/icons/88626dou.gif)
假设要输出在输入模型中提供了多少个 person 节点
![](/icons/88626dou2.gif)
可以利用以下代码:
清单 8. c:
![](/icons/88626set.gif)
Variable 举例
<c:
Variable select="0" var="i" />
<c:iterate select="/app/person" var="p" >
<c:
Variable select="$i+1" var="i" />
</c:iterate>
Number of people = <c:get select="$i" />.
输出 Number of people = 4
![](/icons/88626dou2.gif)
可以使用 get 输出变量
![](/icons/88626dou.gif)
如上例所示
![](/icons/88626dou2.gif)
有超过 45 个标签
![](/icons/88626dou.gif)
这使输出文本具有强大
![](/icons/88626de.gif)
表现力
![](/icons/88626dou2.gif)
表现力大多源于存在条件逻辑、动态更改输入模型和控制执行流
![](/icons/88626de.gif)
标签
![](/icons/88626dou2.gif)
扩展 JET
JET 是可扩展
![](/icons/88626de.gif)
通过使用 Eclipse
![](/icons/88626de.gif)
扩展点机制
![](/icons/88626dou2.gif)
以下是 JET 提供
![](/icons/88626de.gif)
6个扩展点
![](/icons/88626dou2.gif)
org.eclipse.jet.tagLibraries 该扩展点负责定义标记库
![](/icons/88626dou2.gif)
JET 已经包含 4个标记库(控制、格式、工作空间、Java)
![](/icons/88626dou.gif)
如果您要添加自己
![](/icons/88626de.gif)
标签功能
![](/icons/88626dou.gif)
可从这里入手
![](/icons/88626dou2.gif)
org.eclipse.jet.xpathFunctions 这允许在 JET XPath 执行时启用自定义 XPath 表达式
![](/icons/88626dou2.gif)
![](/icons/88626yi.gif)
个 JET 中这样
![](/icons/88626de.gif)
例子是:通过扩展该扩展点
![](/icons/88626dou.gif)
在 XPath 表达式中使用 camel
![](/icons/88626case.gif)
(参见 JET 源代码中
![](/icons/88626de.gif)
CamelCaseFunction)
![](/icons/88626dou2.gif)
org.eclipse.jet.transform 用于声明您
![](/icons/88626de.gif)
插件在提供 JET 转换
![](/icons/88626dou2.gif)
这是更改您使用什么来启动模板(取代
![](/icons/88626main.gif)
.jet)
![](/icons/88626de.gif)
位置
![](/icons/88626dou2.gif)
org.eclipse.jet.modelInspectors 这允许您定义检查器
![](/icons/88626dou.gif)
使得 JET XPath 引擎来将加载
![](/icons/88626de.gif)
Java 对象解释为 XPath 节点
![](/icons/88626dou2.gif)
检查器是将对象适配为 XPath 信息模型
![](/icons/88626dou2.gif)
作为例子
![](/icons/88626dou.gif)
JET 使用
![](/icons/88626yi.gif)
个模型来浏览 Eclipse 工作空间
![](/icons/88626dou2.gif)
注意这是临时 API
![](/icons/88626dou.gif)
并可能随时间而发生变化
![](/icons/88626dou2.gif)
org.eclipse.jet.modelLoaders 这允许您定义 JET 转换和从文件系统加载
![](/icons/88626de.gif)
JET <c:load> 标签以怎样
![](/icons/88626de.gif)
方式使用模型
![](/icons/88626dou2.gif)
作为举例
![](/icons/88626dou.gif)
JET 提供模型加载器 loader org.eclipse.jet.resource
![](/icons/88626dou.gif)
将加载 Eclipse IResource(文件
![](/icons/88626dou.gif)
文件夹或项目)并允许通过该资源导航 Eclipse 工作空间
![](/icons/88626dou2.gif)
org.eclipse.jet.deployTransforms 这允许您来将
![](/icons/88626yi.gif)
个 JET 转换打包为
![](/icons/88626yi.gif)
个用于简单发行
![](/icons/88626de.gif)
插件(包)
![](/icons/88626dou2.gif)
这可以被 UI 用来查看哪些转换可用
![](/icons/88626dou2.gif)
例子:编写代码来生成代码
下列例子是
![](/icons/88626yi.gif)
个模板
![](/icons/88626dou.gif)
用于创建拥有任意数量属性
![](/icons/88626de.gif)
类
![](/icons/88626dou2.gif)
每个属性将有 getter 和
![](/icons/88626set.gif)
ter 和的关联
![](/icons/88626dou.gif)
还有
![](/icons/88626yi.gif)
些
![](/icons/88626chushi.gif)
值
![](/icons/88626dou2.gif)
此外
![](/icons/88626dou.gif)
所
![](/icons/88626diaoyong.gif)
![](/icons/88626de.gif)
![](/icons/88626hanshu.gif)
![](/icons/88626de.gif)
名称将输出到命令行
![](/icons/88626dou.gif)
通过这种方式
![](/icons/88626dou.gif)
模板即可为各
![](/icons/88626hanshu.gif)
添加简单
![](/icons/88626de.gif)
日志
![](/icons/88626dou2.gif)
清单 9. 属性模板
<c:get select="/app/@
" /> {
<c:iterate select="/app/property" var="p" >
private <c:get select="$p/@type" /> <c:get select="$p/@name" />;
</c:iterate>
public <c:get select="/app/@
" />
{
<c:iterate select="/app/property" var="p" >
this.<c:get select="$p/@name" /> = <c:choose select="$p/@type" >
<c:when test="'String'">"<c:get select="$p/@initial" />"</c:when>
<c:otherwise><c:get select="$p/@initial" /></c:otherwise>
</c:choose>
;
</c:iterate>
}
<c:iterate select="/app/property" var="p" >
public void
<c:get select=
"camelCase($p/@name)" />(<c:get select="$p/@type" />
<c:get select="$p/@name" />) {
.out.pr
ln
("In
<c:get select=
"camelCase($p/@name)" />
");
this.<c:get select="$p/@name" /> = <c:get select="$p/@name" />;
}
public <c:get select=
"$p/@type" /> get<c:get select="camelCase($p/@name)" />
{
.out.pr
ln("In get<c:get select="camelCase($p/@name)" />
");
<c:get select="$p/@name" />;
}
</c:iterate>
}
这里是该模板
![](/icons/88626de.gif)
输入模型例子:
清单 10. 输入参数
<app
="Car">
<property name="model" type="String" initial="Honda Accord" />
<property name="horsepower" type="
" initial="140" />
<property name="spareTires" type="boolean" initial="true" />
</app>
这些输入参数生成如下类:
清单 11. 生成
![](/icons/88626de.gif)
类
Car {
private String model;
private
horsepower;
private boolean spareTires;
public Car
{
this.model = "Honda Accord";
this.horsepower = 140;
this.spareTires = true;
}
public void
Model(String model) {
.out.pr
ln("In
Model
");
this.model = model;
}
public String getModel
{
.out.pr
ln("In getModel
");
model;
}
public void
Horsepower(
horsepower) {
.out.pr
ln("In
Horsepower
");
this.horsepower = horsepower;
}
public
getHorsepower
{
.out.pr
ln("In getHorsepower
");
horsepower;
}
public void
Sparetires(boolean spareTires) {
.out.pr
ln("In
Sparetires
");
this.spareTires = spareTires;
}
public boolean getSparetires
{
.out.pr
ln("In getSparetires
");
spareTires;
}
}
例子:编写处理代码
为强调 JET 不仅仅可用来生成代码
![](/icons/88626dou.gif)
我们给出了下面这个例子
![](/icons/88626dou.gif)
这是
![](/icons/88626yi.gif)
个模板
![](/icons/88626dou.gif)
生成具有区别语气
![](/icons/88626de.gif)
电子邮件消息
![](/icons/88626dou2.gif)
所生成
![](/icons/88626de.gif)
各电子邮件
![](/icons/88626de.gif)
目
![](/icons/88626de.gif)
是是向某人索要求各种东西
![](/icons/88626dou2.gif)
下面提供控制文件(
![](/icons/88626main.gif)
.jet)及其
![](/icons/88626diaoyong.gif)
![](/icons/88626de.gif)
模板(email.jet)
![](/icons/88626dou2.gif)
清单 12.
![](/icons/88626main.gif)
.jet
<c:iterate select="/app/email" var="currEmail" >
<ws:file template="templates/email.jet"
path="{$org.eclipse.jet.resource.project.name}/{$currEmail/@to}.txt" />
</c:iterate>
清单 13. email.jet
<c:
Variable var="numItems" select="0" />
<c:iterate select="$currEmail/request" var="r">
<c:
Variable var="numItems" select="$numItems+1" />
</c:iterate>
<c:
select="$currEmail" name="numItems"><c:get select="$numItems" /></c:
>
<c:choose select="$currEmail/@mood" >
<c:when test="'happy'">My dear</c:when>
<c:when test="'neutral'">Dear</c:when>
<c:when test="'angry'">My enemy</c:when>
</c:choose> <c:get select="$currEmail/@to" />,
I am writing you <c:choose select="$currEmail/@mood" >
<c:when test="'happy'">in joy </c:when>
<c:when test="'neutral'"></c:when>
<c:when test="'angry'">in burning anger </c:when>
</c:choose>to ask for <c:choose select="$currEmail/@numItems" >
<c:when test="1">
a <c:get select="$currEmail/request/@item" />.
</c:when>
<c:otherwise>
the following:
<c:
Variable var="i" select="0" />
<c:iterate select="$currEmail/request" var="r">
<c:
Variable var="i" select="$i+1" />
<c:get select="$i" />. <c:get select="$r/@item" />
</c:iterate>
</c:otherwise>
</c:choose>
<c:choose select="$currEmail/@mood">
<c:when test="'happy'">Please</c:when>
<c:when test="'neutral'">Please</c:when>
<c:when test="'angry'">Either suffer my wrath, or</c:when>
</c:choose> send me <c:choose select="$currEmail/@numItems">
<c:when test="1">
this item</c:when>
<c:otherwise>
these items</c:otherwise>
</c:choose> <c:choose select="$currEmail/@mood" >
<c:when test="'happy'">at your earliest convenience.</c:when>
<c:when test="'neutral'">promptly.</c:when>
<c:when test="'angry'">immediately!</c:when>
</c:choose>
<c:choose select="$currEmail/@mood" >
<c:when test="'happy'">Your friend,</c:when>
<c:when test="'neutral'">Sincerely,</c:when>
<c:when test="'angry'">In rage,</c:when>
</c:choose>
<c:get select="/app/@from" />
该模板
![](/icons/88626de.gif)
输入模型例子如下:
清单 14. sample.xml
<app from="Nathan" >
<email to="Chris" mood="angry" >
<request item="well-written article" />
</email>
<email to="Nick" mood="happy" >
<request item="Piano" />
<request item="Lollipop" />
<request item="Blank DVDs" />
</email>
</app>
将 mood 电子邮件蓝图应用于这些参数
![](/icons/88626dou.gif)
生成下列两个文件
![](/icons/88626dou2.gif)
清单 15. Chris.txt
My enemy Chris,
I am writing you in burning anger to ask for a well-written article.
Either suffer my wrath, or send me this item immediately!
In rage,
Nathan
清单 16. Nick.txt
My dear Nick,
I am writing you in joy to ask for the following:
1. Piano
2. Lollipop
3. Blank DVDs
Please send me these items at your earliest convenience.
Your friend,
Nathan
结束语
在结束的前
![](/icons/88626dou.gif)
我们希望感谢 Paul Elder 提供了宝贵
![](/icons/88626de.gif)
意见
![](/icons/88626dou2.gif)
整体上来说
![](/icons/88626dou.gif)
JET
![](/icons/88626de.gif)
用途不仅限于简化代码生成
![](/icons/88626dou2.gif)
JET 是
![](/icons/88626yi.gif)
个新
![](/icons/88626de.gif)
Eclipse 技术项目
![](/icons/88626dou.gif)
我们期待有更多
![](/icons/88626de.gif)
开发人员在工作中使用它