JET学习笔记(三)under the hood

 

我们已经学习了JET模板,如何创建能自动转换成java实现类的JET模板,以及如何使用这些java实现类来生成代码。

这一节我们将进一步理解模板转换的java实现类。为什么可以在模板中使用隐式对象argumentStringBuff,以及学习通过自定义的“骨架”所自定义转换出的实现类。

1)转换的模板

一个JET模板被转换成java实现类,有一些java实现类中的对象可以在JET模板中直接被引用。下面的示例体现了如何在模板中使用隐式对象argumentStringBuff

<%@ jet package="hello" class="TranslationDemoTemplate" %>


Hello, <%=argument%>!

<% stringBuffer.append("Hello again!"); %>

下面是以上模板转换的java实现类:

package hello;

public class TranslationDemoTemplate

{

protected final String NL = System.getProperties().getProperty("line.separator");

protected final String TEXT_1 = "Hello, ";

protected final String TEXT_2 = "!";

public String generate(Object argument)

{

StringBuffer stringBuffer = new StringBuffer();

stringBuffer.append(TEXT_1);

stringBuffer.append(argument);

stringBuffer.append(TEXT_2);


stringBuffer.append("Hello again!");

return stringBuffer.toString();

}

}

注意java实现类的generate方法获取了一个叫做argumentObject对象,这与模板第二行中的argument指的是同一个对象。并且要注意java实现类中使用一个StringBuff对象来收集剩下的代码。这个对象在模板中通过它的名字stringBuff直接被引用。

2)修改转换的实现类的“骨架”

上面TranslationDemoTemplate类的generate方法只是实现类“骨架”的一部分。JET引擎默认的“骨架”如下:

public class CLASS

{

public String generate(Object argument)

{

return "";

}

}


这个定义更多的像是一个普通的java类,除了类名。类的名称将会被jetclass属性的值所代替。而且这个定义还包括了generate方法。通过修改模板转换的“骨架”,比如让它实现一个接口,或者改变类的其他属性。

比如,假设你希望所有的模板实现类都实现一个接口,类似于:

public interface IGenerator {

String generate(Object argument);

}

我们可以通过在模板第一行jet指令中设置skeleton属性来告诉JET引擎使用自定义的“骨架”。skeleton属性的值是一个URI只想自定义骨架所在文件。

步骤如下:

1.在模板文件夹中创建一个新文件generator.skeleton

2.在编辑器中打开generator.skeleton文件,填入以下内容:

public class CLASS implements IGenerator

{

/* (non-javadoc)

* @see IGenerator#generate(Object)

*/

public String generate(Object argument)

{

return "";

}

}

这个文件就是自定义“骨架”。所有使用这个“骨架”的模板都会转换成实现了IGenerator接口的类。

3.在模板指令中添加skeleton属性

<%@ jet package="hello" class="GreetingTemplate" skeleton="generator.skeleton" %>

Hello, <%=argument%>!

The current time is <%=new java.util.Date()%>.

JET Builder转换模板后的实现类如下:

package hello;

public class GreetingTemplate implements IGenerator

{

protected final String NL = System.getProperties().getProperty("line.separator");

protected final String TEXT_1 = "Hello, ";

protected final String TEXT_2 = "!" + NL + "The current time is ";

protected final String TEXT_3 = ".";

protected final String TEXT_4 = NL;


/* (non-javadoc)

* @see IGenerator#generate(Object)

*/

public String generate(Object argument)

{

StringBuffer stringBuffer = new StringBuffer();

stringBuffer.append(TEXT_1);

stringBuffer.append(argument);

stringBuffer.append(TEXT_2);

stringBuffer.append(new java.util.Date());

stringBuffer.append(TEXT_3);

stringBuffer.append(TEXT_4);

return stringBuffer.toString();

}

}

注意到模板转换后实现了IGenerator接口,并且generate方法含有我们在generator.skeleton文件中的注释。

这只是使用skeleton定义自定义转换模板的一个例子。skeleton定义还可以包含其他方法和内部类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值