JET(Java Emitter Templates)项目是Eclipse下的一个子项目,用于代码生成的工作。下面演示下如何应用Jet生成自己需要的代码:



以下的例子在eclipse3.4上运行通过。在这个版本中还添加了一个jet文件的编辑器,有代码高亮显示的功能的。


一、创建JET Transformation Project 项目。



java 生成的xml怎么自动换行 java代码生成xml文件_ViewUI



键入项目名,如“codeGen”



java 生成的xml怎么自动换行 java代码生成xml文件_开发工具_02



在随后生成的项目的文件目录结构如下:



java 生成的xml怎么自动换行 java代码生成xml文件_java 生成的xml怎么自动换行_03



二、各文件用途说明



1.Jet 项目的主要思路是:



参数文件(sample.xml)+模板文件(xxx.jet)文件=生成文件(.java,.xml等文件)



2. 在用JET 项目生成代码的过程中主要涉及下面3 个文件:



sample.xml文件,这个xml文件主要提供输入数据



main.jet这个是入口文件,相当于Java,C++等编程语言中的main函数,调用其他的jet文件



xxx.jet文件:这个文件是具体的模板文件,可以针对不同的代码生成功能制作不同的jet文件。



第一步:在templates 文件夹下创建新的模板文件:car.jet 内容如下:


class < 
   c:get select="$p/@name" /> { 
  
 
  

    < 
   c:iterate select="$p/property" var="per" > 
  
 
  

    private < 
   c:get select="$per/@type" /> < 
   c:get select="$per/@name" />; 
  
 
  

    </ 
   c:iterate> 
  
 
  

    public < 
   c:get select="$p/@name" />() { 
  
 
  

    < 
   c:iterate select="$p/property" var="per" > 
  
 
  

    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="$per/@initial" /></ 
   c:otherwise> 
  
 
  

    </ 
   c:choose> 
  
 
  

    ; 
  
 
  

    </ 
   c:iterate> 
  
 
  

    } 
  
 
  

    < 
   c:iterate select="$p/property" var="per" > 
  
 
  

    public void set< 
   c:get select="camelCase($per/@name)" />(< 
   c:get select="$per/@type" /> 
  
 
  

    < 
   c:get select="$per/@name" />) { 
  
 
  

    System.out.println("In set< 
   c:get select="camelCase($per/@name)" />()"); 
  
 
  

    this.< 
   c:get select="$per/@name" /> = < 
   c:get select="$per/@name" />; 
  
 
  

    } 
  
 
  

    public < 
   c:get select="$per/@type" /> get< 
   c:get select="camelCase($per/@name)" />() { 
  
 
  

    System.out.println("In get< 
   c:get select="camelCase($per/@name)" />()"); 
  
 
  

    return < 
   c:get select="$per/@name" />; 
  
 
  

    } 
  
 
  

    </ 
   c:iterate> 
  
 
  

    }



第二步:在main.jet 模板文件中追加如下代码:


< 
   c:iterate select="/app/class" var="p" > 
  
 
  

    < 
   ws:file template="templates/car.jet" path="{$org.eclipse.jet.resource.project.name}/{$p/@name}.java" /> 
  
 
  

    </ 
   c:iterate>



第三步:修改 sample.xml 文件为如下内容:



<app> 
  
 
  

    <class name="Car"> 
  
 
  

    <property name="model" type="String" initial="Honda Accord" /> 
  
 
  

    <property name="horsepower" type=" 
   int" initial="140" /> 
  
 
  

    <property name="spareTires" type="boolean" initial="true" /> 
  
 
  

    </class> 
  
 
  

    <class name=" 
   Dalai"> 
  
 
  

    <property name="eye" type="String" initial="1" /> 
  
 
  

    <property name="leg" type=" 
   int" initial="4" /> 
  
 
  

    <property name="age" type=" 
   int" initial="70" /> 
  
 
  

    </class> 
  
 
  

    </app>

项目文件目录结构:



java 生成的xml怎么自动换行 java代码生成xml文件_java 生成的xml怎么自动换行_04



第四步:项目运行配置,设置如下



java 生成的xml怎么自动换行 java代码生成xml文件_ViewUI_05



第五步:将产生如下的car.java 文件:



class
 
  
private
 
  
private 
   int
 
  
private 
   boolean
 
  
public
 
  
this.Car = Honda Accord; 
  
 
  
this.Car = 140; 
  
 
  
this.Car = 
   true; 
  
 
  

    } 
  
 
  
public 
   void
 
  
out.println("In setModel()"); 
  
 
  
this.model = model; 
  
 
  

    } 
  
 
  
