本节介绍MVC 中的视图技术之模板引擎Beetl ,用于渲染模板。
一、Beetl模板引擎
Beetl是2010 年开发井维护至今的一个模板引擎,具有如下特点:
- 功能完备。作为主流模板引擎,适用于各种应用场景,比如对响应速度有很高要求的大型网站,功能繁多的CMS 管理系统,以及代码生成器等。Beetl 本身还具有很多独特的功能来完成模板的编写和维护。
- 语法和使用习俗简单: 类似JavaScript 语法和习俗, 但又专门为模板渲染定制,也支持HTML 标签, 使得开发CMS 系统变得比较容易。
- 超高的性能。Beetl远超过主流Java 模板引擎性能, 引擎性能5~6 倍于Freemarker , 2倍于JSP 。
- 易于整合。Beetl 能很容易地与各种Web 框架整合,如Spring MVC 、ACT ,国内的Nutz 和JFinal ,还有Struts 、Jodd 、Servlet 等。
- 支持模板单独开发和测试。在MVC 架构中,即使没有M 和C 部分,也能开发和测试模板。
- 扩展和个性化。Beet! 支持自定义方法、格式化函数、虚拟属性、标签和HTML 标签。同时也支持自定义占位符和控制语句起始符号。
1、安装Beetl
<dependency>
<groupid>com.ibeetl</groupid>
<artifactid>beetl-framework-starter</artifactid>
<version>1.1.15.RELEASE</version>
</dependency>
在Spring Boot 中, beetl-framework-starter 将自动配置以btl 结尾的所有视图,将自动使用Beetl渲染相应的resources/templates 目录下的视图文件。
2、设置定界符号和占位符
Beetl 支持自定义定界符号和占位符号, 默认使用<%%>作为定界符号,使用${}作为占位符号,也可以配置自己喜爱的占位符号, 常用的有:
@,和回车作为定界符号:
<??> , 类似PHP的符号:
<!一一# >,使用HTML 注释符号作为定界符号,加了一个#符号以区别正常的HTML注释。
可以通过配置文件来设置定界符号, 需要在resources 目录下创建一个beetl.properties 文件,
DELIMITER PLACEHOLDER START=${
DELIMITER PLACEHOLDER END=}
DELIMITER STATEMENT START =@
DELIMITER STATEMENT END=
本节后面都将采用“@”和“回车换行”作为定界符号,占位符使用传统的“${”和“}
3、配置Beetl
B eet I 为了提高渲染性能,会在渲染模板后, 缓存模板的语法解析结果, Beetl 每次渲染前都会检测模板文件是否更新, 如果已经更新,则重新解析模板。由于检测模板是否更新会有一次1/0 操作,因此线上系统可以取消检测,需要在appl ication . propert i es 中添加以下配置:
beetl-beetlsql.dev = false
Beetl 默认配置时自动检测模板是否变化,但有的IDE 并不会将resource/templates 目录
下的文件变化同步到Maven 工程的target 目录下,所以即使文件发生变化, Beetl 也检
测不到。如果出现这种情况,一个通用的办法是将resource 目录设定为src 目录,这样
resource 目录下的任何文件改变都会同步到target 目录下.
在Spring B oot 应用中,所有以btl 结尾的模板都会交给Beetl 模板引擎渲染,如果你的模板更喜欢以html 结尾,需要在application.properies 中添加以下配置项:
beetl.suffix = html
二、使用变量
1、全局变量
全局变量即通过Model 或者ModelAndView 传入的变量,可以在模板或者子模板中使用。在Controller 中通过Mo del 、ModelAndView ,或者直接使用request 设置的变量,都可以在模板中使用,比如:
ModelAndView view = new ModelAndView ("/index.btl");
view.addObject ("user", user) ;
return view;
然后可以在Beetl 模板中使用user 变量。${user . name}
对于Spring Boot 应用来说, Beet! 己经提供了以下默认的全局变量:
变量 | 说明 |
---|---|
request 中所有的attribute | 在模板中可以直接通过name 来引用,比如在Controller 层request.setAttribute (” user ”, user),则在模板中可以直接用$ {user.name}。这里也包括Model 或者ModelAndView 中的所有变量,都会成为模板的全局变量。 |
Session 提供了Session 会话 | 模板通过session [” name”]或者session . name 引用Session中的变量。注意, Session 并非Serviet 中的标准Session 对象。参考Servi et 来获取HTTPSession 。 |
request | 标准的HTTPServletRequest ,可以在模板中引用request 属性( getter ),如 $ { request.requestURL} |
parameter | 读取用户提交的参数,如${ parameter.userld} o |
ctxPath | Web 应用中的ContextPath 。在Spring Boot 中, 应用默认是“/” 。通过application.properties 的属性server.context-path 可以配置。 |
servlet | WebVariable 的实例,包含了HTTPSession 、HTTPServletRequest 、HTTPServletResponse 三个属性,模板中可以通过request 、response 、session 来引用,如$ { servlet.request.requestURL} |
所有groupTemplate 的共享变量 |
2、局部变量
在模板中定义的变量,只能在当前模板中使用,无法在子模板中使用:
@var salary = user.salary