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

使用velocity来配置内容,用观察者模式自动load模板文件

阅读更多

业务中要用notify发短信。应用端向notify发,有一个短信订阅该消息,并组织内容发出去。

 

我们决定采用velocity来组织内容,并且当修改vm模板内容时能自动识别并加载,不用重新启动程序。

 

 

package com.test.velocity;

import java.io.File;
import java.io.StringWriter;
import java.util.Map;
import java.util.Observable;
import java.util.Observer;
import java.util.Properties;

import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.app.VelocityEngine;

/**
 * 
 * 描述
 *
 * @author 锅巴
 * @version 1.0 2010-7-12
 */
public class ParseNotify implements Observer {

    private VelocityEngine ve;

    private Template template;

    private final String velocityFileName = "hellovelocity.vm";

    private final String velocityFilePath = "D:\\workspace_mvn\\my-nom\\";

    public ParseNotify() throws Exception {
        init();
        Object velocityFileChangeObservable = new VelocityFileChangeObservable(
                velocityFilePath + velocityFileName);
        ((Observable) velocityFileChangeObservable).addObserver(this);
        new Thread((Runnable) velocityFileChangeObservable).start();
    }

    private void init() throws Exception {
        ve = new VelocityEngine();
        Properties prop = new Properties();
        prop.setProperty(Velocity.ENCODING_DEFAULT, "GBK");
        prop.setProperty(Velocity.INPUT_ENCODING, "GBK");
        prop.setProperty(Velocity.OUTPUT_ENCODING, "GBK");
        ve.init(prop);
        template = ve.getTemplate(velocityFileName);
    }

    private Template getVelocityTemplate() throws Exception {
        return template;
    }

    public SmsBean parseNotifyMsg(Map<String, String> notifyMsg)
            throws Exception {

        VelocityContext context = new VelocityContext();
        for (Map.Entry<String, String> entry : notifyMsg.entrySet()) {
            context.put(entry.getKey(), entry.getValue());
        }
        StringWriter writer = new StringWriter();
        getVelocityTemplate().merge(context, writer);
        return new SmsBean(writer.toString(), notifyMsg.get("mobile"));

    }

