來源:北大青鳥飛迅校區(qū)|發(fā)布時間:2013-04-29 08:36:28
我在我們應該怎樣看待框架 中,實現(xiàn)了一個JDBC版的Base類,和一個Hibernate版的Base類,取模仿RoR的ActiveRecord,這樣我們編程的時候,只需要實現(xiàn)一個Base的子類,就可以完成CRUD了。
我的畢設題目是與Rest ,更準確說是與ROA有關的,另外就是在看Spring MVC對于慣例優(yōu)先 (Convention over Configuration,CoC)原則的實現(xiàn)。
Web架構(gòu)的四個元素
無論是Rails還是Spring MVC都是MVC實現(xiàn),因此我的研究也肯定是基于MVC模式的。那么分別來關注M,V和C,另外就是將url和C進行映射的Router(或者說是Struts里的映射文件)。
首先是M,我不想自己編M,那就自動生成,怎么才能自動生成呢,根據(jù)數(shù)據(jù)庫自動生成,而且我生成要是一個ActiveRecord模式的類。所以不是像過去弄個HashMap就能混過去了。之后就是看了ASM3.1和ClassLoader的知識,發(fā)現(xiàn)這是可以實現(xiàn)的。如下:
先整個測試:
@Test publicvoidgerneratorClass(){ try{ Mapfields=newHashMap();fields.put("id",1l);fields.put("name","wanxing");EntityGernerator.generateEntity("Student",fields);EntityGernerator.invoke("add");}catch(Exceptione){ //TODOAuto-generatedcatchblock e.printStackTrace();} }public void gerneratorClass() { try { Map fields=new HashMap();fields.put("id", 1l);fields.put("name", "wanxing");EntityGernerator.generateEntity("Student",fields );EntityGernerator.invoke("add");} catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace();}這塊的實現(xiàn)我想了一下,EntityGernerator的generateEntity方法到底只是創(chuàng)建一個class還是連同實例化對象,而其還有invoke方法,這看上去不太對,嗯,它應該是只生成class就結(jié)束使命了。不過以后再迭代吧。
實現(xiàn)的代碼很簡單,就是利用了ASM3.1,就搞定了。有兩點需要聲明:
1、可以按需要設定生成類的父類
2、只能創(chuàng)建類屬性,不能創(chuàng)建方法,因為方法的實現(xiàn)太復雜,用JVM指令寫會死人,不如轉(zhuǎn)向動態(tài)語言了,而且它繼承了有用的父類,就已經(jīng)完成了自己的使命了。
V和C都可以用通用的,就像用通用DAO一樣。關于V有個特別之處,那就是FrontController,它來調(diào)配各個Controller,依照URI和Controller的Mapping,這符合Roy Fielding博士對于資源的定義:資源是 一種概念上的映射 ——服務器接收到標識符(標識這個映射),將它應用于當前的映射實現(xiàn)(mapping implementation,通常是與特定集合相關的樹的深度遍歷和/或哈希表的組合)上,以發(fā)現(xiàn)當前負責處理該資源的處理器實現(xiàn) ,然后處理器實現(xiàn)基于請求的內(nèi)容選擇適當?shù)膭幼?響應 .在RoR里這叫做Router.另外V中可以根據(jù)HTTP請求返回適當?shù)腜resentation.
REST與CoC
招生熱線: 4008-0731-86 / 0731-82186801
學校地址: 長沙市天心區(qū)團結(jié)路6號
Copyright © 2006 | 湖南大計信息科技有限公司 版權(quán)所有
湘ICP備14017520號-3