Apache Velocity 是一个基于java的模板引擎(template engine)
应用场景
1.Web 应用:开发者在不使用 JSP 的情况下,可以用 Velocity 让 HTML 具有动态内容的特性
2.源代码生成:Velocity 可以被用来生成 Java 代码、SQL
语法概要
1.在 Velocity 中所有的关键字都是以#开头的,而所有的变量则是以$开头。
2.关系和逻操作符
Velocity 也具有逻辑AND, OR 和 NOT 操作符。
3.在Velocity中可以使用循环语法遍历集合,语法结构如下:
#foreach($item in $list)
$item
$velocityCount
#end
4.在Velocity中可以使用条件语法对流程进行控制
#if(condition)
...dosonmething...
#elseif(condition)
...dosomething...
#else
...dosomething...
#end
5.#include和#parse的作用都是引入本地文件, 为了安全的原因,被引入的本地文件只能在TEMPLATE_ROOT目录下。
区别:
与#include不同的是,#parse只能指定单个对象。而#include可以有多个
如果您需要引入多个文件,可以用逗号分隔就行:
#include (“one.gif”, “two.txt”, “three.htm” )
#include被引入文件的内容将不会通过模板引擎解析;而#parse引入的文件内容Velocity将解析其中的velocity语法并移交给模板,意思就是说相当与把引入的文件copy到文件中。
velocity自定义功能标签:
1.加载设置
public VelocityServiceImpl() { VelocityEngineFactoryBean factory = new VelocityEngineFactoryBean(); Properties property = new Properties(); property.setProperty("resource.loader", "class"); property.setProperty("class.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); property.setProperty("input.encoding", DEFAULT_ENCODING); property.setProperty("output.encoding", DEFAULT_ENCODING); property.setProperty(Velocity.EVENTHANDLER_REFERENCEINSERTION, "com.sinolife.bep.common.util.VelocityReferenceHandler"); //自定义标签 property.setProperty("userdirective","com.sinolife.bep.common.util.UnTransferDirective"); factory.setVelocityProperties(property); factory.setResourceLoader(PlatformContext.getGoalbalContext(ResourceLoader.class, ResourceLoader.class)); try { factory.afterPropertiesSet(); } catch (Exception e) { throw new RuntimeException("Instal LocalLoginHander Error", e); } velocityEngine = factory.getObject(); }
2.定义标签
/** * 自定义不转义标签, * 功能:velocity使用此标签输出的值不会做转义处理 * 模板使用:#unTransfer("参数1") * 如:#unTransfer("<//123>") * 会直接输出<//123>到页面,不做转义。 * @author zhonglihai * */ public class UnTransferDirective extends Directive{ @Override public String getName() { return "unTransfer";//自定义指令的名称 } @Override public int getType() { return 2;//配置不带结束符 } @Override public boolean render(InternalContextAdapter context, Writer writer, Node node) throws IOException, ResourceNotFoundException, ParseErrorException, MethodInvocationException { try { String str = node.jjtGetChild(0).value(context).toString();//第一个值 writer.write(str.toString());//输出结果 } catch (Exception e) { return false; } return true; } }
3.标签使用
--Velocity引用解析控制器 public class VelocityReferenceHandler implements ReferenceInsertionEventHandler { public Object referenceInsert(String key, Object value) { if (value instanceof java.lang.String) { value = VelocityUtils.transeChar((String) value); } return value; } } --工具类,转义字符 public class VelocityUtils { /** * 把字符串里面的特殊字符进行转换 * * @param str * @return */ public static String transeChar(String str) { if (StringUtils.isNotBlank(str)) { str = str.replaceAll("<", "<").replaceAll(">", ">").replaceAll("&", "&") .replaceAll("'", "'").replaceAll(""", """); } return str; } } --模板页面使用 <!-- 4.发送OA的单据HTML快照 5.发送OA的单据PDF快照 采用<![CDATA[ ]]> 包裹--> #if($filterMask.operId != "2" && $filterMask.operId != "3") #if($filterMask.operId == "4" || $filterMask.operId == "5") <td><![CDATA[#unTransfer($!{billWorkFlowHistoryDomain.dealOpinion})]]></td> #else <td>#unTransfer($!{billWorkFlowHistoryDomain.dealOpinion})</td> #end #end