Seasar+S2Dao+S2Struts+Mayaa

下面的信息完全來自百度的,不過卻是從 goole 上搜出來的 使用關鍵字‘mayaa’。感覺解釋的還不錯,可以留作參考。

 

SEASAR,一種流行的JSP軟件開發框架,目前流行Seasar2其實就是一個非常類似於Spring Framework的開源框架。
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值。


表示層模板語言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很迷惑。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章