FastJsp,給JSP插上敏捷開發的翅膀?

fastjsp發表於2008-04-01
敏捷開發,一個很老很年輕的話題,不得不談而且必須談的話題,無論你用ASP、PHP、JSP還是ROR,它隨時都觸動我們開發的神經,讓我們在懵懵焦慮中度過一個個不眠之夜。困了,煩了,唉......與其在煩惱中困惑,不如在煩惱中爆發,讓我們展開JSP敏捷開發的暢想吧!

解決任何問題,我們都希望很handy,那handy又是何意呢?開啟金山詞霸2006,輸入handy可得解釋:“就近的,唾手可得的, 便利的, 敏捷的, 容易取得的”。解釋的很直白,卻充滿了人性化,甚至潛意識。呵呵,如果開發不handy,我們將會怎樣?

泛元件化是敏捷開發的最大陷阱!我們的WEB必須要有視覺表現力,WEB2.0要求更甚,但這種表現力需要精烹細調,箇中過程遠非簡單的HTML、CSS之類,開發人員隨時可能更改程式部分,不僅僅美工的問題,如果更改部分是“元件”,那你的麻煩大了。要求頁面元素的“元件”化,無非是為了程式碼“複用”和“ 表現”的統一,但能獲得視覺上的特色嗎?一個很簡單的類比:為了滿足“味覺”的“鮮美”特色,工業複用方式的生產做得到嗎?西餐作不到,中餐更不可能。想想看吧,製作中餐一份鮮美的“小蔥拌豆腐”,廚師很handy地備齊佐料,然後再很handy地developping;端上客桌,可客人說香味還不夠深蘊,這只是個小修改,若重新回爐打造豈不消耗時間浪費精力,OK,怎麼做呢?廚師很handy地準備些鮮蔥等,然後再“撒”到菜面上即可。整個修改過程,你會發現廚師似乎手忙腳亂,過程繁瑣,但實際卻有條不紊,按部就班,最後你會說,“哇,味道真好!師傅,你好利索呀!”呵呵,反之,為了達到所謂的方便,廚師把預定分量的小蔥等佐料味道打包形成“元件化”,到時客人一嘗,還不大會光火:“師傅,色、香、味樣樣沒有,你就很handy的自己埋單吧!”

WEB特色來自handy,而非component!為何ASP、PHP以及新近出現的ROR,無一例外都把JSP打的滿地找牙?隨便找三點原因:
1. 解釋性語言簡單明瞭,學習、開發、維護成本都很低廉,讓JAVA學究式語言的規範整潔無用武之地。
2. WEB開發無需大量企業級應用元件,一般提供mysql程式設計介面即可,這讓JAVA的海量元件形同虛設。
3. 語言本身決定了單純動態頁面的編碼難度。排除語言本身的優勢,VBS,PHP,RUBY相對都很簡單,說白了,能完成簡單邏輯和mysql程式設計即可。
再來看看RoR為何近年來很火!?它是OO類語言,這是潮流,看看這兩年C和PHP5都在OO方面大力跟進就知道了,但為何只有RoR有排山倒海之勢呢?!甚至出現了Grails跟風。另外,後者會上演GoG大戲嗎?因為它有Java這個OO鼻主當靠山啊。No,回答是否定的,原因何在呢?回答這個問題前,得先回答另外一個問題:如果沒有Rails,Ruby還翱翔的翅膀嗎?除了語言本身的簡潔,Rails最大的特點就是:習慣約定優於配置。所以,與其說Ruby,還不如說是Rails給WEB開發帶來了暫新的模式。正是這個滿足八二原則的開發模式極大激發了WEB開發人員的熱情。尤其是Java開發人員,他們身負“元件化”重任,飽受各種配置規範的折磨,這種handy風格讓他們看到了解脫的希望。假如將這種handy風格應用到Jsp,又會出現怎樣的情形?問題是Jsp是爛泥嗎?能扶上牆嗎?答案是:能!針鋒相對的理由:
1. 語言規範整潔,符合企業嚴整風範
2. 超大規模的企業級應用元件,便於web應用未來擴大之後的進一步發展
3. 單純JSP頁面只包含顯示邏輯,在IDEA、Ellipse外掛支援下也能展開敏捷開發

既然能,那我們就嘗試Jsp的handy開發吧!2005年7月,FastJsp 1.0正式誕生了。FastJsp意即“快速開發Jsp應用”,設計思想就是:拋開繁瑣配置,提供常見開發需求,讓使用者展開純粹的Jsp快速開發!也就是今天所謂的handy開發。時過境遷,沒想到它還是那麼有魅力,所以這裡就斗膽把它擰出來,簡單解剖,興許對大家探索JSP敏捷開發有所裨益。

