`
TimerBin
  • 浏览: 362172 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

volicity 自定义指令 Directive 并获取ApplicationContext

阅读更多

背景说明:在基于spring MVC、volicity的WEB项目中,需要在volicity页面中读取远程配置信息(zookeeper)。

 

第一步:编写读取远程配置信息工具类(具体不做说明)

 

详情可参阅:http://timerbin.iteye.com/blog/2252372

 

第二步:编写自定义指令(Directive)

 

package cn.timerbin.util;
import java.io.IOException;
import java.io.Writer;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.velocity.context.InternalContextAdapter;
import org.apache.velocity.exception.MethodInvocationException;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.apache.velocity.runtime.directive.Directive;
import org.apache.velocity.runtime.parser.node.ASTBlock;
import org.apache.velocity.runtime.parser.node.Node;
import org.apache.velocity.runtime.parser.node.SimpleNode;
import com.sun.el.parser.AstString;

public class ConfigTool extends Directive {
	
	private static final Log logger = LogFactory.getLog(ConfigTool.class);
	
	private static final String  MACRO_TAG_NAME="config";
	
	private static final int MACRO_TAG_TYPE = 2;
	//在spring上下文中获取依赖BEAN
	private static ZookeeperUtil zookeeperUtil =  (ZookeeperUtil) ApplicationContextUtil.getApplicationContext().getBean(ZookeeperUtil.class);
	private SimpleNode simpleNode = null;
	private  String defauleValue="timerBin";
	 
	@Override
	public boolean render(InternalContextAdapter context, Writer writer, Node node) throws IOException, ResourceNotFoundException, ParseErrorException, MethodInvocationException {
	    String value = null;
		for(int i=0,j=node.jjtGetNumChildren();i<j;++i){
			simpleNode = (SimpleNode)node.jjtGetChild(i);
			if (null == simpleNode){
				continue;
			}
			if(i == 0){
				value = getValue((String)simpleNode.value(context));
			}
		}
		if(StringUtils.isBlank(value)){
			value = defauleValue;
		}
		writer.write(value);
		return false;
	}
        //在zookeeper中读取其中的值
	private String getValue(String key) {
		String value = null;
		try {
			if (!StringUtils.isBlank(key) && null != zookeeperUtil) {
				value = zookeeperUtil.get(key);
				if (StringUtils.isBlank(value)) {
					value = defauleValue;
				}
			}else{
				value = defauleValue;
			}
		} catch (Exception e) {
			value = defauleValue;
			logger.error(String.format("get.value.is.error:%s", key), e);
		}
		return value;
	}
	 
	/**
	 * 指定指令的名称
	 */
	@Override
	public String getName() {
		return MACRO_TAG_NAME;
	}

	/**
	 * 当前有LINE 1,BLOCK 2两个值,line行指令,不要end结束符,block块指令,需要end结束符  
	 */
	@Override
	public int getType() {
		return MACRO_TAG_TYPE;
	}
}

 

 

第三步:定义获取spring 上下文 applicationContext的工具类

 

package cn.timerbin.util;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

public class ApplicationContextUtil implements ApplicationContextAware {

	private static ApplicationContext context;
	
	public void setApplicationContext(ApplicationContext context)
			throws BeansException {
		this.context=context;
	}
 
	public static ApplicationContext getApplicationContext(){
		return context;
	}
}

 

 

第四步:将自定义指令和自定义applicationConext的工具类定义到spring配置文件中

 

<bean class="cn.timerbin.util.ApplicationContextUtil"></bean>

<!--volicity-->
<bean id="velocityConfigurer" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
	<property name="resourceLoaderPath" value="/"/>
	<property name="configLocation" value="classpath:velocity.properties"/>
	<property name="velocityProperties">
		<props>
			<prop key="userdirective">cn.timerbin.util.ConfigTool</prop>
		</props>
	</property>
</bean>

 其中velocityConfigurer常用的配置如下所示:

resourceLoaderPath:页面所放路径

configLocation:模板的配置参数信息其实与velocityProperties可以二选一来定义

velocityProperties

---userdirective:自定义指令

 

----velocimacro.library:定义宏的绑定仓库地址

其中配置较多可参阅:http://biz.163.com/0000/05/0226/15/1DHBTUKK000017JV.html

 

第五步:在volicity的页面VM中使用自定义指令

#config("zookeeper-key-name")

 

当然自定义指令中可以传输多个值。

 

注:以上配置只是提供了简单的思路,望各位在应用到自己项目中时请自行考虑安全问题(推荐签名方式传值)。

 

 

 

分享到:
评论
1 楼 763863446 2017-10-12  
     非常感谢作者,刚才自定义了宏,但是在 velocity.property  中配置无效,看到可以直接配置在xml文件的 velocityConfigurer bean中,一试,真的有效,解决了大问题,谢谢!!

相关推荐

    velocity为空判断

    这两个指令属于Velocity Tools的扩展,如果你的项目中引入了Velocity Tools,可以通过在`velocity.properties`文件中添加以下配置来启用它们: ```properties userdirective = org.apache.velocity.tools.generic....

    Velocity用户手册---中文版

    Velocity是什么? Velocity是一个基于java的模板引擎(template engine)。它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。 当Velocity应用于web开发时,界面...

    Velocity模板技术语法详细介绍

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

    velocity和freemarker的比较

    对于标签“源码”和“工具”,我们可以进一步研究这两个模板引擎的源代码,理解其工作原理,并掌握如何在项目中有效利用它们。提供的文件列表似乎包含了一些日志文件、项目配置文件和源代码库,这可能是项目开发或...

    Struts2Spring2Hibernate3.zip

    里面有struts2的国际化例子,还有struts2校验框架例子,还有freemarker结合struts2的例子,还有一个volicity和struts2对比的例子(引张荣华的一部分'作者言明要标注,所以特此写明')还有自己写的以部分!...

Global site tag (gtag.js) - Google Analytics