1 支持了类似Freemarker的 General Get,即如果模型有一个public Object get(String key);可以在模板中当着属性引用
如:
${user.name},或者采用[]方式 如${user['name']}
2 通过Config类来创建GroupTemplate。Config 默认会先装载 /org/bee/tl/core/beetl-default.properties, 然后如果classpath 下存在beetl.properties, 再装载或者覆盖其属性。beetl-default.properties 内容如下:
####### 默认配置
DELIMITER_PLACEHOLDER_START= ${
DELIMITER_PLACEHOLDER_END= }
DELIMITER_STATEMENT_START= <%
DELIMITER_STATEMENT_END=% >
NATIVE_CALL = TRUE
COMPILE_CLASS= FALSE
DIRECT_BYTE_OUTPUT = FALSE
TEMPLATE_ROOT=
TEMPLATE_CHARSET = GBK
TEMPLATE_CACHE_CHECK_PERIOD = 2
TEMPLATE_CLASS_FOLDER=
ERROR_HANDLER = org.bee.tl.core.DefaultErrorHandler
MVC_STRICT = FALSE
# 内部使用
DEBUG= FALSE
####### 默认配置结束
####### 性能最佳配置开始
#COMPILE_CLASS=true
#DIRECT_BYTE_OUTPUT = true
######## 性能最佳配置结束
####### 严格 MVC 配置开始
#MVC_STRICT = TRUE
#NATIVE_CALL = FALSE
######## 严格 MVC 配置结束
####### 编译成 class 的其他选项开始,未完全测试,暂时不支持
#COMPILE_CLASS_KEEP_SOURCE=FALSE
#OPTIMIZE_COMPILE_LATTER=FALSE
#OPTIMIZE_COMPILE_WORKER_NUM=2
####### 编译成 class 的其他选项结束
3 对安全输出做了增强,总结如下:
安全输出是任何一个模板引擎必须重视的问题,否则,将极大困扰模板开发者。 Beetl 中,如果要输出的模板变量为 null ,则 beetl 将不做输出,这点不同于 JSP , JSP 输出 null ,也不同于 Feemarker ,如果没有用 !, 它会报错 .
模板中还有俩中情况 会导致模板输出异常
l 有时候模板变量并不存在(譬如子模板里)
l 模板变量为 null ,但输出的是此变量的一个属性,如 ${user.wife.name}
针对前俩种种 情况,可以在变量引用后加上!以提醒 beetl 这是一个安全输出的变量。
如 ${{user.wife.name! }, 即使 user 不存在,或者 user 为 null ,或者 user.wife 为 null ,或者 user.wife.name 为 null beetl 都不将输出
可以在 ! 后增加一个常量(字符串,数字类型),或者另外一个变量,方法,本地调用,作为默认输出,譬如
${user.wife.name!” 单身 ” } ,如果 user 为 null ,或者 user.wife 为 null ,或者 user.wife.name 为 null ,输出 ” 单身 ”
譬如 ${user. birthday!@System.constants.DefaultBir} , 表示如果 user 为 null ,或者 user. birthday 为 null ,输出 System.constants.DefaultBir
l 还有一种情况很少发生,但也有可能,输出模板变量发生的任何异常,如变量内部抛出的一个异常
这需要使用格式 ${!( 变量 )}, 这样,在变量引用发生任何异常情况下,都不作输出,譬如
${!( user.name)}, , beetl 将会调用 user.getName() 方法,如果发生异常, beetl 将不会忽略此异常,继续渲染
如下是预编译后的代码
try{ out.write(user.getName()); }catch(Exception ex){ }
|
值得注意的是,在变量后加上 ! 不仅仅可以应用于占位符输出 ( 但主要是应用于占位符输出 ) ,也可以用于表达式中,如:
<%
var k = user.name!'N/A'+user.age!;
%>
${k}
如果 user 为 null ,则 k 值将为 N/A
4 与Struts2结合,只需要配置一下
<result-types> <result-type name="beetl" class="org.bee.tl.ext.struts2.Struts2BeetlActionResult" default="true"/> </result-types>
5 支持定一个超级变量,var varName = {};如下
<% var a = { var k= 123; %> ${k}. <% }; %> ${a}
这样输出是"123."