`
gstarwd
  • 浏览: 1526887 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Velocity自定义指令的render方法介绍

阅读更多

#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

分享到:
评论

相关推荐

    Velocity自定义标签无法注入spring的Service解决办法

    用springMVC+velocity时,当使用自定义标签,发现自定义标签无法注入spring的其它服务类,归根源码发现,velocity的源码中有一段,有一段代码永远获取的是新实例。所以,把这个地方的源码改了,所以使用这个的时候,...

    velocity语法

    当使用#set 指令时,括在双引号中的字面字符串将解析和重新解释,如下所示: #set($directoryRoot = "www" ) #set($templateName = "index.vm" ) #set($template = "$directoryRoot/$templateName" ) $template 输出...

    velocity的学习资料

    - 自定义指令:可以通过扩展Velocity,编写自定义指令以满足特定需求。 7. **最佳实践** - 尽量避免在模板中进行复杂的逻辑处理,保持模板简洁。 - 合理使用`#set`指令,避免全局变量污染。 - 使用`#macro`定义...

    velocity语法与使用方法

    二是Velocity模板引擎的语法及使用方法。然而,基于题目要求,本回答将着重于解析Velocity的相关知识点,并简要提及Tomcat的部分配置内容作为背景。 ### Tomcat部署项目配置背景 在文档中提到了如何通过修改`...

    Velocity教程

    在本文中,我们将深入探讨Velocity的核心概念、使用方法以及如何将其应用于实际项目。 **一、Velocity简介** Velocity是Apache软件基金会的一个开源项目,它提供了简单易用的模板语言,用于生成HTML、XML、电子邮件...

    Velocity

    此外,还可以通过 `VelocityTools` 注册工具类,将常用的 Java 类库方法暴露给模板使用,例如日期格式化、URL编码等。 **5. 与其他技术的集成** Velocity 可以轻松地与Spring、Struts等其他Java Web框架集成,提供...

    velocity入门使用教程

    - **自定义指令(Custom Directives)**:如果内置的指令不能满足需求,你可以创建自定义指令,扩展Velocity的功能。 - **模板的继承与包含(Template Inheritance and Includes)**:通过`#include`和`#macro`指令...

    apache velocity介绍及资料

    5. **工具引用**:Velocity支持引入自定义的工具类,这样在模板中就可以调用这些工具类的方法,增强模板的功能。 6. **异常处理**:Velocity如何处理模板解析和执行过程中的错误,以及如何配置错误报告和日志记录。...

    Velocity模板技术语法详细介绍

    Velocity模板技术语法详细介绍,包括很详细的示例代码 1.变量………………………………………………………………………………1 2.循环………………………………………………………………………………2 3.条件语句...

    Velocity用户手册 中文版

    这个用户手册中文版详细介绍了Velocity的使用方法和语法特性。 ** Velocity 的基本概念 ** 1. **模板(Template)**:模板是Velocity的核心,它是HTML或XML等静态页面中嵌入了Velocity指令的文件,用于生成最终的...

    velocity-1.7.jar

    4. **可扩展性**:Velocity支持自定义指令和工具,可以轻松扩展其功能以满足特定需求。 5. **性能**:Velocity在执行速度上表现出色,因为它在编译时就生成了Java字节码,从而提高了运行效率。 **依赖关系:** 在...

    Velocity小demo

    4. **可扩展性**:Velocity 支持自定义指令和方法,可以根据需求扩展其功能。 通过这个简单的 "Velocity 小 demo",你可以了解到 Velocity 如何工作以及如何在实际项目中使用它。进一步深入学习,你会发现 Velocity...

    velocity 电子书

    - 配置Velocity引擎涉及到设置资源加载器、缓存策略、错误处理以及自定义指令等。 - 通过调整配置,可以优化Velocity的性能和适应不同项目需求。 5. **Velocity与MVC模式** - 在Model-View-Controller架构中,...

    velocity的jar包

    1. **模板引擎**:Velocity提供了一个强大的模板引擎,允许开发者使用简单的文本格式来创建动态页面,模板中的指令由#号开头,如#{if}、#{foreach}等。 2. **模板语言**:Velocity模板语言(VTL)是 Velocity 的...

    Velocity简单案例

    8. **宏库和自定义指令**: Velocity允许创建宏库,宏是一种可重用的代码块,可以通过`#macro`定义。此外,还可以注册自定义指令扩展模板语言的功能。 9. **错误处理与调试**: Velocity提供了错误处理机制,当模板...

    Velocity介绍.ppt

    **Velocity 模板引擎介绍** Velocity 是一个基于 Java 的强大模板引擎,它的主要作用是将数据与模板结合,生成最终的输出。通过使用简单的模板语言(Template Language),Velocity 允许开发者无需深入理解 Java ...

    velocity jar包

    Velocity模板语言(VTL)是Velocity的核心,它允许开发者在模板文件中使用特定的指令和变量。例如,`#set`用于设置变量,`$variable`用于输出变量,`#if`、`#else`、`#end`用于条件判断,`#foreach`用于循环迭代。...

    Velocity 模版

    - **可扩展性强**:Velocity 支持自定义指令和工具,可以根据需求进行扩展。 **5. 实战经验分享** 在实际项目中,`Java的模板引擎Velocity初体验.doc` 可能包含了初学者如何快速上手 Velocity 的步骤和常见问题。...

Global site tag (gtag.js) - Google Analytics