自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

淺談如何構(gòu)建Java Web快速開發(fā)框架

開發(fā) 后端
在Ruby on Rails中,建一張表,執(zhí)行一句ruby命令行生成一個(gè)scaffold腳手架程序,然后寫一句代碼,就可以完成了對一個(gè)表或者說是資源的CRUD操作的功能的實(shí)現(xiàn)。這激發(fā)了作者的興趣,用Java,能不能更簡單的完成這件事。

我在我們應(yīng)該怎樣看待框架 中,實(shí)現(xiàn)了一個(gè)JDBC版的Base類,和一個(gè)Hibernate版的Base類,取模仿RoR的ActiveRecord,這樣我們編程的時(shí)候,只需要實(shí)現(xiàn)一個(gè)Base的子類,就可以完成CRUD了。

我的畢設(shè)題目是與Rest ,更準(zhǔn)確說是與ROA有關(guān)的,另外就是在看Spring MVC對于慣例優(yōu)先 (Convention over Configuration,CoC)原則的實(shí)現(xiàn)。

Web架構(gòu)的四個(gè)元素

無論是Rails還是Spring MVC都是MVC實(shí)現(xiàn),因此我的研究也肯定是基于MVC模式的。那么分別來關(guān)注M,V和C,另外就是將url和C進(jìn)行映射的Router(或者說是Struts里的映射文件)。

首先是M,我不想自己編M,那就自動生成,怎么才能自動生成呢,根據(jù)數(shù)據(jù)庫自動生成,而且我生成要是一個(gè)ActiveRecord模式的類。所以不是像過去弄個(gè)HashMap就能混過去了。之后就是看了ASM3.1和ClassLoader的知識,發(fā)現(xiàn)這是可以實(shí)現(xiàn)的。如下:

先整個(gè)測試:

@Test

publicvoidgerneratorClass(){

  1. try{
  2. Mapfields=newHashMap();
  3. fields.put("id",1l);
  4. fields.put("name","wanxing");
  5. EntityGernerator.generateEntity("Student",fields);
  6. EntityGernerator.invoke("add");
  7. }catch(Exceptione){
  8. //TODOAuto-generatedcatchblock
  9. e.printStackTrace();
  10. }
  11. }

這塊的實(shí)現(xiàn)我想了一下,EntityGernerator的generateEntity方法到底只是創(chuàng)建一個(gè)class還是連同實(shí)例化對象,而其還有invoke方法,這看上去不太對,嗯,它應(yīng)該是只生成class就結(jié)束使命了。不過以后再迭代吧。

實(shí)現(xiàn)的代碼很簡單,就是利用了ASM3.1,就搞定了。有兩點(diǎn)需要聲明:

1 可以按需要設(shè)定生成類的父類

2 只能創(chuàng)建類屬性,不能創(chuàng)建方法,因?yàn)榉椒ǖ膶?shí)現(xiàn)太復(fù)雜,用JVM指令寫會死人,不如轉(zhuǎn)向動態(tài)語言了,而且它繼承了有用的父類,就已經(jīng)完成了自己的使命了。

V和C都可以用通用的,就像用通用DAO一樣。關(guān)于V有個(gè)特別之處,那就是FrontController,它來調(diào)配各個(gè)Controller,依照URI和Controller的Mapping,這符合Roy Fielding博士對于資源的定義:資源是 一種概念上的映射 ——服務(wù)器接收到標(biāo)識符(標(biāo)識這個(gè)映射),將它應(yīng)用于當(dāng)前的映射實(shí)現(xiàn)(mapping implementation,通常是與特定集合相關(guān)的樹的深度遍歷和/或哈希表的組合)上,以發(fā)現(xiàn)當(dāng)前負(fù)責(zé)處理該資源的處理器實(shí)現(xiàn) ,然后處理器實(shí)現(xiàn)基于請求的內(nèi)容選擇適當(dāng)?shù)膭幼?響應(yīng) 。在RoR里這叫做Router。另外V中可以根據(jù)HTTP請求返回適當(dāng)?shù)腜resentation。

REST與CoC

按照“慣例優(yōu)先原則”可以做很多事情,比如Blog類對應(yīng)BlogController,對應(yīng)/blog。我們可以將該原則落實(shí)到以上四個(gè)元素上:M,V,C和Router。之后就是按照上述對應(yīng)關(guān)系,形成一種簡單的開發(fā)框架,我們需要做的事情只是:

1 創(chuàng)建數(shù)據(jù)庫Schema,比如建立表Blog

2 配置數(shù)據(jù)庫連接,選擇使用何種數(shù)據(jù)庫

3 啟動Tomcat,在瀏覽器的地址欄中輸入http://localhost:8080/blog/new創(chuàng)建Blog(返回寫blog的表單),http://localhost:8080/blog/12,顯示文章;http://localhost:8080/blog/edit,返回修改表單;http://localhost:8080/blog/list,返回所有blog,加上q?time=2009-05-08或者h(yuǎn)ttp://localhost:8080/2009-05-08/blog/list,按時(shí)間查詢,后者的問題是如果Blog表有兩個(gè)字段是時(shí)間就沒辦法了,但是我們可以約定它只有一個(gè)時(shí)間的時(shí)候默認(rèn)結(jié)果,這就是“慣例優(yōu)先”作用。

