版本: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沒作用
請看