快速业务通道

使用EMP进行建模,第2部分:使用Eclipse的Java Emitter Templates生成代码 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-18
erated = jetEmitter.generate( new NullProgressMonitor(), new  Object[]{argument} );

如果您试图在一个标准的 main() 方法中运行这段代码,就会发现第一个问题。 generate() 方法会触发一个 NullPointerException 异常,因为 JETEmitter 假设自己 正被一个插件调用。在初始化过程中,它将调用 CodeGenPlugin.getPlugin ().getString() ,这个函数会失败,因为 CodeGenPlugin.getPlugin() 为空。

解决这个问题有一个简单的方法:将这段代码放到一个插件中,这样的确可以管用, 但却不是完整的解决方法。现在 JETEmitter 的实现创建了一个隐藏项目 .JETEmitters ,其中包含了所生成的代码。然而, JETEmitter 并不会将这个插件的 classpath 添加 到这个新项目中,因此,如果所生成的代码引用了任何标准 Java 库之外的对象,都将不 能成功编译。2.0.0 版本初期似乎解决了这个问题,但是到 4 月初为止,这还没有完全 实现。要解决这个问题,必须对 JETEmitter 类进行扩充,使其覆盖 initialize() 方法 ,并将其加入您自己的 classpath 项中。Remko Popma 已经编写了很好的一个例子 jp.azzurri.jet.article2.codegen.MyJETEmitter ,这个例子可以处理这个问题,在 JET 增加这种正确的特性之前都可以使用这种方法。修改后的代码如清单 8 所示。

清单 8. 正确的 JETEmitter 调用

String base = Platform.getPlugin (PLUGIN_ID).getDescriptor().getInstallURL().toString(); String uri = base + "templates/GenTestCase.javajet"; MyJETEmitter jetEmitter = new MyJETEmitter( uri ); jetEmitter.addClasspathVariable( "JET_EXAMPLE", PLUGIN_ID); String generated = jetEmitter.generate( new NullProgressMonitor(),    new Object[]{genClass} );

命令行

在命令行中编译 JET 非常简单,不会受到 classpath 问题的影响,这个问题会使编 译一个 main() 方法都非常困难。在上面这种情况中,难点并不是将 javajet 编译成 Java 代码,而是将这个 Java 代码编译成 .class 。在命令行中,我们可以更好地控制 classpath,这样可以分解每个步骤,最终再组合起来,就可以使整个工作顺利而简单。 唯一一个技巧是我们需要以一种 "无头" 模式(没有用户界面)来运行 Eclipse,但即便 是这个问题也已经考虑到了。要编译 JET,请查看一下 plugins/org.eclipse.emf.codegen_1.1.0/test 。这个目录中包含了 Windows 和 Unix 使用的脚本,以及一个要验证的 JET 例子。

作为一个 ANT 任务执行

有一个 ANT 任务 jetc ,它要么可以采用一个 template 属性,要么对多个模板有一 个 fileset 属性。一旦配置好 jetc 任务的 classpath 之后,模板的编译就与标准的 Java 类一样简单。

定制 JET 以生成 JSP

最终,JET 使用 "<%" 和 "%>" 来标记模板,然而这与 JSP 使用的标记相同。 如果您希望生成 JSP 程序,那就只能修改定界符。这可以在模板开头的 jet 声明中使用 startTag 和 endTag 属性实现,如清单 9 所示。在这种情况中,我使用 "[%" 和 "%]" 作为开始定界符和结束定界符。正如您可以看到的一样, "[%= expression %]" 可以正 确处理,就像前面的 "<%= expression %>" 一样。

清单 9. 修改标签后的 JET 模板

<%@ jet    package="com.ibm.pdc.example.jet.gen"    class="JspGen"    imports="java.util.* "    startTag = "[%"    endTag = "%]"    %> [% String argValue = (String)argument; %] package [%= 

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号