設計自己的MVC框架

2021-09-08 23:29:29 字數 4041 閱讀 4796

事實是最近讀《j2ee設計模式》講述表達層模式的那幾章,書中有乙個前端控制器+command模式的workflow例子,就琢磨著可以很簡單地擴充套件成乙個mvc框架。花了乙個下午改寫了下,對書中所述的理解更為深入。我想這也許對於學習和理解設計模式,以及初次接觸struts等mvc框架的人可能有點幫助。因為整個模型類似於struts,我把它取名叫strutslet^_^。學習性質,切勿認真。

(一)完整的類圖如下:

1。前端控制器(frontcontroller):前端控制器提供了乙個統一的位置來封裝公共請求處理,它的任務相當簡單,執行公共的任務,然後把請求轉交給相應的控制器。在strutslet中,前端控制器主要作用也在於此,它初始化並解析配置檔案,接受每個請求,並簡單地把請求委託給排程器(dispatcher),由排程器執行相應的動作(action)。排程器把action返回的url返回給frontcontroller,frontcontroller負責**。

3。dispatcher:排程器,負責流程的**,負責呼叫action去執行業務邏輯。由排程器選擇頁面和action,它去除了應用行為和前端控制器間的耦合。排程器服務於前端控制器,它把model的更新委託給action,又提供頁面選擇給frontcontroller

4。actionforward:封裝了轉向操作所需要資訊的乙個模型,包括name和轉向url

5。actionmodel:解析配置檔案後,將每乙個action封裝成乙個actionmodel物件,所有actionmodel構成乙個map,並儲存在servletcontext中,供整個框架使用。

(二)源**簡單分析

1。action介面,只有乙個execute方法,任何乙個action都只要實現此介面,並實現相應的業務邏輯,最後返回乙個actionforward,提供給dispacher呼叫。

publicinte***ceaction 

比如,我們要實現乙個登陸系統(demo的例子),loginaction驗證使用者名稱和密碼,如果正確,返回success頁面,如果登陸失敗,返回fail頁面:

publicclassloginactionimplementsactionelse

returnactionforward.fail;    //否則,返回fail }

2.還是先來看下兩個模型:actionforward和actionmodel,沒什麼東西,屬性以及相應的getter,setter方法:

/*** 類說明:轉向模型

* @author dennis *

* */

publicclassactionforward 

publicactionforward(string

name,string

viewurl) 

//...name和viewurl的getter和setter方法

}   

我們看到actionforward預先封裝了success和fail物件。

publicclassactionmodel 

publicactionmodel(string

path,string

classname,

map<string

, actionforward> forwards) 

//...相應的getter和setter方法      }

3。知道了兩個模型是什麼樣,也應該可以猜到我們的配置檔案大概是什麼樣的了,與struts的配置檔案格式類似:

<?xml  version="1.0" encoding="utf-8"?>

"/login"

class="com.strutslet.demo.loginaction">

"success" url="hello.jsp"/>

"fail" url="fail.jsp"/>

path是在應用中將被呼叫的路徑,class指定了呼叫的哪個action,forward元素指定了轉向,比如我們這裡如果是success就轉向hello.jsp,失敗的話轉向fail.jsp,這裡配置了demo用到的loginaction。

4。dispacher介面,主要是getnextpage方法,此方法負責獲得下乙個頁面將導向**,提供給前端控制器**。

publicinte***cedispatcher 

5。5。原先書中實現了乙個workflow的dispatcher,按照順序呼叫action,實現工作流呼叫。而我們所需要的是根據請求的path呼叫相應的action,執行action的execute方法返回乙個actionforward,然後得到actionforward的viewurl,將此viewurl提供給前端控制器**,看看它的getnextpage方法:

returnactionforward.getviewurl();      //返回actionforward的viewurl }

6。前端控制器(frontcontroller),它的任務我們已經很清楚,初始化配置檔案;儲存所有action到servletcontext供整個框架使用;得到發起請求的path,提供給dispachter查詢相應的action;呼叫dispatcher,執行getnextpage方法得到下乙個頁面的url並**:

publicvoidinit()throwsservletexceptioncatch(exception

e) 

//例項化dispacher

trycatch(exception

e) 

.....

doget()和dopost方法我們都讓它呼叫process方法:

7。最後,web.xml的配置就非常簡單了,配置前端控制器,提供啟動引數(配置檔案所在位置,為空就查詢/web-inf/下面的strutslet-config.xml檔案),我們把所有以action結尾的請求都交給frontcontroller處理:

strutsletcontroller

class>com.strutslet.core.frontcontrollerclass> 0

strutsletcontroller

*.action

最後,讓我們看看整個框架圖:

設計自己的MVC框架

publicinte ceaction 比如,我們要實現乙個登陸系統 demo的例子 loginaction驗證使用者名稱和密碼,如果正確,返回success頁面,如果登陸失敗,返回fail頁面 publicclassloginactionimplementsactionelse returnact...

打造自己的MVC框架

打造自己mvc框架 1 mvc概念 model view controller 控制器 2 psr規範 psr1 基礎程式設計規範 psr2 編碼風格規範 psr3 日誌介面規範 psr4 自動載入規範 3 命名規範 檔名和類名相同 大駝峰原則 indexcontroller 命名空間名和資料夾名相...

自己構思的MVC框架

我除了是乙個很懶惰的人,更是乙個很吝嗇的人,更加是乙個不願被約束的人。在挑選開源表示層框架時,因為懶惰,我要求 1.好學,我不希望花乙個月的時間去學習如何配置 2.好用,要真的能夠提高開發的效率,而不是把自己繞進去 因為吝嗇,我要求 3.不要過於龐大,過多的依賴其他專案,占用過多的記憶體 4.執行效...