模板引擎-beetl

项目背景:

微门户页面上,介绍商家首页信息,而且这些信息比较少又不经常改变。【前期只单单针对商家首页进行静态处理,再由项目二期需要,再优化产品,优惠,等等模块,独立出专门模板服务类】故改用静态文件方式展示,真有需要时可以组建静态资源服务器,与业务服务器分离,减少服务器压力。

管理端【发布/更新】商家信息时调用生成静态文件代码。商家实体添加一属性,作为保存静态文件的相对地址,当页面访问商家首页,直接跳转到该相对地址。

模板文件为【*.html】

生成后的静态文件为【*.html】

文件存放位置如图所示...

Maven引用

<dependency>
    <groupId>org.beetl</groupId>
    <artifactId>beetl-core</artifactId>
    <version>${org.beetl-core.version}</version>
</dependency>

Controller代码如下

    String srcTemplateFileName = "companyTemplate.html";
    String srcToFileName = "index.html";
    Map<String, String> info = companyService.getStaticInfo(publicAccountId, srcTemplateFileName, srcToFileName);
    //生成静态文件对象
    companyService.updateTemplateCompany(companyId, info);

    //更新该实体对象的静态文件路径
    //静态文件路径
    String dbToPath = info.get("dbToPath");
    //静态文件名称
    String toFileName = info.get("toFileName");
    //生成后的静态文件相对路径,持久化到实体中
    entity.setStaticFilePath(dbToPath + toFileName);
    companyService.update(entity);

Service代码如下

        @Override
	public Map<String, String> getStaticInfo(Long publicAccountId, String templateFileName, String toFileName) {
		Map<String, String> map = new HashMap<String, String>();
		map.put("templateFileName", "company/" + templateFileName);
		map.put("dbToPath", "/resources/static/company/" + dESServiceImpl.encrypt(publicAccountId+"") + "/");
		map.put("toPath", WebUtil.getRequest().getSession().getServletContext().getRealPath("/") + "/resources/static/company/" + dESServiceImpl.encrypt(publicAccountId + "") + "/");
		map.put("toFileName", toFileName);
		//检验生成静态文件目录不存在时自动创建目录
		File file = new File(map.get("toPath"));
		if(!file.exists()){
			file.mkdirs();
		}
		logger.info("生成静态文件时的路径参数:" + map);
		return map;
	}

	@Override
	public void updateTemplateCompany(Long companyId, Map<String, String> map) {
		Company company = super.find(companyId);
		Map<String, Object> param = new HashMap<String, Object>();
		param.put("company", company);
		param.put("basePath", RESOURCESURL);
		param.put("path", WebUtil.getRequest().getContextPath());
		logger.info("生成模板的参数:" + param);
		//模板文件名
		String templateFileName = map.get("templateFileName");
		//静态路径
		String toPath = map.get("toPath");
		//静态文件名
		String toFileName = map.get("toFileName");

		TemplateUtil.templateToFile(templateFileName, toPath, toFileName, param);
	}

Beetl代码很简单的封装如下

    private static final String DEFAULT_CODE = "UTF-8";
 
    /**
     * 模板对象
     */
    private static GroupTemplate gt;
 
    /**
     * 获取webapp的系统路径
     */
    private static final String PATH = WebUtil.getRequest().getSession().getServletContext().getRealPath("/");
 
    /**
     * 存放模板的路径(配置到config.properties)
     */
    private static final String TEMPLATEFILEPATH = ConfigUtils.config.getProperty("defaultTemplatePath");
 
 
    static {
        FileResourceLoader fileResourceLoader = new FileResourceLoader(PATH + TEMPLATEFILEPATH, DEFAULT_CODE);
        logger.info("系统盘模板文件夹:" + PATH + TEMPLATEFILEPATH);
        Configuration cfg = null;
        try {
            cfg = Configuration.defaultConfiguration();
            cfg.setCharset(DEFAULT_CODE);
            gt = new GroupTemplate(fileResourceLoader, cfg);
        } catch (IOException e) {
            e.printStackTrace();
            logger.error("模板引擎初始化失败", e);
        }
    }
 
 
    /**
     * 根据模板文件生成静态文件(html)
     * 
     * @param templateFilePath
     *            存放模板文件路径
     * @param templateFileName
     *            模板文件
     * @param toPath
     *            生成静态文件后存放的路径
     * @param toFileName
     *            生成静态文件后的文件名称
     * @param param
     *            对象参数[实体对象,系统路径等]
     */
    public static void templateToFile(String templateFileName, String toPath,
            String toFileName, Map<String, Object> param) {
        // 测试生成时间
        Long startTime = System.currentTimeMillis();
 
        // 读取模板文件
        Template template = gt.getTemplate(templateFileName);
        logger.info("模板文件存放路径:" + (PATH + TEMPLATEFILEPATH + templateFileName));
 
        // 模板数据绑定
        template.binding(param);
 
        logger.info("静态文件存放路径:" + (toPath + toFileName));
 
        try {
            template.renderTo(new OutputStreamWriter(new FileOutputStream(new File(toPath + toFileName)),DEFAULT_CODE));
        } catch (BeetlException e) {
            logger.error("输出静态文件出错...");
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            logger.error("输出静态文件出错...");
            e.printStackTrace();
        }catch (Exception ex){
 
        }
        logger.info("耗时:" + (System.currentTimeMillis() - startTime) + "‘ms");
    }

