使⽤Velocity模板技术构建代码⽣成器
Velocity 是⼀个基于 Java 的模板引擎,它允许任何⼈仅仅简单的使⽤模板语⾔来引⽤由 Java 代码定义的对象,从⽽实现界⾯和 Java 代码的分离,使得界⾯设计⼈员可以和 Java 程序开发⼈员同步开发⼀个遵循 MVC 架构的 web 站点。但是在实际应⽤过程中,Velocity ⼜不仅仅被⽤在了 MVC 的架构中。
在如今特别流⾏的 MVC 架构模式中,软件各个层次的功能更加独⽴,同时代码的相似度也更加⾼。所以我们需要寻⼀种来减少软件开发⼈员重复劳动的⽅法,让程序员将更多的精⼒放在业务逻辑以及其他更加具有创造⼒的⼯作上。Velocity 这个模板引擎就可以在⼀定程度上解决这个问题。
⼀、基本原理
代码⽣成器的基本原理就是抽取通⽤的代码编写成模板⽂件,模板引擎根据模板⽂件以及输⼊⽣成相应代码并持久化到磁盘:
<span > </span>/**
* @param templateName 模板⽂件
* @param className    ⽣成的java⽂件的类名
* @param packageName  包名
* @param map          向velocity context中放置变量的hashmap
* @throws Exception
*/
public static void generateCode(String templateName,String className,String packageName,Map<String, String> map) throws Exception{
Template template=null;
try {
template = Template(templateName);
} catch (Exception e) {
e.printStackTrace();
}
Context context= new VelocityContext();
context.put("packageName", packageName);
context.put("className", className);
for (Map.Entry<String, String> entry : Set()) {
context.Key(), Value());
}
File fileDir=new File(place('.', '/'));
if(!ists()){
fileDir.mkdirs();
}
FileOutputStream outStream = new FileOutputStream(new File(fileDir, className+".java"));
OutputStreamWriter writer =  new OutputStreamWriter(outStream,"UTF-8");
BufferedWriter sw = new BufferedWriter(writer);
<(context,sw);//根据模板⽂件以及输⼊的contezt⽣成代码
sw.flush();
sw.close();
outStream.close();
}
⼀个模板⽂件的例⼦:
package ${packageName};
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import org.vention.annotation.Action;
import org.vention.annotation.Namespace;
import org.vention.annotation.Result;
import org.vention.annotation.Results;
import org.springframework.stereotype.Controller;
import com.opensymphony.xwork2.ActionSupport;
import ${serviceImport};
/**
* ${description}
* @author ${author}
*/
@Controller
@Namespace("${nameSpace}")
@Results( {
@Result(name = "list", location = "${resultLocation}.jsp")
})
public class ${className} extends ActionSupport {
@Resource
private ${serviceInterface} ${serviceName};
/**
* 跳转到列表页⾯
*/
@Action("${methodName}_list")
public String list() {
HttpServletRequest  Request();
request.setAttribute("entityList", ${serviceName}.getScrollData().getResultlist());
return "list";
}
}
这是个Controller模板⽂件,基于Struts2的注解技术实现。模板中包名、类名、Controller NameSpace、 Service接⼝、跳转页⾯、请求路径等都在运⾏时由velocity模板引擎根据程序的输⼊动态⽣成。
⼆、⼀个简单的代码⽣成器例⼦
根据以上的思想,⾃⼰在⼤学时期开发的⼀个简单的代码⽣成器如下所⽰:
最终⽣成的Action如下所⽰:
package com.wuwang.agent.action.foo;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import org.vention.annotation.Action;
import org.vention.annotation.Namespace;
import org.vention.annotation.Result;
import org.vention.annotation.Results;
import org.springframework.stereotype.Controller;
免费模板生成器import com.opensymphony.xwork2.ActionSupport;
import com.wuwang.agent.service.foo.FooService;
/**
*
* @author
*
*/
@Controller
@Namespace("/")
@Results( {
@Result(name = "list", location = "/WEB-INF/page/foo_list.jsp")
})
public class FooAction extends ActionSupport {
@Resource
private FooService fooService;
/
**
* 跳转到列表页⾯
*/
@Action("foo_list")
public String list() {
HttpServletRequest  Request();
request.setAttribute("entityList", ScrollData().getResultlist());
return "list";
}
}
封装了通⽤功能的Domain、Dao、Service、Action源代码都⾃动⽣成了。这个代码⽣成器⽐较简单,仅作展⽰参考。
按照这种思路,其实更复杂的代码⽣成器也能开发。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。