WEB开发技术框架利器之一 -- Beetl使用笔记

A、介绍

Beetl,Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好。

 

B、优势

    对于web应用来说,必须通过controller才能渲染模板,beetl也可以写完模板后,在未完成controller情况下,直接渲染模板此方法既可以作为通常的全栈式开发人员使用,也可以用于前端人员单独开发模板用。

         Beetl容易与其他技术框架完成集成配置,默认提供了WebRender用于帮助web集成开发,所有内置的集成均基于此方法。如果你认为Beetl内置的各个web框架集成功能不够,你可以继承此类,或者参考此类源码重新写。

        

相对于其他java模板引擎,具有功能齐全,语法直观,性能超高,以及编写的模板容易维护等特点。使得开发和维护模板有很好的体验。是新一代的模板引擎。总得来说,它的特性如下:

功能完备:同主流的java模板引擎相比,Beetl具有绝大多数功能。Beetl本身还具有很多独特功能来完成模板编写和维护,这是其他模板引擎所不具有的。

 

非常简单:类似Javascript语法和习俗,只要半小时就能通过半学半猜完全掌握用法。拒绝其他模板引擎那种非人性化的语法和习俗。同时也能支持html 标签,使得开发CMS系统比较容易

 

超高的性能:Beetl 远超过主流java模板引擎性能(引擎性能5-6倍与freemaker2倍于JSP),而且消耗较低的CPU

 

易于整合:Beetl能很容易的与各种web框架整合,如SpringMVCJFinal,Struts,NutzJoddServlet等。

 

支持模板单独开发和测试,即在MVC架构中,即使没有MC部分,也能开发和测试模板。

 

扩展和个性化:Beetl支持自定义方法,格式化函数,虚拟属性,标签,和HTML标签. 同时Beetl也支持自定义占位符和控制语句起始符号也支持使用者完全可以打造适合自己的工具包。

框架自身特点:

1. 自定义占位符和控制语句起始符号,这有利于减小模板语法对模板的倾入性,比如在html模板中,如果定义控制语句符号是<!--: -->,那么,大部分模板文件都能同过浏览器打开。有的使用者仅仅采用了单个符号@ 以及回车换号作为控制语句起始符号,这又能提高开发效率

 

2. 可单独测试的模板。无需真正的控制层和模型层,Beetl的模板就可以单独开发和测试

 

3. 同时支持较为松散的MVC和严格的MVC,如果在模板语言里嵌入计算表达式,复杂条件表达式,以及函数调用有干涉业务逻辑嫌疑,你可以禁止使用这些语法。

 

4. 强大的安全输出,通过安全输出符号!,能在模板变量,变量属性引用,for循环,占位符输出,try-catch中等各个地方提供安全输出,保证渲染正常

 

5. 模板变量:运行将模板的某一部分输出像js那样赋值个一个变量,稍后再处理。利用模板变量能完成非常复杂的页面布局(简单的布局可使用layout标签函数)

 

6. 类型推测,能在运行的时候推测模板变量类型,从而优化性能,也可以通过注解的方法显示的说明模板变量属性(这是非必须的,但有助于IDE自动提示功能)

 

7. 可插拔的设计,错误信息提示,模板引擎缓存机制,模板资源管理,本地调用的安全管理器,严格MVC限制,模板引擎本身都有默认的实现,但又完全可以自定义以适合特定需求

 

8. 增强的语法,如for-elsefor,select-case,安全输出符号! 等,这些语法特别适合模板开发

 

9. 性能超高,具有最快的模板解释引擎,同时,又有较低的CPU消耗。5-6倍于国内使用的Freemaker。适合各类模板应用,如代码生成工具,CMS系统,普通网站,超高访问量的门户系统,和富客户端JS框架整合的后台管理应用

 

C、处理流程

    1、首先用户发送请求(HTMLFilter),前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;

2、HTMLFilter(SimpleCrossFilter),直接调用SimpleCrossFilter中的doFilter方法处理请求模板(主要是加载定义的伪数据模型,即定义的/WebROOT/values/common.html.var以及对应的var文件);

3、将加载定义的伪数据模型存放在session中;

4、将session中的数据渲染到指定的模板(即通过webrender渲染)

 

D、开发配置过程

1、在web.xml中配置请求拦截处理器(监听器)

       

          <filter>
             <description></description>
             <display-name>HTMLFilter</display-name>
             <filter-name>HTMLFilter</filter-name>
             <filter-class>org.beetl.sample.HTMLFilter</filter-class>
         </filter>
         <filter-mapping>
             <filter-name>HTMLFilter</filter-name>
             <url-pattern>*.html</url-pattern>
         </filter-mapping>


2、实现配置的过滤方法(监听器)

package org.beetl.sample;
 
import java.io.IOException;
 
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
 
import org.beetl.core.GroupTemplate;
import org.beetl.ext.servlet.ServletGroupTemplate;
import org.beetl.ext.web.SimpleCrossFilter;
 
/**
 * Servlet Filter implementation classHTMLFilter
 */
publicclass HTMLFilter extends SimpleCrossFilter implements Filter {
 
         @Override
         public void init(FilterConfig arg0)throws ServletException {
                   
                   
         }
         
         public void doFilter(ServletRequestrequest, ServletResponse response, FilterChain chain) throws IOException,
         ServletException
         {
                   response.setContentType("text/html;charset=utf-8");
                   super.doFilter(request,response, chain);
         }
 
         @Override
         protected GroupTemplategetGroupTemplate() {
                   returnServletGroupTemplate.instance().getGroupTemplate();
         }
       
   
 
}


 

3、编制模板html(不是必须为html,也可以是其他后缀)

         新建一个对应的伪模型文件(比如要测试模板WebRoot/views/common/header.html)

 

4、创建伪数据模型

         新建立WebRoot/values/common/header.html.var,values是监听器默认的伪模型的根目录。

        

var userList = {
    id : 2,
    name : "用户一"
    };


可以将一些公共的变量放到WebRoot/values/common.var里。监听器会先执行common.var,然后再执行common/header.html.var


    以上记录描述难免出现错误措辞,望各位勘正,谢谢。


本文出自 “好记性不如烂笔头” 博客,请务必保留此出处http://gytian.blog.51cto.com/1065457/1615842

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。