模板文件代码略,超级简单。因为用到【template.binding(param)】,把Map传入到页面,所以页面就可以如EL表达式取数据【${company.name}】

时间: 2024-10-07 17:42:59

模板引擎-beetl的相关文章

《开源框架那些事儿26》:“最好的模板引擎”Beetl剖析及与Tiny模板引擎对比

查找最好的模板引擎,发现这个搜索词出来的是beetl,于是就仔细学习了Beetl,试图找寻“最好的”三个字表现在哪里?于是搭建环境,阅读代码,与鄙人所做的TinyTemplate进行了粗略的对比,在征得beetl作者@闲.大赋 的同意后,编写了此对比文章.由于时间关系,对Beetl的认知深度还有不足,分析不当之处在所难免,还请广大同学纠正,定当有错误和不当必改. 点滴悟透设计思想,加入框架设计兴趣小组:http://bbs.tinygroup.org/group-113-1.html Beetl

最好的模板引擎Beet的6大创新点

2011年发布Beetl 0.5的时候,新闻是在Iteye上发布的,老资格程序员可能预料Iteye上会发生什么了,我收到的最多的不是鼓励和喝彩,而是吐槽,"又是一个轮子"是里面最大的声音.尽管4年前的版本还只是个雏形,但实际上已经开始有了与众不同创新点.我将在本文介绍一下Beetl的创新点和创新思路,希望有志从事开源开发的人能借鉴 首先,Beetl是一个脚本风格的模板,这顺应了新时代程序员的审美. freemarker 当初为什么能从模板引擎中脱颖而出,其实与当时XML流行无不关系.程

gboot 配置 beetl模板引擎

1.配置 maven 依赖 <!-- beetl模板引擎 --><dependency> <groupId>com.ibeetl</groupId> <artifactId>beetl</artifactId> <version>2.8.5</version></dependency>2.配置 BeetlConfig package com.sample.common.config; import

TinyTemplate模板引擎火热出炉,正式开源了

涉水模板引擎领域,纯属不小心.在此对以下人员表示强烈感谢与致敬:@sub jetbrick作者@sept@webit webit作者@罗格林 rythm作者@闲.大赋 beetl作者以及许许多多虽然没有列出来,但是在我写tinytemplate时帮助过我的人. 序言 本来是没有自己写一个模板引擎的计划的,因为按我的理解,一直认为这种“语言”级的引擎,难度是非常大的.总感觉自己的水平不够,因此不敢有这个念头.直到大量使用Velocty的时候,碰到velocty诸多不尽如人意的地方,但是又无能为力,

SpringBoot 配置 Thymeleaf模板引擎

Thymeleaf模板引擎 什么是模板引擎 模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档. 学习视频: http://www.itlaoqi.com/chapter/1688.html 源码地址: QQ群 814077650 , 群共享中自助下载 老齐的官网: itlaoqi.com (更多干货就在其中) Thymeleaf的特点 Thymeleaf优点 主流唯一的前后端通用

模板引擎Thymeleaf

1.Thymeleaf简介 Thymeleaf 是一个跟 Velocity.FreeMarker 类似的模板引擎,它可以完全替代 JSP .相较与其他的模板引擎,它有如下三个极吸引人的特点 Thymeleaf 在有网络和无网络的环境下皆可运行,即它可以让美工在浏览器查看页面的静态效果,也可以让程序员在服务器查看带数据的动态页面效果.这是由于它支持 html 原型,然后在 html 标签里增加额外的属性来达到模板 + 数据的展示方式.浏览器解释 html 时会忽略未定义的标签属性,所以 thyme

artTemplate模板引擎学习实战

在我的一篇关于智能搜索框异步加载数据的文章中,有博友给我留言,认为我手写字符串拼接效率过低,容易出错.在经过一段时间的摸索和学习之后,发现现在拼接字符串的方法都不在是自己去书写了,而是使用Javascript引擎.而javascript引擎的实质就是帮我们把带有JavaScript代码的伪THTML语句编译为HTML. 如果有不了解的朋友,可以前往这两篇文章: 淘宝购物车页面 PC端和移动端实战 淘宝购物车页面 智能搜索框Ajax异步加载数据 源码地址: GitHub:Uncle-Keith 回

使用模块化思维和模板引擎搭建前端架构(require+underscore)

require.js 介绍: 是一个非常小巧的JavaScript模块载入框架,是AMD规范最好的实现者之一.最新版本的RequireJS压缩后只有14K,堪称非常轻量. 官网:http://www.requirejs.cn/    (PS:如果没接触过,刚开始看都是一头蒙蔽的,建议看下菜鸟教程) 新手教程:http://www.runoob.com/w3cnote/requirejs-tutorial-1.html 优点:可完成团队协作.模块复用.单元测试等等一系列复杂的需求 undersco

《开源框架那点事儿25》:对框架模板引擎实现方式的改造实录

点滴悟透设计思想,Tiny模板引擎优化实录! 增加框架设计兴趣小组:http://bbs.tinygroup.org/group-113-1.html Tiny模板引擎的实现方式原来是採用的编译方式,近期发生了一些问题.因此我认为有必要把编译方式调整为解释方式,为此就開始了此次实现活动. 编译方式存在的问题 当时採用编译方式.主要是考虑到编译方式在执行时不必再去遍历语法树.因此就採用了编译方式. 可是在实际应用其中,出现了例如以下问题: 文件路径冲突的问题 因为採用的是编译方式,这个时候就存在在