    public void update(Observable o, Object arg) {
        // TODO Auto-generated method stub
        try {
            init();
            System.out.println("ParseNotify Observable update ");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    static class VelocityFileChangeObservable extends Observable implements
            Runnable {

        private long lastModifiedTime;

        private File file;

        public VelocityFileChangeObservable(String filePath) {

            file = new File(filePath);
            if (!file.exists()) {
                throw new IllegalArgumentException("file not exists");
            }
            lastModifiedTime = file.lastModified();

        }

        public void run() {
            // TODO Auto-generated method stub
            while (true) {
                try {
                    Thread.sleep(5000);
                    if (file.lastModified() > lastModifiedTime) {
                        this.setChanged();
                        this.notifyObservers();
                        this.lastModifiedTime = file.lastModified();
                        System.out.println("hellovelocity.vm is changed");
                    }
                    System.out.println("VelocityFileChangeObservable run");
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }

    }
}

 ParseNotify 类负责解晰notify信息(以Map传入),有一个内部类VelocityFileChangeObservable 观察vm文件是否被更改,如果更改则通知ParseNotify 重新load vm

 

  阿里巴巴招聘:java/C/C++/PHP ,Hadoop,搜索工程师,

                          前端,视觉,交互工程师,系统/数据库工程师,

                          产品经理,运营,市场等

  

  有意请将简历发邮件:iloveditan@sina.cn

0
0
分享到:
评论

相关推荐

    Velocity配置文件详解

    通过深入理解`velocity.properties`配置文件中的各项配置,开发者能够更加高效地利用Apache Velocity框架来构建动态页面和文档。合理配置这些选项不仅能够提升应用性能,还能确保模板渲染的准确性和灵活性。

    SpringBoot Velocity 代码生成模板

    总的来说,SpringBoot集成Velocity代码生成模板是现代企业级开发中一个非常实用的技术,它使得开发人员能够更专注于业务逻辑,而不是重复的模板代码。通过熟练掌握这一技术,开发者能够在保证代码质量的同时,提高...

    Velocity模板入门DEMO

    在“Apache-Velocity-java”这个压缩包中,很可能包含了示例代码和一个简单的 Velocity 模板文件,展示如何在Java应用程序中使用Velocity来生成动态HTML。你可以通过以下步骤运行DEMO: 1. 解压压缩包。 2. 查看...

    Velocity模板使用指南中文版

    ** Velocity 模板使用指南中文版 ** Velocity 是一个基于 Java 的开源模板引擎,它允许开发者将业务逻辑与页面展示分离,使得网页设计者可以专注于页面的布局和样式,而程序员则关注于程序的逻辑处理。Velocity 在 ...

    velocity实现邮件模板定制

    5. **合并模板与数据**:使用`Velocity.mergeTemplate()`方法,传入模板文件路径和上下文,生成最终的邮件内容字符串。 6. **发送邮件**:将生成的邮件内容传递给邮件服务API,完成发送。 关于源码,Velocity的...

    velocity入门使用教程

    教程内容包含了解Velocity模板引擎的基础知识、学习VTL语法、设置和使用velocity.properties配置文件以及如何在Servlet和Spring MVC环境中集成Velocity。 ### Velocity模板引擎的基本使用方法 Velocity可以用来...

    Jsp结合Velocity实现依据Word模板文件生成对应数据文件

    3. **读取模板文件**:使用Velocity的`ResourceLoader`加载Word模板文件,这通常涉及到文件系统的操作或者使用URL。 4. **填充数据**:在上下文中添加你需要的数据,例如数据库查询结果、服务器配置信息等。 5. **...

    velocity模板使用指南中文版

    Velocity 模板使用指南中文版 Velocity 是一种流行的模板引擎,广泛应用于Java 和 .Net 平台。它提供了一个灵活、可扩展的模板语言,能够根据需要生成动态内容。本文档是 Velocity 模板使用指南中文版,旨在帮助...

    使用了Struts结构和Velocity模板技术的BLOG

    本项目“使用了Struts结构和Velocity模板技术的BLOG”旨在演示如何结合这两种技术来创建一个功能完善的博客系统。 **Struts框架** Struts是一个基于MVC(Model-View-Controller)设计模式的Java Web框架。它为...

    Velocity之HelloWorld配置

    Velocity是一款Java模板引擎,它是Apache软件基金会的Jakarta项目之一,主要用于生成动态Web内容。Velocity通过将内容展示与业务逻辑分离,使得开发者可以专注于后端逻辑,而设计师可以专注于页面设计。在这个...

    Velocity模板应用

    Velocity的目标是使开发者能够用简单的模板语言来控制页面的布局和格式,同时将复杂的逻辑处理交给后台Java代码。这样做的好处在于,模板设计师和程序员可以各自专注于自己的工作,提高了开发效率和代码可维护性。 ...

    Velocity--java的模板引擎

    在Velocity中,View就是模板文件(.vm),它包含静态文本和Velocity指令,Model则是Java对象,Controller的工作由Velocity Engine完成,它解析模板,将Java对象的数据嵌入到模板中,生成最终的HTML或其他格式的输出...

    velocity开发包vm模板引擎

    在使用Velocity时,首先需要在项目中引入这两个jar包,然后配置Velocity的上下文(Context),将Java对象放入其中,这些对象的属性可以在VM模板中通过$符号访问。接下来,通过Velocity引擎解析和渲染模板,生成最终...

    Velocity模板解析

    - **变量引用**:在Velocity模板中,通常使用`$variable`来引用Java对象的属性,例如`$user.name`表示获取名为"user"的对象的"name"属性。 - **指令**: - `#set`:用于赋值,如`#set($count = 1)`,将$count变量...

    SpringMVC3+velocity最简单配置例子

    对于Velocity,需要配置`VelocityViewResolver`,告诉SpringMVC使用Velocity来渲染视图。例如: ```xml &lt;bean class="org.springframework.web.servlet.view.velocity.VelocityConfigurer"&gt; ...

    92.Spring Boot使用模板velocity【从零开始学Spring Boot】

    接下来,我们需要创建一个Controller来处理请求并返回Velocity模板。例如: ```java @RestController public class ViewController { @GetMapping("/hello") public ModelAndView hello() { Map, Object&gt; ...

    测试模板Velocity.docx

    Velocity 模板语言和文档自动化技术 Velocity 模板语言是Apache软件基金会的一个开源项目,旨在提供一个灵活、模块化的模板引擎,可以用于生成静态或动态的文档、报表、邮件等。Velocity 模板语言的核心思想是将...

Global site tag (gtag.js) - Google Analytics