SimpleFramework框架高級特性之組件開發(fā)
Simple組件是基于Web的,凡是和Web相關(guān)的UI或業(yè)務(wù)邏輯,都可以成為Simple組件。
單一的后臺邏輯是Simple組件不支持的,比如建立一個網(wǎng)絡(luò)連接、訪問數(shù)據(jù)等,但這些業(yè)務(wù)邏輯和前端Web關(guān)聯(lián)起來,比如基于Web的網(wǎng)絡(luò)流量監(jiān)控,就可以成為Simple組件。
Simple組件隱藏了前端Web(HTML、Javascript、CSS等)的復(fù)雜性,同時,又為后端邏輯提供了一致、可操作的業(yè)務(wù)邏輯接口,并且開發(fā)者可以自由的設(shè)計這些接口。
Simple組件是開放的、友好的,任何開發(fā)者都可以很容易按照規(guī)范來開發(fā)自己的組件。
需要實現(xiàn)的四個接口
自定義組件,必須實現(xiàn)以下四個接口(類):
接口IComponentRegistry
定義組件的注冊類實例,并在系統(tǒng)初始化的時候注冊到系統(tǒng)注冊表里,這樣,自定義組件就可以使用了。代碼如下:
- ComponentRegistryFactory.getInstance().regist(new YourComponentRegistry(servletContext));
IComponentRegistry主要函數(shù)的定義及說明:
- String getComponentName();
- 組件的名稱,這個值就是在XML描述中聲明的組件標簽,且必須***
- IComponentRender getComponentRender();
- 獲取組件的渲染器實例,詳細見下
- IComponentResourceProvider getComponentResourceProvider();
- 獲取組件的資源提供者實例,詳細見下
- AbstractComponentBean createComponentBean(PageParameter pageParameter, Element component);
- 創(chuàng)建組件的元信息定義實例。組件的元信息來自XML描述文件,該實例將按XML中的定義來初始化Bean的屬性
接口IComponentResourceProvider
組件的資源提供者,該接口主要定義組件運行所必須依賴的資源環(huán)境,這些資源包括Javascript、CSS、jar或其它已注冊的組件等。
IComponentResourceProvider主要函數(shù)的定義及說明:
- ZipInputStream getRequiredResource();
- 以Zip的方式獲取組件所需要的全部資源。一個典型的目錄結(jié)構(gòu)可能如下:
- ZIP
- |--jsp
- |--css
- |--images
- |--flash
- |--jar
- String getResourceHomePath();
- 獲取組件資源被部署以后的Web訪問路徑。比如,你想獲取組件資源中的圖片路徑,可以通過以下代碼訪問:
- request.getContextPath() + getResourceHomePath() + “/images/t.png”
- String[] getCssPath(PageRequestResponse requestResponse);
- String[] getJavascriptPath(PageRequestResponse requestResponse);
- String[] getJarPath();
- 聲明組件所依賴的特定資源,這些資源將被系統(tǒng)適當(dāng)?shù)募尤腠憫?yīng)到瀏覽器的HTML中
- String[] getPageJavascriptPath(PageRequestResponse requestResponse);
- String[] getPageCssPath(PageRequestResponse requestResponse);
- 和上面是一樣,聲明組件所依賴的特定資源,區(qū)別在于路徑是基于請求資源的,可以引用其它組件的
- Javascript和css資源
- String[] getDependentComponents();
- 獲取組件資源所依賴的其它已注冊組件。比如,一個業(yè)務(wù)選擇窗口需要依賴基本的窗口組件
接口IComponentRender
組件渲染器,該接口負責(zé)向瀏覽器產(chǎn)生HTML(通過IComponentHtmlRender渲染)或者Javascript代碼(通過IComponentJavascriptRender渲染)。
組件渲染器還有一個重要的作用就是調(diào)用Handle中定義的業(yè)務(wù)邏輯。
IComponentHtmlRender主要函數(shù)的定義及說明:
- String getHtml(ComponentParameter compParameter);
- 獲取組件被渲染的HTML
- String getHtmlJavascriptCode(ComponentParameter compParameter);
- 獲取額外的相關(guān)Javascript代碼
IComponentJavascriptRender主要函數(shù)的定義及說明:
- String getJavascriptCode(ComponentParameter compParameter);
- 獲取組件被渲染的Javascript代碼
類AbstractComponentBean
組件的描述(元)信息類。組件的描述信息是由組件開發(fā)者根據(jù)組件的特定要求而設(shè)定的,組件的描述信息來自XML描述文件,開發(fā)者必須按XML中的定義來初始化組件Bean的屬性,參考接口IComponentRegistry中的定義。
定義XML Schema
XML Schema主要是驗證XML描述文件的正確性,借助Eclipse等IDE工具,可以更準確快捷的編寫組件的定義屬性。
組件開發(fā)者需要為組件添加XML Schema支持,并包含在simple .xsd文件里。
定義Handle
Handle是組件業(yè)務(wù)的核心處理類,是留給用戶的接口來聯(lián)系組件行為的通用方式。Handle的設(shè)計由組件開發(fā)者來完成,這樣可以根據(jù)組件的行為設(shè)計出更適合的、更易操作的業(yè)務(wù)邏輯。很多Web框架僅僅提供了Action之類的控制器,對于業(yè)務(wù)開發(fā)者來講,需要做的事情就太多了,Handle明確了該關(guān)心什么,并且如何去做。
舉一個具體的實例。“數(shù)據(jù)分頁”是動態(tài)處理大量數(shù)據(jù)集的一種有效方式,下面是IPagerHandle的定義:
- int getCount(ComponentParameter compParameter);
- void process(ComponentParameter compParameter, int start);
IPagerHandle僅僅定義了兩個業(yè)務(wù)函數(shù)接口:getCount獲取結(jié)果集的總數(shù),process處理游標的當(dāng)前位置為start的結(jié)果集。結(jié)合PagerBean的定義(每頁的顯示數(shù)量等),就可以很容易計算出當(dāng)前顯示頁的數(shù)據(jù)集。
Handle必須繼承自接口IComponentHandle,IComponentHandle定義了一些缺省的組件業(yè)務(wù)行為。