1.8 属性
About 551 wordsAbout 2 min
2025-01-27
1.8 属性
1.8.1 引用属性
属性引用是模板中的重要一部分,Beetl 支持属性同 JavaScript 的支持方式一样,如下
- Beetl支持通过
.
号来访问对象的的属性,如果 JavaScript 一样。如果 User 对象有个 getName() 方法,那么在模板中,可以通过${xxx.name}
来访问 - 如果模板变量是数组或者List类,这可以通过
[]
来访问,如${userList[0]}
- 如果模板变量是Map类,这可以通过
[]
来访问,如${map["name"]}
,如果 key 值是字符串类型,也可以使用${map.name}
—— 但不建议这么使用,因为会让模板阅读者误以为是一个 Pojo 对象 - Beetl 也支持Generic Get方式,即如果对象有一个
public Object get(String key)
方法,可以通过.
号或者[]
来访问,譬如${activityRecord.name}
或者${activityRecord["name"] }
都将调用 activityRecord 的get(String key)
方法。如果对象既有具体属性,又有Generic get(这种模型设计方式是不值得鼓励),则以具体属性优先级高。 - Beetl也可以通过
[]
来引用属性,如${user["name"]}
相当于${user.name}
。这跟 JavaScript 保持一致。但建议不这么做,因为容易让阅读模板的人误认为这是一个Map类型。但好处是可以动态引用属性,比如;
var attrName="age";
var age=user[attrName]
- 需要知道Java集合,数组长度,统一用虚拟属性
~size
来表示
var list=[1,2,3];
var size = list.~size
- 虚拟属性:Beetl 还可以定义额外的对象属性,而无需更改java对象,这叫着虚拟属性,如,对于所有集合,数组,都有共同的虚拟属性size.虚拟属性是“.~”+虚拟属性名
template.binding("list",service.getUserList());
template.binding("pageMap",service.getPage());
//在模板里
总共 ${list.~size}
<%
for(user in list){
%>
hello,${user.name};
<% } %>
当前页${pageMap['page']},总共${pageMap["total"]}
1.8.2 属性赋值
Beetl2.7.0 开始支持对象赋值,如:
<%
var user = ....
user.name="joelli";
user.friends[0] = getNewUser();
user.map["name"] = "joelli";
%>
赋值很少用于模板引擎,在规则引擎,脚本引擎使用场景倒是可以修改对象属性。Beetl支持语法定制,可以根据使用场景禁止对象赋值。