public
 
  
out.println("In getModel()"); 
  
 
  
return
 
  

    } 
  
 
  
public 
   void setHorsepower( 
   int
 
  
out.println("In setHorsepower()"); 
  
 
  
this.horsepower = horsepower; 
  
 
  

    } 
  
 
  
public 
   int
 
  
out.println("In getHorsepower()"); 
  
 
  
return
 
  

    } 
  
 
  
public 
   void setSparetires( 
   boolean
 
  
out.println("In setSparetires()"); 
  
 
  
this.spareTires = spareTires; 
  
 
  

    } 
  
 
  
public 
   boolean
 
  
out.println("In getSparetires()"); 
  
 
  
return
 
  

    } 
  
 
  

    }



三、再做一个产生 hibernate hbm.xml 配置文件的例子。






第一步:同上一个例子,在 templates 文件夹下创建一个 hbm.xml.jet (这个文件名是任意的,只要扩展名是 jet 就可以)的模板文件



<?xml version="1.0"?> 
  
 
  

    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
  
 
  

    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
  
 
  

    <hibernate-mapping> 
  
 
  

    <class name="< 
   c:get select="$p/@name" />" table="< 
   c:get select="$p/@name" />"> 
  
 
  

    <id name="id" type="int"> 
  
 
  

    <column name="ID" precision="6" scale="0" /> 
  
 
  

    <generator class="sequence"> 
  
 
  

    <param name="sequence">SEQ_TAB_CASH_EXPENSE_ACT_ID</param> 
  
 
  

    </generator> 
  
 
  

    </id> 
  
 
  

    < 
   c:iterate select="$p/property" var="per" > 
  
 
  

    <property name="< 
   c:get select="camelCase($per/@name)" />" type="< 
   c:get select="$per/@type" />"> 
  
 
  

    <column name="< 
   c:get select="camelCase($per/@name)" />" precision="1" not-null="true" /> 
  
 
  

    </property> 
  
 
  

    </ 
   c:iterate> 
  
 
  

    </class> 
  
 
  

    </hibernate-mapping>

第二步:在 main.jet 中追加如下代码



< 
   c:iterate select="/app/class" var="p" > 
  
 
  

    < 
   ws:file template="templates/hbm.xml.jet" path="{$org.eclipse.jet.resource.project.name}/{$p/@name}.hbm.xml" /> 
  
 
  

    </ 
   c:iterate>



第三步:运行会产生如下文件“ Car.hbm.xml



<? 
   xml version="1.0"?> 
  
 
  

    <!DOCTYPE 
   hibernate-mapping PUBLIC "-// 
   Hibernate/ 
   Hibernate Mapping DTD 3.0//EN" 
  
 
  

    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
  
 
  

    <hibernate-mapping> 
  
 
  

    <class name="Car" table="Car"> 
  
 
  

    <id name="id" type=" 
   int"> 
  
 
  

    <column name="ID" precision="6" scale="0" /> 
  
 
  

    <generator class="sequence"> 
  
 
  

    <param name="sequence">SEQ_TAB_CASH_EXPENSE_ACT_ID 
   </param> 
  
 
  

    </generator> 
  
 
  

    </id> 
  
 
  

    <property name="Model" type="String"> 
  
 
  

    <column name="Model" precision="1" not-null="true" /> 
  
 
  

    </property> 
  
 
  

    <property name="Horsepower" type=" 
   int"> 
  
 
  

    <column name="Horsepower" precision="1" not-null="true" /> 
  
 
  

    </property> 
  
 
  

    <property name=" 
   Sparetires" type="boolean"> 
  
 
  

    <column name=" 
   Sparetires" precision="1" not-null="true" /> 
  
 
  

    </property> 
  
 
  

    </class> 
  
 
  

    </hibernate-mapping>



最后文件目录如下:



java 生成的xml怎么自动换行 java代码生成xml文件_java 生成的xml怎么自动换行_06



四:把其他项目转换成JET项目。



第一步:新建一个普通的Java Project,项目名为:“CodeGen2”,然后按如下方式转换成JET项目。



java 生成的xml怎么自动换行 java代码生成xml文件_java_07



在下一步中选择“CodeGen2”项目,如下图:



