背景说明:在基于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")
当然自定义指令中可以传输多个值。
注:以上配置只是提供了简单的思路,望各位在应用到自己项目中时请自行考虑安全问题(推荐签名方式传值)。
相关推荐
这两个指令属于Velocity Tools的扩展,如果你的项目中引入了Velocity Tools,可以通过在`velocity.properties`文件中添加以下配置来启用它们: ```properties userdirective = org.apache.velocity.tools.generic....
Velocity是什么? Velocity是一个基于java的模板引擎(template engine)。它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。 当Velocity应用于web开发时,界面...
Velocity模板技术语法详细介绍,包括很详细的示例代码 1.变量………………………………………………………………………………1 2.循环………………………………………………………………………………2 ...
对于标签“源码”和“工具”,我们可以进一步研究这两个模板引擎的源代码,理解其工作原理,并掌握如何在项目中有效利用它们。提供的文件列表似乎包含了一些日志文件、项目配置文件和源代码库,这可能是项目开发或...
里面有struts2的国际化例子,还有struts2校验框架例子,还有freemarker结合struts2的例子,还有一个volicity和struts2对比的例子(引张荣华的一部分'作者言明要标注,所以特此写明')还有自己写的以部分!...