jfinal原始碼研究之核心元件Render

2021-08-21 11:18:32 字數 2693 閱讀 5622

作為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...