模板技术Velocity应用
1、模板技术概念
通过一文件模板,在里面加一些特殊的标签,(由web容器去执行程序的时候),生成动态的文件内容。
a.jsp-----jsp引擎-->servlet容器
<%=msg%>
<%for(int i=0;i<10;i++){
%>
<div><%=i%></div>
<%
}
%>
a.jsp.html
hello
<div>0</div>
<div>1</div>
B、引升到其它领域--用jsp来做代码生成
idao.template===idao.jsp?domain=Product
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%request.setAttribute("domain",request.getParameter("domain"))%>
import cn.itcast.gz.pss.domain.${domain};
public interface I${domain}Dao extends IBaseDao<${domain}> {
}
Product===>idao.jsp?domain=Product
import cnsanfy.test.pss.domain.Product;
public interface IProductDao extends IBaseDao<Product> {
}
C、用其它的技术来实现模板生成--使用replaceAll来替换
import cn.sanfy.test.pss.domain.${domain};
public interface I${domain}Dao extends IBaseDao<${domain}> {
}
2、Velocity应用
A、Velocity使用过程
(1). Initialize Velocity. ---初始化Velocity.
(2). Create a Context object ---创建Velocity上下文,用来存储数据,java对象.
(3). Add your data objects to the Context[--->往上下文中添加数据.
(4). Choose a template.---->选择并创建模板对象
(5). 'Merge' the template and your data to produce the ouput.--->执行合并操作,把模板文件的内容与Context中的数据进行合并处理.
Velocity.init();//初始化
//创建上下文件对象,用来存数据
VelocityContext context = new VelocityContext();
//往contxt中加入对象
context.put("domain", new String("Product"));
User u=new User();
u.setName("abc");
context.put("o", u );
//选择一个模板
Template template = null;
template = Velocity.getTemplate("idao.template");
//指定用来输出合并结果的字符流合并后的结果
StringWriter sw = new StringWriter();
//合并模板与context中数据,并输出到writer中
template.merge(context, sw);
System.out.println(sw.toString());
3、Velocity语法
A、输出一个变量--表达式
$o.name==>输出o.name的值,如果不存在,则输出整个表达式
${o.name}
$!{o.name}
$!o.name--》如果o.name不存在,则输出null。
$!{o.name.substring(0,1).toUpperCase()}可以调用方法
B、作条件判断
#if($o.name=='abc')
#elseif()
#else
#end
C、循环
#foreach($o in $list)
#end
#foreach($u in $users)
$velocityCount, $u.name --- $u.sex
#end
D、定义变量
#set($a=5)
如何把Velocity应用web环境中
二、使用Velcoity来生成CRUD
1、根据一个域模型,生成一个实体类相关的CRUD所有文件。
public class CrudGenerator {
private String template = "template";
private String clzName;
private Class entityClz;
public CrudGenerator(String clzName) {
super();
this.clzName = clzName;
try {
entityClz=Class.forName(clzName);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public CrudGenerator(String clzName, String template) {
super();
this.clzName = clzName;
this.template = template;
}
public void gen() {
//根据类名生成他所对应的*.hbm.xml文件
genFile(template+"/thbm.xml","src/cn/sanfy/test/pss/domain/"+entityClz.getSimpleName()+".hbm.xml");
//生成DAO文件
genFile(template+"/tdao.java","src/cn/sanfy/test/pss/dao/I"+entityClz.getSimpleName()+"Dao.java");
//生成DAO实现文件
genFile(template+"/tdaoImpl.java","src/cn/sanfy/test/pss/dao/impl/"+entityClz.getSimpleName()+"DaoImpl.java");
//生成Service接口
genFile(template+"/tservice.java","src/cn/sanfy/test/pss/service/I"+entityClz.getSimpleName()+"Service.java");
//生成Service的实现
genFile(template+"/tserviceImpl.java","src/cn/sanfy/test/pss/service/impl/"+entityClz.getSimpleName()+"ServiceImpl.java");
//生成Action的实现
genFile(template+"/taction.java","src/cn/sanfy/test/pss/web/"+entityClz.getSimpleName()+"Action.java");
//生成页面
//他创建目录
File f=new File("WebContent/WEB-INF/views/"+entityClz.getSimpleName());
if(!f.exists())f.mkdirs();
//生成list.jsp
genFile(template+"/tlist.jsp","WebContent/WEB-INF/views/"+entityClz.getSimpleName()+"/list.jsp");
//生成edit.jsp
genFile(template+"/tedit.jsp","WebContent/WEB-INF/views/"+entityClz.getSimpleName()+"/edit.jsp");
}
private void genFile(String templateFile,String targeFile){
//根据类名生成他所对应的*.hbm.xml文件
Velocity.init();
VelocityContext context=new VelocityContext();
try{
Class clz=entityClz;
context.put("clz", clz);
//获得实体类所声明所有字段
context.put("fields",clz.getDeclaredFields());
//获得模板
Template t= Velocity.getTemplate(templateFile,"utf-8");
//合并
FileWriter writer=new FileWriter(targeFile);
t.merge(context, writer);
writer.close();
}
catch(Exception e){
e.printStackTrace();
}
}
/**
* CrudGenerator cn.itcast.gz.pss.domain.Depot template
*
* @param args
*/
public static void main(String[] args) {
// 传一个类名过来 模板过来
String clzName = args[0];
String template = null;
if (args.length > 1) {
template = args[1];
}
CrudGenerator crudGen = new CrudGenerator(clzName);
if (template != null)
crudGen.template = template;
//开始生成
crudGen.gen();
}
}