Code Engine 主要用來生成web相關的代碼,可以把orm的部分集成進來,形成一條完整的生產線;
利用xpath,freemarker等技術,使得用戶通過xml配置文件,模板等簡單的方式,快速開發代碼和根據需求調整模板;
Dom4j對實現了xpath 1.0, 非常的好用;
所需jar :dom4j-1.6.1.jar, jaxen-1.1-beta-7.jar
Code:
import junit.framework.TestCase;
import org.dom4j.*;
import org.dom4j.io.SAXReader;
import java.util.List;
import java.util.Iterator;
import java.io.File;
/**
* Created by IntelliJ IDEA.
* User: duanbin
* Date: 2007-8-15
* Time: 9:47:17
* To change this template use File | Settings | File Templates.
*/
public class XPathTest extends TestCase {
public void testXPathViaDom4jXpathV1() {
printSelectedNodeValue("D:""xpath""src""test.xml");
}
/**
* 利用XPath操作XML文件,打印指定節點或者屬性的值, using xpath 1.0
*
* @param filename String 待操作的XML文件(相對路徑或者絕對路徑)
*/
public void printSelectedNodeValue(String filename) {
try {
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(new File(filename));
List list;
list = document.selectNodes("http://qn1:college/@leader[.!='leader1']");
for (Object aList : list) {
Attribute attribute = (Attribute) aList;
System.out.println("http://qn1:college/@leader: " + attribute.getValue());
}
//打印所有student節點的屬性age值,如果有的話
// list = document.selectNodes("/students/student/@age");
// for (Object aList : list) {
// Attribute attribute = (Attribute) aList;
// System.out.println("/students/student/@age:" + attribute.getValue());
// }
//打印所有college節點值,如果有的話
// list = document.selectNodes("/students/student");
// for (Object aList1 : list) {
// Element bookElement = (Element) aList1;
// Iterator iterator = bookElement.elementIterator("college");
// while (iterator.hasNext()) {
// Element titleElement = (Element) iterator.next();
// System.out.println("/students/student/college:" + titleElement.getText());
// }
// }
//測試節點的一些方法
// list = document.selectNodes("http://city");
// for (Object aList2 : list) {
// Element titleElement = (Element) aList2;
// System.out.print("http://telephone:getName:" + titleElement.getName());
// System.out.print(" ##getNodeType:" + titleElement.getNodeType());
// System.out.print(" ##getTextTrim:" + titleElement.getTextTrim());
// System.out.print(" ##getNamespaceURI:" + titleElement.getNamespaceURI());
// System.out.print(" ##getNodeTypeName:" + titleElement.getNodeTypeName());
// System.out.print(" ##getQualifiedName:" + titleElement.getQualifiedName());
// System.out.print(" ##getUniquePath:" + titleElement.getUniquePath());
// System.out.println(" ##getPath:" + titleElement.getPath());
// }
//打印所有name節點值,如果有的話,與上面college的取法不一樣
// list = document.selectNodes("/students/student/name");
// Iterator iter = list.iterator();
// for (Object aList3 : list) {
// Element titleElement = (Element) aList3;
// System.out.println("/students/student/name:" + titleElement.getText());
// }
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
Test.xml:
<?xml version="1.0" encoding="UTF-8"?>
<students xmlns:qn1="http://qn1.com">
<student age="259911911911"><!--如果沒有age屬性,默認的為20-->
<qn1:name>崔衛兵</qn1:name>
<college>PC學院</college>
<telephone>62354666</telephone>
<notes>男,1982年生,碩士,現就讀于北京郵電大學</notes>
<addr><city>Beijing</city></addr>
</student>
<student>
<name>cwb</name>
<qn1:college leader="學院領導">PC學院</qn1:college><!--如果沒有leader屬性,默認的為leader-->
<telephone>62358888</telephone>
<notes>男,1987年生,碩士,現就讀于中國農業大學</notes>
</student>
<student>
<name>xxxxx</name>
<college leader="">xxx學院</college>
<telephone>66666666</telephone>
<notes>注視中,注釋中</notes>
</student>
<student age="9911911911">
<name>yyyyyy</name>
<qn1:college leader="leader1">yyyy學院</qn1:college>
<telephone>88888888</telephone>
<notes>注視中111,注釋中222</notes>
</student>
</students>
Freemarker基本示例:
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import java.io.File;
import java.io.Writer;
import java.io.OutputStreamWriter;
import java.io.FileOutputStream;
import java.util.Map;
import java.util.HashMap;
import org.apache.log4j.Logger;
/**
* Created by IntelliJ IDEA.
* User: duanbin
* Date: 2007-8-21
* Time: 22:30:13
* To change this template use File | Settings | File Templates.
*/
public abstract class BaseGenerator {
protected Configuration cfg;
protected final Logger logger = Logger.getLogger(this.getClass());
public BaseGenerator() {
try {
cfg = getConfiguration(CodeEngineConfig.getTemplateDir());
} catch (Exception e) {
e.printStackTrace();
}
}
public abstract void generate();
protected void generateFile(String template, Map root, String fileName){
try {
File dist = new File(fileName);
FileOutputStream fos = new FileOutputStream(dist);
Writer out = new OutputStreamWriter(fos);
// Writer out2 = new OutputStreamWriter(System.out);
cfg.getTemplate(template).process(root, out);
out.flush();
out.close();
logger.info("Generated File: " + fileName);
} catch (Exception e) {
e.printStackTrace();
}
}
protected Configuration getConfiguration(String tempDir) throws Exception {
Configuration cfg = new Configuration();
// Specify the data source where the template files come from.
// Here I set a file directory for it:
cfg.setDirectoryForTemplateLoading(
new File(tempDir));
// Specify how templates will see the data model. This is an advanced topic...
// but just use this:
cfg.setObjectWrapper(new DefaultObjectWrapper());
return cfg;
}
}
模板文件示例:
package ${package}.application.web;
import biz.web.framework.web.BaseController;
<#list managers! as mgr>
import ${package}.application.manager.${mgr};
</#list>
<#list services! as svc>
import ${package}.application.service.${svc};
</#list>
/**
* Created by IntelliJ IDEA.
* User: ${author!'admin'} "${r"${build.dir}"} "${'$'}{cfg.startDate}
* Date: Sep 1, 2006
* Time: 9:19:17 AM
* To change this template use File | Settings | File Templates.
*/
public class ${name}Controller extends BaseController {
<#list managers! as mgr>
protected ${mgr} ${mgr?uncap_first};
</#list>
<#list services! as svc>
protected ${svc} ${svc?uncap_first};
</#list>
<#list managers! as mgr>
public void set${mgr}(${mgr} ${mgr?uncap_first}) {
this.${mgr?uncap_first} = ${mgr?uncap_first};
}
</#list>
<#list services! as svc>
public void set${svc}(${svc} ${svc?uncap_first}) {
this.${svc?uncap_first} = ${svc?uncap_first};
}
</#list>
public ModelAndView list${name}(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mav = new ModelAndView("update_${name?uncap_first}");
Long user = getUserId();
mav.addObject("userId", user);
return mav;
}
}