Seasar軟體起源
Seasar framework開發模式起源於日本,並且在日本非常流行。Seasar framework最初公布於眾是03年8月,那時是作為一個套用伺服器,依託於Web 容器Jetty和資料庫HSQLDB。後來,於04年3月,經過改造,成為一個輕量級DI(Dependency Injection)和AOP容器,並重新命名為seasar2。經過一段時間的發展,從05年4月,該項目移到 sourceforge jp,並且真正意義上的開源,用的是apache liscense2.0。
就像其它DI容器一樣,Seasar中的組件也是通過xml配置檔案定義,但是,它引入了“Convention over Configuration”,有點類似於Ruby On Rails的CoC,和Spring的配置檔案比起來,確實小的很多。
Seasar框架組成
Seasar核心和擴展:框架的DI和AOP實現,以及一些相關服務,如連線池、事務、JDBC框架
相關軟體:如S2Hibernate,S2Dao,S2Struts,S2JSF
Sandbox軟體:就是相關軟體的開發中版本。這類軟體非常多,如對JMS、Remote的支持框架。
Seasar框架,除了以Java版本為主外,還有.Net和php5版本。當然,這兩種語言的擴展框架不如Java版豐富。
Seasar框架認識
1、 從框架的使用來說,和使用Spring沒有太大區別。Spring提供的IoC和AOP,它幾乎都提供,而且第三方擴展也都差不多。
2、 Seasar的配置檔案,比Spring的少很多,這也是官方宣傳的亮點。因為它可以根據規則,將組件和組件的關聯一次性配置。這些規則,就是接口和接口的實現類的命名、分包方式。
3、 Seasar的官方英文文檔很少,而且幾乎只有官方網站支持,沒有論壇。我主要是看源碼,再結合文檔看。而且源碼沒有任何注釋。 但是,它的代碼量比較小,兩個核心包加起來只有2w行代碼(不包括注釋和空行)。
4、 Seasar也是一個一站式框架。它除了提供核心DI和AOP服務外,還有持久層和表示層框架,比較有特色的是Mayaa模板,類似於tapestry那種方式,一個html,一個.mayaa檔案。
用Seasar開發過程中用到的一個流行框架組合:Seasar+S2Dao+S2Struts+Mayaa。
S2Dao:
這是Seasar自己的持久化解決方案。非常精緻,只有6000多行代碼。不過功能比起Hibernate弱很多。但是,對於不是非常強調OO建模的套用來說,我認為是足夠了。它不是ORM,只是實現了DAO模式,並且開發人員不必和JDBC打交道。
而且,我覺得它最大的亮點,就是不用寫持久層代碼,用戶只需寫接口,以及某些接口方法對應的sql。它會通過AOP自動生成實現類,而且也是聲明式事務。
它的開發過程大概是:
1、 根據資料庫table,寫Entity類。注意,不是命名為Model,因為它只是資料庫表的實體映射,就如同E-R圖的E部分,在Entity類中,通過欄位表示如下信息:對應的資料庫table、欄位對應信息、多對1關聯關係等等。注意,它只能實現多對1關聯。
2、 寫出DAO的接口,譬如基本的CRUDL操作,要是有複雜的CRUDL,可以通過方法名、以及對應的sql搞定。但只能用一條sql。所以,譬如當我們要實現複雜的insert操作,必須在Service層組合幾個dao的接口方法,然後加上聲明式事務。
3、 對於多資料庫支持,是通過在sql語句的檔案名稱後面加上資料庫後綴,如UserDAO_findByUsername_mysql.sql。我覺得非常不爽的地方時,它必須每個方法一個sql檔案,要是我一個dao接口有30個方法,我不是要寫30個sql檔案?當然,sql語句可以注釋在DAO接口上面。
大概以上三步概括了S2Dao框架的基本使用,它沒有什麼特殊用法,因為我看原始碼上也很簡單。因為它省去了在ORM框架中最難的部分:關聯映射、繼承關係、cache等。不過,這樣也讓S2dao的持久層開發異常簡單。
對S2Dao的整體感覺,它和EJB中的實體Bean,特別是CMP非常類似,又有些BMP的特性。但是,它的配置檔案除了sql,幾乎沒有。
當然,持久層還有和Hibernate集成的S2Hibernate,但比起Spring差遠了。
S2Struts:
它是Seasar用DI和AOP技術對Struts進行封裝。它支持Struts的Action風格和配置,同時,也支持純POJO的Action。後者的Action是官方的推薦,它不用像Webwork那樣實現特定的Action接口,它就是普通的JavaBean,但是它一般需要實現一個自己的接口,這點有些不爽,但對於Action配置很方便。另外,它的ActionForm也完全是普通的JavaBean。
整體上,S2Struts的使用和Webwork驚人的相似,類風格也非常一致,譬如方法的返回值是一個字元串。
S2Struts通過 prototype的實例生成方式,解決了Struts本身的執行緒安全問題,因為Struts是共享一個Action實例。所以,在S2Struts的Action裡面,我們可以聲明實例變數。
S2Struts的實現原理大致是:通過AOP將普通JavaBean的ActionForm動態注入自己的S2BeanValidatorBean,該Bean繼承於Struts的ActionForm。普通POJO的Action類也類似這樣:動態將ActionForm和ActionMapping等注入。而且,通過filter,將HttpServletRequest,HttpServletResponse等實例注入Seasar 容器的ThreadLocal變數里,而Action可以通過訪問容器來獲取這些組件,同時,這些對象也自動通過setter方式注入Action,這樣Action就可以和Web容器打交道了,譬如直接調用reponse.sendRedirect導航,因為在url裡面動態注入參數這類需求不容易實現,但Webwork可以在配置檔案裡面通過類似viewUser do?id=${id}方式注入id值。
表示層模板語言Mayaa
我認為這是它的一個亮點,當然Mayaa不屬於Seasea,它是一個單獨的項目,譬如官方已經將Mayaa和Webwork2集成了,但是它掛在seasar下:http://mayaa.seasar org/。我接觸過幾種模板語言,如Velocity、freemaker,Tapestry的html,但是,我認為,Mayaa是設計上最優雅的:它可以完全將html頁面單獨拿出來設計。通過每個html檔案並列的mayaa檔案寫展現邏輯,動態注入html頁面。
Velocity和Freemake對於美工和可視化編輯並不友好,Tapestry這種事件驅動框架生成的url也不友好。
不過,也有一些限制,它現在只有日文文檔,模板出錯調試幾乎不太現實:大量反射。Mayaa的文檔還是挺豐富的,我是用google的網站翻譯工具,再結合官方examples學習的。
Mayaa現在支持三種標籤庫:Struts、JSTL、mayaa標籤,所以mayaa的使用主要在標籤上。
另外,Mayaa有自己的布局管理器,功能類似於Tiles和sitemesh。
Mayaa的實現原理,大致是根據html的tag ID,用mayaa模板對應的ID動態替換。
Mayaa的demo,很多用直接的html請求,如listArticls.html?userId=12方式請求,mayaa模板檔案里調用action方法
Java代碼
<s2struts:init action="#{ownerAction.doInitRegisterOwner}" />
<s2struts:init action="#{ownerAction.doInitRegisterOwner}" />
,雖然方便,但這樣就退化到了Model 1請求方式,從Model 2的Push退化到了Pull,一會兒 .do請求,一會兒 .html請求,讓人對Request.setAttribute很迷惑。
目前國內常使用SEASAR2模式進行項目開發的企業有:
上海桑友信息科技有限公司、上海小櫻信息科技有限公司等日資企業。