天天看點

Seasar Framework介紹

近段時間,給公司一項目組教育訓練Seasar Framework (http://www.seasar.org/en/index.html),一個非常類似于Spring Framework的架構,它起源于日本,并且在日本非常流行。現在我對這段時間的學習做一個總結。學習和教育訓練過程中,我們以一個mini Blog項目練習,功能需求類似于Javaeye的blog。 

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代碼  

Seasar Framework介紹
  1. <s2struts:init action="#{ownerAction.doInitRegisterOwner}" />  

,雖然友善,但這樣就退化到了Model 1請求方式,從Model 2的Push退化到了Pull,一會兒 .do請求,一會兒 .html請求,讓人對Request.setAttribute很迷惑。 

這次,就介紹到這兒了,下次我再對Seasar架構的設計原理,特别是源碼做初步探索。