java 生成的xml怎么自动换行 java代码生成xml文件_开发工具_08



最后项目目录下多了一个templates文件夹:



java 生成的xml怎么自动换行 java代码生成xml文件_前端_09



修改项目的properties如下:



java 生成的xml怎么自动换行 java代码生成xml文件_java_10



把上个项目的car.jet文件拷贝到templates文件夹下。



并在该文件的最顶部添加如下代码:



<%@ 
   jet package="cn.edu.pku.pafirc" class="CarTemplate" 
   %> 
   



就会生成如下的文件:CarTemplate.java文件



package
 
  
public 
   class
 
  
protected 
   static String 
   nl; 
  
 
  
public 
   static 
   synchronized
 
  
nl
 
  
new
 
  
nl = 
   null; 
  
 
  
return
 
  

    } 
  
 
  
public 
   final String NL = 
   nl == 
   null ? (System. 
   getProperties() 
  
 
  
nl; 
  
 
  
protected 
   final
 
  

    + NL 
  
 
  

    + "<c:iterate select=\"$p/property\" var=\"per\" >" 
  
 
  

    + NL 
  
 
  

    + "\tprivate <c:get select=\"$per/@type\" /> <c:get select=\"$per/@name\" />;" 
  
 
  

    + NL 
  
 
  

    + "</c:iterate>" 
  
 
  

    + NL 
  
 
  

    + "" 
  
 
  

    + NL 
  
 
  

    + "" 
  
 
  

    + NL 
  
 
  

    + "\tpublic <c:get select=\"$p/@name\" />() {" 
  
 
  

    + NL 
  
 
  

    + "\t<c:iterate select=\"$p/property\" var=\"per\" >" 
  
 
  

    + NL 
  
 
  

    + "\t\tthis.<c:get select=\"$p/@name\" /> = <c:choose select=\"$p/@type\" >" 
  
 
  

    + NL 
  
 
  

    + "\t\t<c:when test=\"'String'\">\"<c:get select=\"$p/@initial\" />\"</c:when>" 
  
 
  

    + NL 
  
 
  

    + "\t\t<c:otherwise><c:get select=\"$per/@initial\" /></c:otherwise>" 
  
 
  

    + NL 
  
 
  

    + "\t\t</c:choose>" 
  
 
  

    + NL 
  
 
  

    + ";" 
  
 
  

    + NL 
  
 
  

    + "\t</c:iterate>" 
  
 
  

    + NL 
  
 
  

    + "\t}" 
  
 
  

    + NL 
  
 
  

    + "" 
  
 
  

    + NL 
  
 
  

    + "<c:iterate select=\"$p/property\" var=\"per\" >" 
  
 
  

    + NL 
  
 
  

    + "\tpublic void set<c:get select=\"camelCase($per/@name)\" />(<c:get select=\"$per/@type\" />" 
  
 
  

    + NL 
  
 
  

    + "\t<c:get select=\"$per/@name\" />) {" 
  
 
  

    + NL 
  
 
  

    + "\t\tSystem.out.println(\"In set<c:get select=\"camelCase($per/@name)\" />()\");" 
  
 
  

    + NL 
  
 
  

    + "\t\tthis.<c:get select=\"$per/@name\" /> = <c:get select=\"$per/@name\" />;" 
  
 
  

    + NL 
  
 
  

    + "\t}" 
  
 
  

    + NL 
  
 
  

    + "\t" 
  
 
  

    + NL 
  
 
  

    + "\tpublic <c:get select=\"$per/@type\" /> get<c:get select=\"camelCase($per/@name)\" />() {" 
  
 
  

    + NL 
  
 
  

    + "\t\tSystem.out.println(\"In get<c:get select=\"camelCase($per/@name)\" />()\");" 
  
 
  

    + NL + "\t\treturn <c:get select=\"$per/@name\" />;" + NL + "\t}" 
  
 
  

    + NL + "\t" + NL + "</c:iterate>" + NL + "" + NL + "" + NL + "" 
  
 
  

    + NL + "}"; 
  
 
  
public
 
  
final StringBuffer stringBuffer = 
   new
 
  

    stringBuffer.append(TEXT_1); 
  
 
  
return
 
  

    } 
  
 
  

    }



获取sampl.xml文件的内容,作为参数传入generate(Object argument)就是产生需要的最终Java文件。


转载于:https://blog.51cto.com/orajc/125189