## 2.2 自定義方法
[TOC]
### 2.2.1 實現Function
```java
public class Print implements Function{
public String call(Object[] paras, Context ctx){
Object o = paras[0];
if (o != null){
try{
ctx.byteWriter.write(o.toString());
}catch (IOException e){
throw new RuntimeException(e);
}
}
return "";
}
}
```
call方法有倆個參數,第一個是數組,這是由模板傳入的,對應著模板的參數,第二個是Context,包含了模板的上下文,主要提供了如下屬性
- byteWriter 輸出流
- template 模板本身
- gt GroupTemplate
- globalVar 該模板對應的全局變量
- byteOutputMode 模板的輸出模式,是字節還是字符
- safeOutput 模板當前是否處于安全輸出模式
- 其他屬性建議不熟悉的開發人員不要亂動
> 1. call方法要求返回一個Object,如果無返回,返回null即可
> 2. 為了便于類型判斷,call方法最好返回一個具體的類,如date函數返回的就是java.util.Date
> 3. call方法里的任何異常應該拋出成Runtime異常
### 2.2.2 使用普通的java類
盡管實現Function對于模板引擎來說,是效率最高的方式,但考慮到很多系統只有util類,這些類里的方法仍然可以注冊為模板函數。其規則很簡單,就是該類的所有public方法。如果還需要Context 變量,則需要在方法最后一個參數加上Context即可,如
```java
public class util{
public String print(Object a, Context ctx){
//balabala...
}
}
```
注意
> 1. 從beetl效率角度來講,采用普通類效率不如實現Function調用
> 2. 采用的普通java類盡量少同名方法。這樣效率更低。beetl調用到第一個適合的同名方法。而不像java那樣找到最匹配的
> 3. 方法名支持可變數組作為參數
> 4. 方法名最后一個參數如果是Context,則beetl會傳入這個參數。
### 2.2.3 使用模板文件作為方法
可以不用寫java代碼,模板文件也能作為一個方法。默認情況下,需要將模板文件放到Root的functions目錄下,且擴展名為.html(可以配置文件屬性來修改這倆個默認值) 方法參數分別是para0,para1…..
如下root/functions/page.fn
```javascript
<%
//para0,para1 由函數調用傳入
var current = para0,total = para1,style=para2!'simple'
%>
當前頁面 ${current},總共${total}
```
則在模板中
```javascript
<%
page(current,total);
%>
```
允許使用return 表達式返回一個變量給調用者,如模板文件functions\now.html
```javascript
<%
return date();
%>
```
在任何模板里都可以調用:
```javascript
hello time is ${now(),'yyyy-MM-dd'}
```
也可以在functions建立子目錄,這樣function則具有namespace,其值就是文件夾名
- 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 性能測試對比