輸入這些URL只是證明系統(tǒng)可以正常的工作。然后你可以定制你的HTML頁面,把這些鏈接放到你喜歡的地方,或者作為按鈕對應(yīng)的服務(wù)。所有的服務(wù),都是REST的。一個(gè)RCP客戶端也可以使用,或者是Delphi。

系統(tǒng)在背后默默的根據(jù)數(shù)據(jù)庫Schema創(chuàng)建了Blog類,然后其他都是通用的組件,放入Blog類,比如GenericController.setModel(T model),將Blog類的實(shí)例放入。

靈活性與可擴(kuò)展性

如果只是這樣,那么這個(gè)系統(tǒng)實(shí)際上做不了什么太有價(jià)值的事情(這只是一個(gè)數(shù)據(jù)庫外的薄層),“慣例優(yōu)先”并不是“慣例決定”,我們必須能讓Developer開發(fā)自己個(gè)性化的組件,以完成更強(qiáng)大的功能。

那么就要有如下邏輯:

1 對于M:首先檢查classpath里是否有url中尋找的實(shí)體(比如blog,我們不能說那是資源,資源是映射),這個(gè)實(shí)體就是Developer創(chuàng)建的,如果沒有,則去數(shù)據(jù)庫中查找名為blog的表,創(chuàng)建Blog類(并不在文件系統(tǒng)中生成這個(gè)class)。如果也沒有,則返回not found。

2 對于C:首先根據(jù)Router中的默認(rèn)定義,尋找BlogController,檢查是否存在于classpath中,沒有則用ControllerGenerator生成BlogController(與EntityGenerator相同,不過既然我的Generator可以指定父類,實(shí)際上用一個(gè)ClassGenerator就應(yīng)該OK了)。

3 對于V:現(xiàn)在默認(rèn)路徑下尋找頁面(jsp或者h(yuǎn)tml),如果沒有,則創(chuàng)建Blog頁面流(Stream)返回給客戶端。

4 對于Router:默認(rèn)就是/blog對應(yīng)BlogController。當(dāng)然你可以建立自己的Router文件,來修改映射關(guān)系。

“慣例優(yōu)先”,那這個(gè)慣例是誰的慣例呢? 其實(shí)Router的可Developer定制就表示了系統(tǒng)可以支持在四個(gè)Web架構(gòu)元素中之間建立自己的“慣例”。比如,所有的表名都加上T_Blog,但是生成類名是Blog,而Controller是BlogAction(有人就是喜歡叫它Action),OK,這都沒問題。

技術(shù)細(xì)節(jié)

我們回到M討論。我這個(gè)M既要承擔(dān)ORM的責(zé)任又要承擔(dān)DVM(Domain View Mapping)的職責(zé)。也就是說,我期望我的對象里面可以關(guān)聯(lián)其他對象,同時(shí)我也希望我在UI上顯示正確的中文名,而不是字段名。

先說ORM,關(guān)聯(lián)關(guān)系(繼承就先別指望自動生成了),我可以根據(jù)數(shù)據(jù)庫表的主外鍵關(guān)系生成,然后用ASM動態(tài)加上注解(還是基于Hibernate)。我現(xiàn)在唯一不確定的是,用ASM生成的屬性,類型可以是另外的類嗎?答案是可以,跟內(nèi)置的Java類型是一樣一樣的。

然后是我要讓生成HTML或者XML能正確顯示字段的Label,這個(gè)可以提取表的注釋,然后利用ASM動態(tài)加上注解。

Just Play

對于那些基礎(chǔ)數(shù)據(jù)的簡單維護(hù),或者你的系統(tǒng)設(shè)計(jì)本來就不想什么OO范型,那么這個(gè)基礎(chǔ)框架是有用的,面對真正復(fù)雜的大型企業(yè)應(yīng)用,它比較好的一點(diǎn)是不會阻止你實(shí)現(xiàn)復(fù)雜的對象圖。

寫到這,我第一次感到:我干嘛還要用Java呢?因此最后我只能說,Just Play,正如Dave所說,在真正的項(xiàng)目中,代碼生成并不像看起來那么有用,但是,起碼你有了一個(gè)好的腳手架~~~

【編輯推薦】

  1. 快速啟動一個(gè)Java Web編程框架
  2. 為Java Web應(yīng)用程序增加入侵檢測功能
  3. 新一代Java Web開發(fā)框架JSF訪談實(shí)錄
責(zé)任編輯:彭凡 來源: javaeye
相關(guān)推薦

2010-11-17 12:59:52

2024-09-29 16:36:16

2011-12-16 09:49:38

Java

2012-01-13 11:02:27

JavaWebOpenXava

2011-11-08 10:36:42

Java

2011-09-08 17:48:33

Web Widget

2009-06-18 12:06:30

Java Web開發(fā)框

2009-09-03 16:52:44

Java Web開發(fā)框

2009-05-08 09:32:27

JavaWeb編程框架

2016-01-27 09:39:13

JoobyJava Web流程

2011-02-17 11:18:29

PythonWebRuby

2009-07-09 15:31:23

構(gòu)建Python開發(fā)環(huán)

2009-06-25 17:14:59

JSF框架

2021-07-28 06:51:08

FlaskPythonWeb

2010-10-08 10:17:59

Web服務(wù)安全

2011-03-21 14:41:04

LAMPapacheweb

2009-07-29 09:38:06

Web開發(fā)ASP.NET

2011-08-23 17:52:39

LUAWeb 開發(fā)

2009-07-06 10:25:14

Java Web Se

2011-11-01 09:23:34

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號