velocity 相关
2024-09-06 05:36:13
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
最新文章
- 本周进步要点20161023(含李笑来第二场live笔记要点)
- AndroidStudio Rename Package
- js 判断数组包含某值的方法 和 javascript数组扩展indexOf()方法
- 68. Longest Common Prefix
- hdu 4712 Hamming Distance(随机数法)
- 解决eclipse配置Tomcat时找不到server选项
- Online DDL与pt-online-schema-change
- leetcode修炼之路——387. First Unique Character in a String
- javaweb文件下载
- (C#)Windows Shell 编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令
- DDL 和DML 区别
- 记住这个网站:服务器相关数据统计网站 http://news.netcraft.com/
- java----静态代理
- Java问题解决:springboot启动出现-Your ApplicationContext is unlikely to start due to a @ComponentScan of the default package
- Python+Selenium学习--异常截图
- C语言---选择结构和循环结构
- python数字
- jscript调用bat注意事项
- Redis学习手册(主从复制)(转)
- HashTable、HashMap、ConcurrentHashMap、Collections.synchronizedMap()区别
热门文章
- 从上一个页面跳入新页面时,如何拿URL中的参数
- 推荐几个顶级的IT技术公众号,坐稳了!
- uvloop官网翻译
- 挂载时出现mount: RPC: Unable to receive; errno = Connection refused错误的解决方法
- Ubuntu apt-get 更新/查看软件
- java漏洞历史
- 函数高阶(函数,改变函数this指向,高阶函数,闭包,递归)
- 关于PCB的Mark点
- shell script 学习
- string::size_type 页73 size_t 页90