velocity 相关

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

 

  



 
posted @ 2019-12-24 11:35  java从入门到精通  阅读(541)  评论(0编辑  收藏  举报