#define指令的作用刚好是相反的,rewrite实现功能:用任意一个vm来作layout布局,或任意重写layout中的某一部分!
1、修改velocity.properties,添加要自定义的指令的类
# 配制自定义指令所指向的类
userdirective=com.wcsky.common.directive.RewriteDirective
#
配制自定义指令的默认使用参数
userdirective.rewrite.status=false
2、重载Directive的init、render方法:
/**
* 重载init方法,初始自定义指令的配制参数
*/
@Override
public void init(RuntimeServices rs, InternalContextAdapter context, Node node)
throws TemplateInitException {
super.init(rs, context, node);
//指令初始化可调用配制参数
//canRewrite= rs.getBoolean("userdirective.rewrite.status", false);
}
/**
* 重载Directive的render,实现rewrite指令
* usage:
* layout.vm:#rewrite("silder_bar") .... #end
* detail.vm: #rewrite("slider_bar",true) Rewrite Success ! #end
* 输出: Rewrite Success !
*
*/
public boolean render(InternalContextAdapter context, Writer writer,
Node node) throws IOException,
ResourceNotFoundException,ParseErrorException,
MethodInvocationException {
String rewriteKey = DirectiveUtils.getMarcoParam(context, node, 0);
Boolean rewrite = DirectiveUtils.getMarcoParam(context, node, 1);
Node nodeParent = null;
if(rewrite != null && rewrite){
nodeParent = node.jjtGetChild(2);
// 关键:使得父模版可调用子模版的节点
context.put(rewriteKey, nodeParent);
return true;
}else{
nodeParent = (Node)context.get(rewriteKey);
if(nodeParent == null){
nodeParent = node.jjtGetChild(1);
}
}
nodeParent.render(context, writer);
return true;
}
/**
* 获取指令的参数值
* @author Jimmy 2010-4-22
* @param
* @param context
* @param node
* @param paramIndx
* @return 返回参数值
*/
@SuppressWarnings("unchecked")
public static T getMarcoParam(InternalContextAdapter context,
Node node,int paramIndx){
if(node.jjtGetChild(paramIndx) != null){
Node n = node.jjtGetChild(paramIndx);
if(n==null){
return null;
}
return (T) n.value(context);
}
//log.warn("Error: Node "+paramIndx +" is Null");
return null;
}
3、使用场景:
a.在统一布局layout中,在显示详细信息,希望全屏宽显示时,可以把layout中的slider用指令rewrite
定义为可重写,
b、希望某个js脚本或meta,css样式为某个页面所特有,又希望共用同一个layout,可以在子模版rewrite
#rewrite("spec_css",true)
<link media="screen" type="text/css" href='$link.themes("blog.css")' rel="stylesheet">
#end
原文链接:http://www.itsmile.net/blog/article_show/20/273550/Velocity-Directive-render-method-of-instruction-introduced
分享到:
相关推荐
用springMVC+velocity时,当使用自定义标签,发现自定义标签无法注入spring的其它服务类,归根源码发现,velocity的源码中有一段,有一段代码永远获取的是新实例。所以,把这个地方的源码改了,所以使用这个的时候,...
当使用#set 指令时,括在双引号中的字面字符串将解析和重新解释,如下所示: #set($directoryRoot = "www" ) #set($templateName = "index.vm" ) #set($template = "$directoryRoot/$templateName" ) $template 输出...
- 自定义指令:可以通过扩展Velocity,编写自定义指令以满足特定需求。 7. **最佳实践** - 尽量避免在模板中进行复杂的逻辑处理,保持模板简洁。 - 合理使用`#set`指令,避免全局变量污染。 - 使用`#macro`定义...
二是Velocity模板引擎的语法及使用方法。然而,基于题目要求,本回答将着重于解析Velocity的相关知识点,并简要提及Tomcat的部分配置内容作为背景。 ### Tomcat部署项目配置背景 在文档中提到了如何通过修改`...
在本文中,我们将深入探讨Velocity的核心概念、使用方法以及如何将其应用于实际项目。 **一、Velocity简介** Velocity是Apache软件基金会的一个开源项目,它提供了简单易用的模板语言,用于生成HTML、XML、电子邮件...
此外,还可以通过 `VelocityTools` 注册工具类,将常用的 Java 类库方法暴露给模板使用,例如日期格式化、URL编码等。 **5. 与其他技术的集成** Velocity 可以轻松地与Spring、Struts等其他Java Web框架集成,提供...
- **自定义指令(Custom Directives)**:如果内置的指令不能满足需求,你可以创建自定义指令,扩展Velocity的功能。 - **模板的继承与包含(Template Inheritance and Includes)**:通过`#include`和`#macro`指令...
5. **工具引用**:Velocity支持引入自定义的工具类,这样在模板中就可以调用这些工具类的方法,增强模板的功能。 6. **异常处理**:Velocity如何处理模板解析和执行过程中的错误,以及如何配置错误报告和日志记录。...
Velocity模板技术语法详细介绍,包括很详细的示例代码 1.变量………………………………………………………………………………1 2.循环………………………………………………………………………………2 3.条件语句...
这个用户手册中文版详细介绍了Velocity的使用方法和语法特性。 ** Velocity 的基本概念 ** 1. **模板(Template)**:模板是Velocity的核心,它是HTML或XML等静态页面中嵌入了Velocity指令的文件,用于生成最终的...
4. **可扩展性**:Velocity支持自定义指令和工具,可以轻松扩展其功能以满足特定需求。 5. **性能**:Velocity在执行速度上表现出色,因为它在编译时就生成了Java字节码,从而提高了运行效率。 **依赖关系:** 在...
4. **可扩展性**:Velocity 支持自定义指令和方法,可以根据需求扩展其功能。 通过这个简单的 "Velocity 小 demo",你可以了解到 Velocity 如何工作以及如何在实际项目中使用它。进一步深入学习,你会发现 Velocity...
- 配置Velocity引擎涉及到设置资源加载器、缓存策略、错误处理以及自定义指令等。 - 通过调整配置,可以优化Velocity的性能和适应不同项目需求。 5. **Velocity与MVC模式** - 在Model-View-Controller架构中,...
1. **模板引擎**:Velocity提供了一个强大的模板引擎,允许开发者使用简单的文本格式来创建动态页面,模板中的指令由#号开头,如#{if}、#{foreach}等。 2. **模板语言**:Velocity模板语言(VTL)是 Velocity 的...
8. **宏库和自定义指令**: Velocity允许创建宏库,宏是一种可重用的代码块,可以通过`#macro`定义。此外,还可以注册自定义指令扩展模板语言的功能。 9. **错误处理与调试**: Velocity提供了错误处理机制,当模板...
**Velocity 模板引擎介绍** Velocity 是一个基于 Java 的强大模板引擎,它的主要作用是将数据与模板结合,生成最终的输出。通过使用简单的模板语言(Template Language),Velocity 允许开发者无需深入理解 Java ...
Velocity模板语言(VTL)是Velocity的核心,它允许开发者在模板文件中使用特定的指令和变量。例如,`#set`用于设置变量,`$variable`用于输出变量,`#if`、`#else`、`#end`用于条件判断,`#foreach`用于循环迭代。...
- **可扩展性强**:Velocity 支持自定义指令和工具,可以根据需求进行扩展。 **5. 实战经验分享** 在实际项目中,`Java的模板引擎Velocity初体验.doc` 可能包含了初学者如何快速上手 Velocity 的步骤和常见问题。...