作為jfinal中的五大元件之一,render的主要職責是將請求處理結果以相應的方式返回給客戶端。即render抽象隔離了紛雜的前端展示邏輯,對外提供了統一的呼叫介面。對於該核心元件,jfinal依然是給予了足夠的地位, 提供了頂級package ——
com.jfinal.render
,與render相關的實現基本都是位於本package中。
對於render
的定義,jfinal依然採取的是意料之外,情理之中的設計——將其設計為了抽象類, 而非一般我們認為的介面。
這裡只保留關鍵性的字段和方法
public
abstract
class
render
return
this;
}/**
* render to client
*/// 本抽象類唯一的抽象方法
// 也是核心方法, 負責將相應的內容渲染到客戶端
public
abstract
void
render();
}
以上雖然省略了一些**,但依然可以看出render
的設計還是相當簡單和清晰的,唯一的render
方法將全權交由子類來完成自身的自定義邏輯,render
不進行任何的假設性邏輯。
對於render
,jfinal提供的預設實現已經相當豐富,基本可以滿足日常的開發需求。但開發者依然可以按照自己的需求來進行自定義擴充套件(作為 c 層基類的controller就提供了乙個render(render render)
方法來將渲染邏輯全權交給框架使用者);亦或者在其他專案中借鑑其思想,來簡化自身的設計。其實本人會閱讀jfinal原始碼,主要原因是希望在spring之外給自己另外一種選擇。
以上圖中的繼承鏈,類名基本上已經能夠清晰地說明其所關注的渲染邏輯。所以接下來我們將不再作列表式陳訴,而只是挑選出一些有代表性的進行**:
com.jfinal.ext.render.captcharender
。 在3.4版本中已經被jfinal 進行了@deprecated標註 ; jfinal官方目前更加推薦直接使用controller.rendercaptcha()
。
jfinal目前支援的模板引擎從圖中就可見一斑——freemarker,jsp,velocity,自身。
接下來讓我們看看在jfinal處理一次請求的生命週期中render是如何完成自身職責的。
對於jfinal框架的使用者而言,在其對action的實現中,不出意外的話基本都是以render***
結尾;jfinal官方也是如此推薦——即使最終選擇不進行任何渲染操作,也請主動呼叫一次rendernull
方法(很明顯的null模式,內部實現為空)。
而對於自定義action的呼叫,jfinal是放在了actionhandler
中的handle
方法中。
// actionhandler.handle
// 這裡我們只貼出本次相關的**
// 設定render的上下文, 並進行render操作
// 執行許可權被全權交給了render.render。jfinal只會等待 render.render 的完全執行完畢,由render將控制權主動歸還。
render.setcontext(request, response, action.getviewpath()).render();
// 以下,除非發生異常, 否則本次請求處理邏輯基本算是到此結束了.
}
由controller類提供的方法controller.getrender()
可知,render是屬於controller乙個級別的; 而controller按照之前的討論,對於每次請求都是重新生成乙個相應的全新例項;所以是不存在所謂的執行緒資源爭搶的問題。
級聯關係如下:rendermanager >> rende***ctory (抽象工廠模式) >> render。
對於rende***ctory ,jfinal在constants配置時提供了相應的自定義配置方法 ——setrende***ctory
, 允許框架使用者提供完全自定義的render構造邏輯。
說句題外話,本人比較喜歡jfinal在實現單例模式時的命名,例如這裡的rendermanager。
// 單例模式(餓漢模式)
private
static
final rendermanager me = new rendermanager();
private
rendermanager() {}
public
static rendermanager me()
rende***ctor 原始碼有毒 Jfinal原始碼解析(三)
原始碼有毒 jfinal原始碼解析 一 原始碼有毒 jfinal原始碼解析 二 jfinalconfig.configinterceptor interceptors override public void configinterceptor interceptors me 新增全域性 最終會把這...
JFinal 原始碼知識點
1 jfinal中自帶json工具類,沒必要匯入其他的轉化包。使用 setattr status success renderjson 會將所有setattr 的,轉化成json格式。2 kit包中定義了一些工具類的擴充套件 例如 1 轉化json的工具 jsonkit.tojson str 2 加...
cita 原始碼研究
適用環境 vim youcompleteme使用 github 源,不能使用 ustc 源 git clone depth 1 recusive所有 cargo.toml 中的庫版本號全部改為精確的細版本號,不能是粗略的大版本號 所有 cargo.toml 中的非官方託管庫,均改為 形式 第 2 3...