• 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
    

      



     
  • 相关阅读:
    【动态规划】数的划分
    【动态规划】开心的小明
    【动态规划】回文字符串
    【动态规划】skiing_深度搜索_动态规划
    【动态规划】最大子串和
    JDBC中 execute 与 executeUpdate的区别
    poj 2449 Remmarguts' Date 求第k短路 Astar算法
    ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer 最大生成树 lca
    hdu 2586 How far away ? 倍增求LCA
    acm模板生成
  • 原文地址:https://www.cnblogs.com/zhonglihai/p/12090610.html
Copyright © 2020-2023  润新知