## 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类型。但好处是可以动态引用属性,比如;
```java
var attrName="age";
var age=user[attrName]
```
- 需要知道Java集合,数组长度,统一用虚拟属性`~size`来表示
```java
var list=[1,2,3];
var size = list.~size
```
* 虚拟属性:Beetl 还可以定义额外的对象属性,而无需更改java对象,这叫着虚拟属性,如,对于所有集合,数组,都有共同的虚拟属性size.虚拟属性是“.~”+虚拟属性名
```javascript
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 开始支持对象赋值,如:
```javascript
<%
var user = ....
user.name="joelli";
user.friends[0] = getNewUser();
user.map["name"] = "joelli";
%>
```
赋值很少用于模板引擎,在规则引擎,脚本引擎使用场景倒是可以修改对象属性。Beetl支持语法定制,可以根据使用场景禁止对象赋值。
- Beetl 3 中文文档
- 第一部分 基础用法
- 1.1 安装
- 1.2 快速开始
- 1.3 模板基础配置
- 1.4 模板加载器
- 1.5 定界符与占位符
- 1.6 注释
- 1.7 变量定义
- 1.8 属性
- 1.9 数学表达式
- 1.10 循环语句
- 1.11 条件语句
- 1.12 异常捕获
- 1.13 虚拟属性
- 1.14 函数调用
- 1.15 安全输出(重要)
- 1.16 输出格式化
- 1.17 标签
- 1.18 调用Java方法与属性
- 1.19 严格MVC控制
- 1.20 指令
- 1.21 错误处理
- 1.22 Beetl小工具
- 1.23 Escape
- 第二部分 高级用法
- 2.1 配置GroupTemplate
- 2.2 自定义方法
- 2.3 自定义格式化函数
- 2.4 自定义标签
- 2.5 自定义虚拟属性
- 2.6 使用额外的资源加载器
- 2.7 自定义资源加载器
- 2.8 使用CompositeResourceLoader
- 2.9 自定义错误处理器
- 2.10 自定义安全管理器
- 2.11 注册全局共享变量
- 2.12 自定义布局
- 2.13 性能优化
- 2.14 定制输出
- 2.15 定制模板引擎
- 2.16 直接运行Beetl脚本
- 2.17 模板校验
- 第三部分 Web 集成
- 3.1 Web提供的全局变量
- 3.2 集成技术开发指南
- 3.3 Servlet集成
- 3.4 SpringMVC集成
- 3.5 Spring Boot集成
- 3.6 Jodd集成
- 3.7 JFinal4 集成方案
- 3.8 Nutz集成
- 3.9 Struts2集成
- 3.10 整合ajax的局部渲染技术
- 3.11 在页面输出错误提示信息
- 附录
- 4.1 内置方法
- 4.2 Spring相关函数
- 4.3 Spring security
- 4.4 shiro
- 4.5 内置格式化方法
- 4.6 内置标签函数
- 4.7 内置html标签
- 4.8 性能优化
- 4.9 Eclipse 插件
- 4.10 性能测试对比