基于Velocity开发自己的模板引擎

时间:2021-04-26 21:26:22

Velocity是一个基于java的模板引擎(template engine)。它同意不论什么人只简单的使用模板语言(template language)来引用由java代码定义的对象。

当Velocity应用于web开发时,界面设计人员能够和java程序开发者同步开发一个遵循MVC架构的web网站,也就是说,页面设计人员能够仅仅 关注页面的显示效果,而由java程序开发者关注业务逻辑编码。Velocity将java代码从web页面中分离出来,这样为web网站的长期维护提 供了便利,同一时候也为我们在JSP,PHP和Freemarker之外又提供了一种可选的方案。

大多数开发者只了解上述部分,即Velocity能够作为MVC的V,所以出现了非常多Velocity和SpringMVC,Velocity和Struts集成的设计。但少有人关注,Velocity作为模板引擎的意义,既然是模板引擎,那它就不应该只局限在MVC的领域。

Velocity的能力远不止web网站开发这个领域,比如,它能够从模板(template)产生SQL和PostScript、XML,它也能够被当 作一个独立工具来产生源码和报告,或者作为其它系统的集成组件使用。

下面代码,是我对Velocity的简单封装,能够将Velocity作为单独的组件来使用,稍加丰富就能够成为我们应用的模板引擎。

核心代码:

package com.ths.platform.framework.template;

import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.Properties;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.app.VelocityEngine; public class VelocityParser
{
//模板上下文
private VelocityContext mainContext;
//模板对象
private Template mainTemplate;
//模板引擎
private VelocityEngine velocityEngine;
//模板引擎初始化參数
private Properties properties; public static void main( String[ ] args ) {
String filepath = "template/view.jsp";
VelocityParser velocityParser = new VelocityParser( filepath );
velocityParser.addToContext( "title" , "HelloWorld" );
velocityParser.processTemplate( );
} /**
* @MethodName : addToContext
* @Description : 向模板上下文中加入參数
* @param key
* @param value
*/
public void addToContext( String key, Object value ) {
if ( mainContext == null )
{
mainContext = new VelocityContext( );
} mainContext.put( key , value );
} /**
* @MethodName : addToContext
* @Description :初始化模板上下文
* @param chainCtx
*/
public void addToContext( VelocityContext chainCtx ) {
mainContext = new VelocityContext( chainCtx );
} /**
* @MethodName : processTemplate
* @Description : 输出到控制台
*/
public void processTemplate() {
try
{
BufferedWriter writer = new BufferedWriter( new OutputStreamWriter( System.out ) );
if ( mainTemplate != null )
{
mainTemplate.merge( mainContext , writer );
} writer.flush( );
writer.close( );
}
catch ( Exception ex )
{
ex.printStackTrace( );
}
} /**
* @MethodName : processTemplate
* @Description : 输出到文件
* @param destPath
*/
public void processTemplate(String destPath) {
try
{
OutputStream os = new FileOutputStream(destPath);
OutputStreamWriter writer = new OutputStreamWriter(os, "UTF-8"); if ( mainTemplate != null )
{
mainTemplate.merge( mainContext , writer );
} writer.flush( );
writer.close( );
}
catch ( Exception ex )
{
ex.printStackTrace( );
}
} /**
* 依据模板文件初始化模板引擎
* @param templateFile
*/
public VelocityParser( String templateFile ) {
 this(templateFile , null);
} /**
* 依据模板文件和模板上下文(參数)初始化模板引擎
* @param templateFile
* @param chainContext
*/
public VelocityParser( String templateFile , VelocityContext chainContext ) {
try
{
//新建模板引擎
velocityEngine = new VelocityEngine( ); //获取初始化參数
properties = initProperties( ); //初始化模板引擎
velocityEngine.init( properties ); //获取模板对象
mainTemplate = velocityEngine.getTemplate( templateFile ); //设置模板上下文
  if(chainContext!=null){
                //设置模板上下文
                mainContext = chainContext;
            } }
catch ( Exception ex )
{
System.out.println( "Error processing template file: " + templateFile );
}
} /**
* @MethodName : initProperties
* @Description : 设置初始化參数
* @return
*/
private Properties initProperties() {
Properties properties = new Properties( );
//设置从classpath中载入模板文件
properties.setProperty( Velocity.FILE_RESOURCE_LOADER_PATH , Thread.currentThread( )
.getContextClassLoader( ).getResource( "" ).getPath( ) );
//解决模板中文乱码
properties.setProperty( Velocity.INPUT_ENCODING , "utf-8" );
properties.setProperty( Velocity.OUTPUT_ENCODING , "utf-8" );
return properties;
} }

模板:
 <table>
<tr><td>$title</td></tr>
</table>

运行main方法,就可以在控制台输出模板和參数合并后生成的数据。

有了这段代码,仅仅要开发过程中,再涉及到反复劳动,再涉及到输出什么报告,仅仅要你能抽取出模板,其它工作,就让它滚犊子去吧。