java模板beetl引擎_模板引擎-beetl

本文介绍了在Java项目中使用Beetl模板引擎来生成静态文件的过程,包括设置模板路径、创建目录、Maven依赖、Controller和服务层的实现,以及模板数据的绑定和渲染。通过这种方式,可以优化微门户页面,减轻服务器压力。
摘要由CSDN通过智能技术生成

前段时间项目需要用到模板技术,本想使用FreeMarker发现有些过时的样子,就搜到了个Beetl,简单一用…

项目背景:

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

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

模板文件为【 *.html 】

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

文件存放位置如图所示…

431c9f7319ae0a0860e6dfbc055319a8.png

Maven引用

org.beetl

beetl-core

${org.beetl-core.version}

Controller代码如下

String srcTemplateFileName = "companyTemplate.html";

String srcToFileName = "index.html";

Map 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 getStaticInfo(Long publicAccountId, String templateFileName, String toFileName) {

Map map = new HashMap();

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 map) {

Company company = super.find(companyId);

Map param = new HashMap();

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 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}】

431c9f7319ae0a0860e6dfbc055319a8.png

Beetl相对于其他java模板引擎,具有功能齐全,语法直观,性能超高,开发和维护模板有很好的体验。是新一代的模板引擎。总得来说,它的特性如下: 1、功能完备:同主流的java模板引擎相比,Beetl具有绝大多数功能。适用于各种应用场景,从对响应速度有很高要求的大网站到功能繁多的CMS管理系统都适合。Beetl本身还具有很多独特功能来完成模板编写和维护,这是其他模板引擎所不具有的。 2、非常简单:类似Javascript语法和习俗,只要半小时就能通过半学半猜完全掌握用法。拒绝其他模板引擎那种非人性化的语法和习俗。 3、超高的性能:Beetl 远超过主流java模板引擎性能,如5-6倍于freemarker,2倍于传统jsp技术。而且消耗较低的CPU 4、易于整合:Beetl能很容易的与各种web框架整合,如Spring MVC,JFinal,Struts,Nutz,Jodd,Servlet等。 5、支持模板单独开发和测试,即在MVC架构中,即使没有M和C部分,也能开发和测试模板。 6、扩展和个性化:Beetl支持自定义方法,格式化函数,虚拟属性,标签,和HTML标签。同时Beetl也支持自定义占位符和控制语句起始符号也支持使用者完全可以打造适合自己的工具包。 关于性能: 通过与主流模板引擎Freemarker,Velocity以及JSP对比,Beetl均远高于前面三个,这是因为宏观上,通过了优化的渲染引擎,IO的二进制输出,字节码属性访问增强,微观上,通过一维数组保存上下文,合并静态文本,通过重复使用字节数组来防止java频繁的创建和销毁数组,还使用模板缓存,运行时优化等方法。 独特功能: Beetl有些功能是发展了10多年的模板引擎所不具备的,这些功能非常利于模板的开发和维护,如下: 1、自定义占位符和控制语句起始符号,这有利于减小模板语法对模板的倾入性,比如在html模板中,如果定义控制语句符号是,那么,大部分模板文件都能同过浏览器打开。有的使用者仅仅采用了单个符号@ 以及回车换号作为控制语句起始符号,这又能提高开发效率。 2、可单独测试的模板。无需真正的控制层和模型层,Beetl模板就可以单独开发和测试。 3、同时支持较为松散的MVC和严格的MVC,如果在模板语言里嵌入计算表达式,复杂条件表达式,以及函数调用有干涉业务逻辑嫌疑,你可以禁止使用这些语法。 4、强大的安全输出,通过安全输出符号!,能在模板变量,变量属性引用,for循环,占位符输出,try-catch中等各个地方提供安全输出,保证渲染正常。 5、模板变量:运行将模板的某一部分输出像js那样赋值个一个变量,稍后再处理。利用模板变量能完成非常复杂的页面布局(简单的布局可使用layout标签函数)。 6、类型推测,能在运行的时候推测模板变量类型,从而优化性能,也可以通过注解的方法显示的说明模板变量属性(这是非必须的,但有助于IDE自动提示功能)。 7、可插拔的设计,错误信息提示,模板引擎缓存机制,模板资源管理,本地调用的安全管理器,严格MVC限制,模板引擎本身都有默认的实现,但又完全可以自定义以适合特定需求。 8、增强的语法,如#ajax局部渲染,for-elsefor, select-case,安全输出符号! 等,这些语法特别适合模板开发。 9、性能超高,具有最快的模板解释引擎,同时,又有较低的CPU消耗。适合各类模板引用,如CMS系统,超高访问量的门户系统。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值