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 ) { try { //新建模板引擎 velocityEngine = new VelocityEngine( ); //获取初始化参数 properties = initProperties( ); //初始化模板引擎 velocityEngine.init( properties ); //获取模板对象 mainTemplate = velocityEngine.getTemplate( templateFile ); } catch ( Exception ex ) { System.out.println( "Error processing template file: " + templateFile ); } } /** * 根据模板文件和模板上下文(参数)初始化模板引擎 * @param templateFile * @param chainContext */ public VelocityParser( String templateFile , VelocityContext chainContext ) { try { //新建模板引擎 velocityEngine = new VelocityEngine( ); //获取初始化参数 properties = initProperties( ); //初始化模板引擎 velocityEngine.init( properties ); //获取模板对象 mainTemplate = velocityEngine.getTemplate( templateFile ); //设置模板上下文 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方法,即可在控制台输出模板和参数合并后生成的数据。
有了这段代码,只要开发过程中,再涉及到重复劳动,再涉及到输出什么报告,只要你能抽取出模板,其他工作,就让它滚犊子去吧。
时间: 2024-10-17 16:46:54