2011年6月17日 星期五

Framework 樣板之Struts1 + Spring3 + Hibernate3教學(一)


版本:Struts1.3.10 + Spring3.1 + Hibernate3.6

包含:Displaytag、Tiles 、 OpenSessionInView 及 連接DB
資料庫:MS SQL2005

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




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

SSH架構說明:

src下的folder
action:DispatchDemoAction繼承BaseAction,ExampleAction繼承Action,提供兩種寫法做參考,即可直接get service,不用再呼叫spring WebApplicationContext。

common:共用變數及BaseAction。BaseAction中繼承DispatchAction,也可將seesion處理的方法寫在此。

filter:簡易登入權限設定。

formbean:提供給action使用。

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

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

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

config:spring物件注入,不開放給外部修改的xml。
          ex:LoginCheckerFilter.xml,登入權限
                 DAOService.xml,每個Service要用到的dao
                 BaseService.xml,所有的Service
                 applicationContext.xml,Hibernate基本設定檔
                 TransactionManager.xml,用OpenSessionInView必需

WEB-INF下的folder
config:spring物件注入,開放給外部修改的xml,方便於環境異動。
           ex:DataSourceService.xml,DB登入帳密。

tiles:主要有兩部分,一.layout為tiles的框架,二.page為所有jsp頁面。

細部說明:
從Service開始說明,所有的xxxService都是interface,由xxxServiceImpl實作,每個service所用到的dao,均定義在DAOService.xml。
唯一例外的是BaseService,此BaseService注入了所有Service,定義在BaseService.xml,提供給BaseAction使用。
讀起來好像有點饒舌,看圖應該比較好理解


為什麼我要搞的這麼複雜呢?

當我在寫action需要取得Service時,必須要寫
ServletContext application = this.getServlet().getServletContext();
WebApplicationContext wac = WebApplicationContextUtils.getWebApplicationContext(application);
xxxService serice = (xxxService) wac.getBean("xxxService");
每次都要寫這麼一大串,感覺好煩,我又常常忘記getBean裡面要填的名稱,而且還要強制轉型。
所以最後將所有Service都注入BaseService,再BaseAction中只要寫一次getBean("BaseService"),
在DispatchDemoAction中我只要寫this.getMemberService(),就可以取得MemberService,多方便。



Tiles設定:

需要struts-tiles-1.3.10.jar
1. 在struts-config.xml加入

<plug-in className="org.apache.struts.tiles.TilesPlugin">
   <set-property property="definitions-config" value="/WEB-INF/tiles/tiles-defs.xml"/>
   <set-property property="moduleAware" value="true" />
</plug-in>

2. 在/WEB-INF/tiles/增加tiles-defs.xml,範例請下載原始碼。

3. struts-config.xml中的action forward path也要修改,要與tiles的definition name做對應。


注意事項:
在web.xml載入這些xml是有順序性的,要注意。
<context-param>
 <param-name>contextConfigLocation</param-name>
 <param-value>
  classpath*:config/applicationContext/LoginCheckerFilter.xml,
  classpath*:config/applicationContext/TransactionManager.xml,
  /WEB-INF/config/applicationContext/DataSourceService.xml,
  classpath*:config/applicationContext/applicationContext.xml,
  classpath*:config/applicationContext/DAOService.xml,
  /WEB-INF/config/applicationContext/SearchService.xml,
  classpath*:config/applicationContext/BaseService.xml
 </param-value>
</context-param>


 如有疑問,歡迎提出,也請大家多多指教