2011年7月14日 星期四

Framework 樣板之Struts2 Annotation + Spring3.1 + Hibernate3.6 JPA (四)


版本:Struts2.2.3 + Spring3.1 + Hibernate3.6

包含:Displaytag、Tiles 、 OpenSessionInView 及 連接DB

資料庫:MS SQL2005


Schema:在/BlankS2SH/WebContent/dev/sql.txt,為了方便說明,僅用兩張Table。




下載: 原始碼 ,可直接從Eclipse import。


Struts2.2.3 + Spring3.1 + Hibernate3.6 架構說明:

src下的folder

struts.properties:細部設定。

struts.xml:設定action forward。

action:DispatchDemoAction及ExampleAction繼承ActionSupport。

common:共用變數。

persistence:Hibernate dao,此資料夾階由Myeclipse自動產生。

service:主要的商業邏輯寫在這,依照功能切分不同服務。ex:MemberService包含會員的新增、刪除和修改等。

utility:獨立元件,可直接搬移至其他專案。ex:檔案下載、發送郵件。


WEB-INF下的folder

config:必要設定檔。
        ex: applicationContext.xml,Hibernate基本設定檔。
            DataSourceService.xml,DB登入帳密,如果不想用c3p0的connection pool,直接更換此檔即可。
            tiles-front.xml,tiles2設定。

jsp:主要有三部分,一.layout為tiles的框架;二.front為所有jsp頁面;三. common共用頁面。



細部說明:
Struts2比1的設定檔少了很多,只需要設定action forward。另外又與Spring3整合,可以用annotation取代注入的xml。與SSH相比少了DAOService.xml、SearchService.xml及BaseService.xml,不管對於新手還是老手,開發的速度都會快很多。
與Spring3 MVC相比,只是將RequestMapping,統一寫到struts.xml中。所要寫的設定是差不多的。
我個人是比較喜歡把forward的路徑寫在同一個地方,要改的時候也比較方便。
有人可能會問,共同開發時,大家都寫在同一個struts.xml,同步的時候會沖到很麻煩。
這個問題切成多個struts.xml就可以避免了。

網路上已經很多人討論過Struts2及Spring3的優缺點了。

我認為最重要的是你們團隊中,對哪一種framework最快熟悉或是最快上手,來決定要用哪種。

我在這列出幾點:

1. 維護性:Spring3自由度太高導致維護性比Struts2低。

2. 元件:Spring3只有JSTL可以用。Struts2有ONGL及DOJO等,還有許多自行開的元件可以使用。

3. REST支援度:Spring3完全支援。Struts2不支援多參數。

4. 版本:Spring3更新速度相當快,版本間的相容性也很高。Struts2可能太過龐大,通常要一段時間才會更新。

Tiles設定:
需要tiles-api-2.2.2.jar、tiles-core-2.2.2.jar、tiles-jsp-2.2.2.jar、tiles-servlet-2.2.2.jar、tiles-template-2.2.2.jar

1. 在web.xml加上
<listener>
    <listener-class>org.apache.struts2.tiles.StrutsTilesListener</listener-class>
</listener>
<context-param>
    <param-name>org.apache.tiles.impl.BasicTilesContainer.DEFINITIONS_CONFIG</param-name>
    <param-value><!-- 多個tiles文件以逗號隔開 -->
            /WEB-INF/tiles/tiles-defs.xml
    </param-value>
</context-param>


2. 在struts.xml加上
<package name="default" extends="tiles-default">


常見問題:

1. dispatch沒有作用

檢查struts.properties中struts.enable.DynamicMethodInvocation要設成true

struts.xml的action forward要寫成
<action name="dispatchDemo_*" method="{1}" class="div.mmncsmm.action.DispatchDemoAction">
    <result name="load" type="tiles">dispatchDemo.load</result>
    <result name="save" type="tiles">dispatchDemo.save</result>
</action>


2. autowire沒作用

這個地方我卡了很久,最後才找到,原來在applicationContext.xml要加上
<context:component-scan base-package="div.mmncsmm" />


3. tiles沒作用
請看