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

相关文章

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

使用Python实现获取网页指定内容

《使用Python实现获取网页指定内容》在当今互联网时代,网页数据抓取是一项非常重要的技能,本文将带你从零开始学习如何使用Python获取网页中的指定内容,希望对大家有所帮助... 目录引言1. 网页抓取的基本概念2. python中的网页抓取库3. 安装必要的库4. 发送HTTP请求并获取网页内容5. 解

如何自定义Nginx JSON日志格式配置

《如何自定义NginxJSON日志格式配置》Nginx作为最流行的Web服务器之一,其灵活的日志配置能力允许我们根据需求定制日志格式,本文将详细介绍如何配置Nginx以JSON格式记录访问日志,这种... 目录前言为什么选择jsON格式日志?配置步骤详解1. 安装Nginx服务2. 自定义JSON日志格式各

Nginx指令add_header和proxy_set_header的区别及说明

《Nginx指令add_header和proxy_set_header的区别及说明》:本文主要介绍Nginx指令add_header和proxy_set_header的区别及说明,具有很好的参考价... 目录Nginx指令add_header和proxy_set_header区别如何理解反向代理?proxy

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

使用Python高效获取网络数据的操作指南

《使用Python高效获取网络数据的操作指南》网络爬虫是一种自动化程序,用于访问和提取网站上的数据,Python是进行网络爬虫开发的理想语言,拥有丰富的库和工具,使得编写和维护爬虫变得简单高效,本文将... 目录网络爬虫的基本概念常用库介绍安装库Requests和BeautifulSoup爬虫开发发送请求解

基于Spring实现自定义错误信息返回详解

《基于Spring实现自定义错误信息返回详解》这篇文章主要为大家详细介绍了如何基于Spring实现自定义错误信息返回效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录背景目标实现产出背景Spring 提供了 @RestConChina编程trollerAdvice 用来实现 HTT

Android App安装列表获取方法(实践方案)

《AndroidApp安装列表获取方法(实践方案)》文章介绍了Android11及以上版本获取应用列表的方案调整,包括权限配置、白名单配置和action配置三种方式,并提供了相应的Java和Kotl... 目录前言实现方案         方案概述一、 androidManifest 三种配置方式

SpringSecurity 认证、注销、权限控制功能(注销、记住密码、自定义登入页)

《SpringSecurity认证、注销、权限控制功能(注销、记住密码、自定义登入页)》SpringSecurity是一个强大的Java框架,用于保护应用程序的安全性,它提供了一套全面的安全解决方案... 目录简介认识Spring Security“认证”(Authentication)“授权” (Auth