`
liugang594
  • 浏览: 977840 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用JET自动生成代码

阅读更多

EclipseEMF里提供了一个根据模板生成代码的机制:JETEMF就是使用JET来生成代码的。JET可以根据定制的生成模板生成最终的文本(代码)。这一节大致讲一下怎么使用JET来生成代码。 

一、原理

JET的原理很简单:通过一个定义的模板,生成一个中间类,这个中间类有一个generate()方法,用来生成最终的一串字符串(也就是你想生成的代码)。generate()方法里就是使用一个StringBuffer对象,根据模板的内容来构造出一个字符串,最后返回在。 

所以我们生要明白,总共有两个东西在起作用:模板和中间类。

其实还有一个,就是用来生成中间类和执行类的后台引擎。不过从用户的角度来看,通常只能知道模板的存在。 

二、模板格式

首先介绍一下模板的格式。 

要把一个文件作为JET的模板文件,则它的文件名的后缀需要以"jet"结尾,例如:test.javajethelloWorld.xmljet等。这里后缀的前半段可以随意,不过通常用来表示生成的内容格式,例如你要生成的是java代码,则通常是*.javajet;如果想生成xml文件内容,则格式通常是*.xmljet 

要使用jet,首先我们就得先准备一个这样的模板。

上面讲了模板文件名字的约束,下面来讲一下模板文件的内容格式。 

1       文件头   

Jet文件头需要如下声明:

<%@ jet package="包名"
        imports="导入列表、以空格分开"
        class="类名"
%>

其中必须以<%@ jet开头,以%>结尾。在节一中,我们提到了中间类的概念。这里的packageimportsclass都是针对中间类来说的,class即中间类的类名、package即中间类的包名、imports即中间类的导入。例如:

<%@ jet package="com.tibco.cdc.liugang.jet"
  		imports="java.util.*"
  		class="JETTest"
%>

生成的中间类定义如下:

package com.tibco.cdc.liugang.jet;

import java.util.*;

public class JETTest
{
……
}

2、                  语法格式

从文件头以下,就是具体的模板内容了。具体模板定义成什么样,需要由你最终想要的效果决定,例如:

1、             生成HelloWorld

如果你想生成一个”helloWorld”字符串,那么你就直接在声明头下写:helloWorld。例如(以下用JET文件头声明代表文件头声明): 

 

JET文件头声明

Hello world 

 

则最终生成的结果为:Hello world 

直接给出的文本,在中间类中被直接作为字符串追加到StringBuffer对象中去。例如这里的Hello world

 

protected final String TEXT_1 = "Hello world";
……
stringBuffer.append(TEXT_1);

 

 

2、             参数支持

JET也支持传入参数,例如我们可以定义模板内容如下: 

 

JET文件头声明

Hello world <%=argument%> 

 

则当传入参数为“liugang”时,得到的结果为:Hello world liugang 我们看一下此时中间类的定义:

protected final String TEXT_1 = "Hello world";
……
stringBuffer.append(TEXT_1);
stringBuffer.append(argument);

 

 

我们看到参数也被直接追加到StringBuffer对象中去。这里<%=*%>是一个求值表达式,类似于JSP中的语法。使用求值表达式时,表达式被直接追加到stringBuffer对象中去。 JET模板文件中,使用”argument”去得到参数。如果是一个复杂类型的参数,我们需要自己做强制转换或拆解。  

 

3、             代码支持

也可以直接在JET中写一些代码。这里说代码是指这些代码片段在中间类中会被作为一段代码而加入。例如  

 

JET文件头声明

<%if("liugang".equals(argument)){%>
hello liugang
<%}else{%>
hello others
<%}%>

 

如果我们传入的参数为”liugang”,则得到结果为:hello liugang;否则得到:hello others 在中间类中,这一段模板的代码表示为:
protected final String TEXT_1 = "hello liugang";
protected final String TEXT_2 = NL + "hello others";
……
if("liugang".equals(argument)){
  stringBuffer.append(TEXT_1);
}else{
  stringBuffer.append(TEXT_2);
}

 

注意:有几个注意事项:

1、  需要注意空格的存在,例如“hello world”  hello world”生成的结果不一样。

2、  构造代码时,需要注意代码定义的完整性,以及代码与非代码片段的区分。 

二、JET引擎 

一般来说,我们都是在程序中使用JET去生成代码,所以当然需要有通过调用程序的方式来生成。这就要用到JET引擎。 EMF中默认提供了JET的引擎类:JETEmitter

我们可以如下例如:

JETEmitter emitter = new JETEmitter(templateURI);

有了这个对象后,就可以直接调用它的方法来生成代码:

emitter.generate(monitor, arguments); 

这里的arguments是一个数组对象,也就是最后会传到模板中的那个argument。最后方法的返回对象是一个String 

有时我们会传入一些只在当前插件中才存在对象,所以需要告知JET引擎这个对象类的所在,我们需要如下使用: 

emitter.addVariable(variableName, pluginID) 

这样,idpluginID的插件就会被作为依赖项加入。当然,可以加入一个或多个。

 

 

分享到:
评论
3 楼 262726909 2010-02-01  
请问楼主知不知道JET模板文件里怎么支持中文?
2 楼 liugang594 2008-01-08  
啊,I am sorry。不已经很久没有再看JET了。记得后来有一次看了一个别人的写的,好像跟这个已经很不一样了。不过没有很细的留意。有空我再看看
1 楼 lszwycn 2008-01-08  
这个是jet1版本的,有没有对jet2有所研究呢

相关推荐

    Jet标签自动生成代码

    NULL 博文链接:https://long316.iteye.com/blog/1734638

    Eclipse_EMF_JET_自动代码生成技术入门

    Eclipse_EMF_JET_自动代码生成技术入门

    自动生成DAO源代码

    利用eclipse的JET模板自动生成java文件来生成DAO,生成的DAO继承了一个通用的GenenicDao,GenenicDao用到了spring和hibernate. 提供源代码

    jet:具有代码生成和自动查询结果数据映射的类型安全SQL Builder

    动机内容产品特点自动生成的类型安全SQL Builder PostgreSQL: (DISTINCT, FROM, WHERE, GROUP BY, HAVING, ORDER BY, LIMIT, OFFSET, FOR, UNION, INTERSECT, EXCEPT, WINDOW, sub-queries) (VALUES, MODEL, MODELS...

    MyCode代码生成器1.0绿色免费版.zip

    MyCode-代码生成器 1.0是一款很实用的小工具,可以自动生成BCB版的数据库操作代码(ADO)。从面避免繁琐的手工编写,使用很简单,你只需简单调用就可以对数据库进行操作。支持windows身份验证以及SQL Server身份验证...

    Eclipse Enum插件示例

    Eclipse Enum插件示例 介绍插件开发的基本流程,采用jet的代码生成功能。

    Access+2000中文版高级编程

    1.1 何时使用代码代替宏 4 1.1.1 何时用宏 4 1.1.2 何时用代码 4 1.2 宏到代码的转换 5 1.2.1 使用DoCmd对象 5 1.2.2 与宏命令等价的代码 7 1.3 将现有宏转换为代码 8 1.4 小 结 12 第2章 使用VBA...

    Access 2000中文版高级编程(part1)

    1.1 何时使用代码代替宏 4 1.1.1 何时用宏 4 1.1.2 何时用代码 4 1.2 宏到代码的转换 5 1.2.1 使用DoCmd对象 5 1.2.2 与宏命令等价的代码 7 1.3 将现有宏转换为代码 8 1.4 小 结 12 第2章 使用VBA编写代码 ...

    xmljava系统源码-RouterKit:又一个路由库;Android平台对页面、服务的路由框架。自动化且易用

    基于APT技术(注解-编译时生成代码,不反射,无性能损耗),通过注解方式来实现URL打开Activity功能或 执行特定动作 并支持在WebView和外部浏览器使用,支持路由表维护,降级访问等; 使用技术支持Bundle、Intent,...

    SQL+数据透视表+VBA 数据透视表的超级应用

    语句太长的处理:在代码区如果你想好看一些,你可以插入“ _”来换行,当然不能插在一个单词或自动名等中间。 2、5 将文件存盘,重新打开就会有了数据,你可以将字段拖入数据透视表中,创建你自己的数据透视表, 2、...

    Access 2000数据库系统设计(PDF)---001

    1517.3.2 链接Excel工作表 1567.4 使用Microsoft Outlook和Exchange 文件夹 1567.4.1 用Outlook导出和导入Jet 4.0表 1577.4.2 使用Exchange/Outlook向导的链接 1597.5 导入文本文件 1607.5.1 使用导入文本向导 1617....

    Access 2000数据库系统设计(PDF)---018

    1567.4 使用Microsoft Outlook和Exchange文件夹 1567.4.1 用Outlook导出和导入Jet 4.0表 1577.4.2 使用Exchange/Outlook向导的链接 1597.5 导入文本文件 1607.5.1 使用导入文本向导 1617.5.2 导入文本向导的高级选项...

    Access 2000数据库系统设计(PDF)---002

    1517.3.2 链接Excel工作表 1567.4 使用Microsoft Outlook和Exchange 文件夹 1567.4.1 用Outlook导出和导入Jet 4.0表 1577.4.2 使用Exchange/Outlook向导的链接 1597.5 导入文本文件 1607.5.1 使用导入文本向导 1617....

    Access 2000数据库系统设计(PDF)---011

    1567.4 使用Microsoft Outlook和Exchange文件夹 1567.4.1 用Outlook导出和导入Jet 4.0表 1577.4.2 使用Exchange/Outlook向导的链接 1597.5 导入文本文件 1607.5.1 使用导入文本向导 1617.5.2 导入文本向导的高级选项...

    Access 2000数据库系统设计(PDF)---020

    1567.4 使用Microsoft Outlook和Exchange文件夹 1567.4.1 用Outlook导出和导入Jet 4.0表 1577.4.2 使用Exchange/Outlook向导的链接 1597.5 导入文本文件 1607.5.1 使用导入文本向导 1617.5.2 导入文本向导的高级选项...

    Access 2000数据库系统设计(PDF)---003

    1517.3.2 链接Excel工作表 1567.4 使用Microsoft Outlook和Exchange 文件夹 1567.4.1 用Outlook导出和导入Jet 4.0表 1577.4.2 使用Exchange/Outlook向导的链接 1597.5 导入文本文件 1607.5.1 使用导入文本向导 1617....

    Access 2000数据库系统设计(PDF)---009

    1517.3.2 链接Excel工作表 1567.4 使用Microsoft Outlook和Exchange 文件夹 1567.4.1 用Outlook导出和导入Jet 4.0表 1577.4.2 使用Exchange/Outlook向导的链接 1597.5 导入文本文件 1607.5.1 使用导入文本向导 1617....

    Access 2000数据库系统设计(PDF)---012

    1567.4 使用Microsoft Outlook和Exchange文件夹 1567.4.1 用Outlook导出和导入Jet 4.0表 1577.4.2 使用Exchange/Outlook向导的链接 1597.5 导入文本文件 1607.5.1 使用导入文本向导 1617.5.2 导入文本向导的高级选项...

    Access 2000数据库系统设计(PDF)---015

    1567.4 使用Microsoft Outlook和Exchange文件夹 1567.4.1 用Outlook导出和导入Jet 4.0表 1577.4.2 使用Exchange/Outlook向导的链接 1597.5 导入文本文件 1607.5.1 使用导入文本向导 1617.5.2 导入文本向导的高级选项...

Global site tag (gtag.js) - Google Analytics