使用freemarker实现静态模板维护及动态内容展示案例

1.需求:
例如各类网站上的用户展示对应的合同,不同用户使用的合同模板一样,只是用户信息不一样,静态模板可在后台进行维护操作;用户在前台进行查看时将用户的信息动态渲染到静态模板上再到前台进行展示。
这里写图片描述
分解需求以上需求有两个技术重点
a.静态模板管理维护。
b.参数数据动态渲染。
2.技术分析:
使用freemarker实现,主要使用到了其渲染机制,参数${name}可以动态获取并渲染成传递过来的参数值,如下图:
这里写图片描述
该图来自freemarker官网详见http://freemarker.org/ 其实只要满足该机制的模板引擎都可以实现以上需求。
以上满足我们的b需求。
那a需求就是例如将静态模板保存到数据库中,能够支持后台管理人员进行维护,而且模板中的参数格式是需要满足freemarker的标签格式的${参数},而且要包含管理人员定义的参数,因此最好能提供一份参数文档及说明以便人员进行管理。

    公司名称    ${companyName}
    公司地址    ${companyAddr}
    公司电话    ${companyTel}

3.技术实现:
常见的适用freemarker的使用方式为带着参数跳转至已经写好的静态页面上虽然处理机制不变,但页面是静态页面不利于维护,弊端就是每次合同发生更改,需要开发人员进行更改、发布、上线;关键工作繁琐毫无技术含量,这是对资源的一种严重浪费。

ModelAndView modelAndView = new ModelAndView("admin/feedActivity/feedActivityConsolUpdate");
FeedActivity feedActivity=feedActivityService.getFeedActivity(id);
modelAndView.addObject( "feedActivity",feedActivity);
return modelAndView;

于是将静态模板保存在数据库中,管理员可以在文本编辑器中进行维护,现在问题的关键是如何将带参数的模板将参数动态渲染为用户信息并输出:
以下是一个简单的例子

import java.io.StringWriter;
import java.io.IOException;
import freemarker.cache.StringTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

    public static void main(String[] args){
        String content = "客户:${clientName}";//合同模板内容
        StringWriter writer = new StringWriter();
        Configuration configuration = new Configuration(DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
        StringTemplateLoader stringLoader = new StringTemplateLoader();
        stringLoader.putTemplate("contract", content);
        configuration.setTemplateLoader(stringLoader);
        try {
            Template template = configuration.getTemplate("contract","utf-8");
            //要动态替换的参数值
            Map<String,Object> root = new HashMap<>();
            root.put("clientName","张三");//协议编号
            try {
                template.process(root,writer);
                System.out.println(writer.toString());
            } catch (TemplateException e) {
                e.printStackTrace();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

运行以上程序得到结果:客户:张三,已经动态的将参数渲染上去了,接下来就是维护复杂静态模板并参数渲染了。
以上是目前开发中使用的方案,每个环节不一定要与以上一致,能达到同样的效果不局限于使用数据库存储静态模板或是使用freemarker模板引擎,有更好或更有想法的处理方式可以在评论区留言,让大家一起感受。

猜你喜欢

转载自blog.csdn.net/fu250/article/details/78193761
今日推荐