1
好了,前面spring與hibernate的整合開發我們基本上講完了,現在要開始服務層的開發,也就是處理事務的action,在這裡我們需要引入spring與struts的整合。也就是將action也作為一個bean交由spring進行管理。當然首先我們要完成相關的配置。
2 配置
第一步當然是現在專案中引入struts包,也可以通過IDE快速的引入。
然後就是修改web.xml的配置資訊:
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
依次簡單解釋一下:
第一個是通過配置ContextLoaderListener監聽器,使容器啟動時,自動載入applicationContext配置,因為它實現了ServletContextListener這個介面,容器啟動時會自動執行它實現的方法。
然後配置我們applicationcontext.xml所在位置,如果是預設位置的話也可以不用配置。
最後兩個大家都比較熟悉了,就是struts攔截器。
3 編寫服務層
同樣的,按照分層設計的思想,這裡我們同樣取樣介面開發的設計模式。先編寫伺服器層介面類,然後在編寫具體的實現類。
比如這裡我們編寫了一個關於員工的服務層介面:
public interface EmpService { public static final int LOGIN_FAIL=0; public static final int LOGIN_EMP=1; public static final int LOGIN_MGR=1; public int login(Manager mgr); public String punch(Employee emp); public Set<AttendType> getAllAttendType(); public boolean addApplication(Employee emp); }
介面中定義了一些常量以及方法,然後我們在實現類中進行具體的實現:
public class EmpServiceImp implements EmpService{ private EmployeeDAO empDao; private ManagerDAO mgrDao; public EmployeeDAO getEmpDao() { return empDao; } public void setEmpDao(EmployeeDAO empDao) { this.empDao = empDao; } public ManagerDAO getMgrDao() { return mgrDao; } public void setMgrDao(ManagerDAO mgrDao) { this.mgrDao = mgrDao; } @Override public int login(Manager mgr) { // TODO Auto-generated method stub if( empDao.findByNameAndPass(mgr).size() >= 1){ return LOGIN_EMP; }else if(mgrDao.findMgrByNameAndPass(mgr).size() >= 1){ return LOGIN_MGR; }else{ return LOGIN_FAIL; } } @Override public String punch(Employee emp) { // TODO Auto-generated method stub return null; } @Override public Set<AttendType> getAllAttendType() { // TODO Auto-generated method stub return null; } @Override public boolean addApplication(Employee emp) { // TODO Auto-generated method stub return false; } }
這裡需要注意的是:我們使用的DAO類(比如EmployeeDAO)都是介面層,而不是具體的實現類,也就是說這個時候我的action是不知道到時候要呼叫哪個dao實現類的。
怎麼辦呢?自然想到spring對於bean物件的管理,我們可以在配置檔案中配置,像action實現類中注入其所需的dao實現類。
4 注入配置
ok這裡就比較簡單啦,又回到了spring的配置上:
<bean id="daoTemplate" abstract="true" lazy-init="true" p:sessionFactory-ref="sessionFactory"/> <bean id="EmployeeDao" class="com.souvenir.daoImp.EmployeeDaoImp" parent="daoTemplate"/> <bean id="PaymentDao" class="com.souvenir.daoImp.PaymentDaoImp" parent="daoTemplate"/> <bean id="ManagerDao" class="com.souvenir.daoImp.ManagerDaoImp" parent="daoTemplate"/> ...... <!-- action配置 --> <bean id="EmpManager" class="com.souvenir.serviceImp.EmpServiceImp"> <property name="empDao" ref="EmployeeDao" /> <property name="mgrDao" ref="ManagerDao" /> </bean>
通過配置可以看出我們向action實現類中注入了兩個bean物件,其分別對應我們之前定義好的dao實現類。
5 ok,至此關於SSH整合開發配置的內容就結束了,歸根到底其核心還是通過spring來管理dao與action這些bean物件。
剩下的事就是前端開發然後呼叫action進行處理,也就是struct的配置啦,這裡就不再贅述了。