SSH開發實踐part4:Spring整合Struts

大魔王薩格拉斯發表於2014-07-05

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的配置啦,這裡就不再贅述了。

 

相關文章