volicity 自定义指令 Directive 并获取ApplicationContext

本文主要是介绍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上下文中获取依赖BEANprivate static ZookeeperUtil zookeeperUtil =  (ZookeeperUtil) ApplicationContextUtil.getApplicationContext().getBean(ZookeeperUtil.class);private SimpleNode simpleNode = null;private  String defauleValue="timerBin";@Overridepublic 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;}/*** 指定指令的名称*/@Overridepublic String getName() {return MACRO_TAG_NAME;}/*** 当前有LINE 1,BLOCK 2两个值,line行指令,不要end结束符,block块指令,需要end结束符  */@Overridepublic 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")

 

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

 

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

 

 

 

这篇关于volicity 自定义指令 Directive 并获取ApplicationContext的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/888661

相关文章

在C#中获取端口号与系统信息的高效实践

《在C#中获取端口号与系统信息的高效实践》在现代软件开发中,尤其是系统管理、运维、监控和性能优化等场景中,了解计算机硬件和网络的状态至关重要,C#作为一种广泛应用的编程语言,提供了丰富的API来帮助开... 目录引言1. 获取端口号信息1.1 获取活动的 TCP 和 UDP 连接说明:应用场景:2. 获取硬

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

C#实现获取电脑中的端口号和硬件信息

《C#实现获取电脑中的端口号和硬件信息》这篇文章主要为大家详细介绍了C#实现获取电脑中的端口号和硬件信息的相关方法,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 我们经常在使用一个串口软件的时候,发现软件中的端口号并不是普通的COM1,而是带有硬件信息的。那么如果我们使用C#编写软件时候,如

C#实现WinForm控件焦点的获取与失去

《C#实现WinForm控件焦点的获取与失去》在一个数据输入表单中,当用户从一个文本框切换到另一个文本框时,需要准确地判断焦点的转移,以便进行数据验证、提示信息显示等操作,本文将探讨Winform控件... 目录前言获取焦点改变TabIndex属性值调用Focus方法失去焦点总结最后前言在一个数据输入表单

通过C#获取PDF中指定文本或所有文本的字体信息

《通过C#获取PDF中指定文本或所有文本的字体信息》在设计和出版行业中,字体的选择和使用对最终作品的质量有着重要影响,然而,有时我们可能会遇到包含未知字体的PDF文件,这使得我们无法准确地复制或修改文... 目录引言C# 获取PDF中指定文本的字体信息C# 获取PDF文档中用到的所有字体信息引言在设计和出

python中os.stat().st_size、os.path.getsize()获取文件大小

《python中os.stat().st_size、os.path.getsize()获取文件大小》本文介绍了使用os.stat()和os.path.getsize()函数获取文件大小,文中通过示例代... 目录一、os.stat().st_size二、os.path.getsize()三、函数封装一、os

python获取当前文件和目录路径的方法详解

《python获取当前文件和目录路径的方法详解》:本文主要介绍Python中获取当前文件路径和目录的方法,包括使用__file__关键字、os.path.abspath、os.path.realp... 目录1、获取当前文件路径2、获取当前文件所在目录3、os.path.abspath和os.path.re

SpringBoot 自定义消息转换器使用详解

《SpringBoot自定义消息转换器使用详解》本文详细介绍了SpringBoot消息转换器的知识,并通过案例操作演示了如何进行自定义消息转换器的定制开发和使用,感兴趣的朋友一起看看吧... 目录一、前言二、SpringBoot 内容协商介绍2.1 什么是内容协商2.2 内容协商机制深入理解2.2.1 内容

Java子线程无法获取Attributes的解决方法(最新推荐)

《Java子线程无法获取Attributes的解决方法(最新推荐)》在Java多线程编程中,子线程无法直接获取主线程设置的Attributes是一个常见问题,本文探讨了这一问题的原因,并提供了两种解决... 目录一、问题原因二、解决方案1. 直接传递数据2. 使用ThreadLocal(适用于线程独立数据)

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template