討論FastJsp前,先看看當今常見的Java WEB層開發模式:(1)Java Servlet的直接封裝,如Wicket,Tapestry (2)Jsp再封裝,如:JSF,Struts,Webwork (3)Script 方式封裝,如:Velocity,Freemaker,OGNL,典型的框架就是Turbine,Tapestry3/4等。 (4)基於Java的解釋性語言表達,如:Groovy,這種方式最大的瓶頸在於效能,而且精通的前提是掌握Java,同時蹩腳的Grails實現也給未來的高效能WEB應用埋下不確定因素,顯然存在非常高昂的綜合成本。(5)Jsp直接支援:如FastJsp。

除了FastJsp,相信大家對其它模式有所嘗試,箇中酸楚深淺不一,這裡不作探討。那麼FastJsp有怎樣的開發模式呢?

一:相當handy、統一的URL模式
假設頁面模組news下有頁面hello,引數p1=v2,p2=v2 可執行的URL模式包括:
http://www.example.com/news/hello.html?p1=v1&p2=v2
http://www.example.com/news/hello/p1-v1-p2-v2.html
http://www.example.com/news/hello/p1-v1.html?p2=v2
http://www.example.com/news/hello?p1=v1&p2=v2

二:相當handy、規範化的頁面組織
本框架基於“頁面級”的程式碼組織方式,每個Jsp頁面對應一個Java頁面類,每個頁面再下屬url action和表單及其action。各頁面Java類和Jsp頁面可由程式自由設定存放位置。
Java 類是按需新增的,如上例訪問hello.html,系統執行時,將首先查詢news模組的hello.jsp,如存在對應的Hello.java頁面類,則執行之;否則,就認為其獨立存在,但系統仍會執行一個news模組的“預設”頁面類,便於hello.jsp中也能提取該模組特定的資源:url構造、 i18n、風格等。

1)頁面Java類:Page/Component,Form/Url,Action的組織
page1
...Page1.java
...form
......form1
.........Form1.java
.........action
............FormAction1.java
............FormAction2.java
............FormAction3.java(more form action)......
......form2(more form).......
...url
......UrlAction1.java
......UrlAction2.java
......UrlAction3.java(more url action)......
page2...
(more page)...

在IDEA、Eclipse、Netbeans等IDEA下,頁面類檢視非常清晰,每個模組有幾個頁面,每個頁面下有幾個表單,每個表單下有幾個action等都一目瞭然。

2)Jsp頁面模板
如hello.jsp,存放到自定義的位置即可

三、相當handy的頁面元件級設計
本框架中,頁面可按元件包含的方式設計,透過實現對<jsp:include/>標籤的Java類支援,來達到複用JSP模板的目的。程式碼組織與上述頁面部分相同。
軟體包有個範例:users,演示如何元件化開發,大家可仔細觀摩。

四、相當handy的的表單驗證
開發人員可使用系統預設的表單驗證器驗證頁面輸入,當然,必要時也可自定義。驗證過程預設在action執行前執行,當然,也可在頁面初始化完畢時或在action中與程式邏輯摻雜執行。

五、相當handy的多檔案上傳
封裝了commons-fileupload 元件,服務端可同時處理多個檔案上傳。模組範圍內的任何頁面,都自動具備此特性,即時沒有頁面類也能隨便呼叫。

六、相當handy的擴充套件能力
兩種理解:
1)普通的Jsp頁面放到本框架模組內即可執行,並自動享有模組資源呼叫能力。例如,放置hello.jsp到模組news下http://host/news/hello[.html]即可正常訪問,無需任何更改,若想呼叫模組資源,更改jsp程式碼或新增個hello頁面類即可。
2) 一般web應用初期,就一個簡單jsp頁面,但後期隨著應用複雜度的增加,什麼風格、i18n、檔案上載、url/forum、表單驗證等都要增加,尤其需要MVC程式碼分離時,到時你只要按需新增即可目標Java類即可。如,新增個表單helloform,則新增[packages]page/form /helloform/Helloform就行。

七、相當handy的頁面語言
完全基於Servlet 2.3/JSP1.2標準,學習成本極其低廉,標籤最多會使用一個<jsp:include/>,甚至連其引數也無需掌握。

未來FastJsp的handy思考:
1. 如何更加handy?
2. 有必要新增Ajax嗎?
3. 有必要新增業務框架嗎?
4. 有必要開發Ellipse或IDEA的輔助外掛嗎?

下載地址http://bbs.onetsoft.com/bbs/messages/t-48.html

歡迎大家多提有建設性的意見。

相關文章