模板技术Velocity应用

时间:2022-11-24 15:32:19

模板技术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();

 }


}