1. 程式人生 > >項目實踐 hrm項目的設計過程

項目實踐 hrm項目的設計過程

常量 定義 ret ssi 需求 抽象 服務 橋接模式 業務邏輯

人事管理系統的設計過程

  一、數據庫表和持久化類

  1.1 進行需求分析,根據功能模塊設計數據庫表

  1.2 設計持久化實體

  面向對象分析,即根據系統需求提取出應用中的對象,將這些對象抽象成類,再抽取出需要持久化保存的類,這些需要持久化保存的類就是持久化對象(PO)。

  這裏我們把它設計成單純的數據類,不涉及業務邏輯方法。

  這個階段,要仔細分析對象之間復雜的關聯關系。

  1.3 創建持久化實體類  

  持久化對象之間的關聯關系以成員變量的方式表現出來,而這種關聯關系,通常對應數據庫裏的主鍵、外鍵約束。

  此外,持久化對象還有自己的普通類型的成員變量,這些成員變量對應數據庫中的字段。

  二、實現DAO持久層

  MyBatis推薦通過定義接口來完成SQL語句的映射,該接口可以作為DAO組件使用。(即替代了傳統在DAO層中使用JDBC進行數據庫操作的方式)

  在DAO層中,每個DAO組件包含了數據庫的訪問邏輯;每個DAO組件可以對一個數據庫表完成基本的CRUD操作。

  門面模式:業務邏輯組件封裝DAO組件

  橋接模式:業務邏輯組件負責業務邏輯的變化,DAO組件負責持久化技術的變化

  1、使用一個公共常量類

  在這個常量類中定義一些可以方便使用的常量(一般是String),如清晰、簡化數據庫中表的名字,方便構造sql語句。

  2、定義DAO接口

  如果我們需要使用動態的SQL操作,那麽需要定義專門的動態SQL操作提供類,以供DAO組件中使用。

  3、部署DAO層

  MyBatis中,只需要通過SqlSession的getMapper()方法獲得對應的DAO接口實例,就可以調用接口中的方法完成相應的SQL操作。

  而在Spring中,這些DAO接口的實例由Spring容器負責生成和管理(即自動生成bean)。

  MyBatis社區自己開發一個MyBatis-Spring的中間件完成這個過程,通過SqlSessionFactoryBean類,可以將SqlSessionFactory納入Spring的IOC容器。

  需要註意的是,在委托Spring管理DAO之前,必須要為其提供對應的數據源,這裏使用C3P0數據源。

  即在applicationContext.xml中先配置數據源,然後創建SqlSessionFactoryBean類的bean,並在bean中設置好關聯的數據源。

  <!--使用PropertyOverrideConfigurer後處理器加載數據源參數-->
  <context:property-override location="classpath*:db.properties"/>

  <!--配置C3P0數據源-->
  <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"/>

  <!--配置SqlSessionFactory,這個指定的class是MyBatis社區開發的用於整合Spring的bean-->

  

  三、實現Service持久層

  1、業務邏輯組件的設計

  業務邏輯組件是DAO的門面,即業務邏輯組件依賴於DAO組件提供的服務。

  業務邏輯組件面向DAO接口編程,只註重業務邏輯的實現,而無需關心數據庫的訪問。

  2、實現業務邏輯組件

  為了簡化分頁功能,設計了一個分頁的JSP標簽,只需要在頁面使用分頁標簽,就可以完成所有的分頁功能。(要使用JSP的標簽需要在WEB-INF下增加一個tld標簽文件)。

  hrmService接口及其實現類ServiceImpl,其中實現了接口中定義的所有業務邏輯方法。

  3、對業務邏輯方法事務管理

  只有對業務邏輯方法添加事務管理才是有實際意義的,對單個的DAO方法(基本的CRUD方法)增加事務管理沒有太大的實際意義。

 <!--JDBC事務管理器-->
  <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
        p:dataSource-ref="dataSource"/>

  <!--啟用支持annotation註解方式的事務管理-->
  <!--transaction-manager屬性用於指定使用哪個事務管理器-->
  <tx:annotation-driven transaction-manager="transactionManager"/>

  

  4、部署業務邏輯組件

  在applicationContext.xml中開啟組件掃描,讓Spring中自動創建Service Bean(與Controller Bean相同)。

<!--掃描包下的Java文件,有Spring相關註解的類,則把這些類註冊為Spring的bean -->
  <context:component-scan base-package="com.biguo"/>

  四、web層

  數據庫設計、中間層設計(DAO組件、業務邏輯組件)都已經完成,現在進行web層的設計。

  通常,系統的控制器和jsp一起設計。因為jsp頁面發出請求後,該請求被控制器接收,然後控制器調用業務邏輯組件處理請求。

  1、控制器的處理順序

  實際上,控制器是先對請求參數進行解析,然後調用業務邏輯組件中的方法進行業務處理,完成後,再將處理結果通過jsp頁面呈現給用戶。(這也是為什麽一般的處理器方法會返回某個jsp文件的文件名)

  Spring MVC中,控制器有兩塊,一個系統核心控制器DispatcherServlet和業務控制器Controller。

  web.xml中:

  • 配置好Spring的核心監聽器ContextLoadListener,並指定具體的applicationContext.xml作為Spring的配置文件;
  • 配置好Spring MVC的前端核心控制器DispatchServlet,並指定具體的springmvc-config.xml作為Spring MVC的配置文件,並通過映射定義設定為攔截所有請求;
    <!--配置spring核心監聽器,默認會以 /WEB-INF/applicationContext.xml作為配置文件-->
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
        <!--contextConfigLocation參數用來指定Spring的配置文件-->
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/applicationContext.xml</param-value>
        </context-param>
    
        <!--定義Spring MVC的前端控制器-->
        <servlet>
            <servlet-name>springmvc</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>/WEB-INF/springmvc-config.xml</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
    
        <!--讓Spring MVC的前端控制器攔截所有請求-->
        <servlet-mapping>
            <servlet-name>springmvc</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>

 

  2、控制器的處理細節

  springmvc-config.xml中配置了一個攔截器,用於判斷用戶是否登錄,如果沒有登錄,則用戶不能訪問網站,然後跳轉到登錄頁面。這個攔截器的相關類需要自己實現。

<!-- 定義Spring MVC的攔截器 -->
    <mvc:interceptors>
        <mvc:interceptor>
            <!-- 攔截所有請求 -->
            <mvc:mapping path="/*"/>
            <!-- 自定義判斷用戶權限的攔截類 -->
            <bean class="com.biguo.interceptor.AuthorizedInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

  事實上這是個很關鍵的問題,系統是怎麽保存一個用戶的登錄狀態的?  

  最後,根據不同的功能模塊,設計的不同的Controller,以調用相應的Service方法,進行業務處理。

  值得一提的是,有一個動態頁面跳轉控制器:

/**
 * 動態頁面跳轉控制器
 * */
@Controller
public class FormController{

    @RequestMapping(value="/{formName}")
     public String loginForm(@PathVariable String formName){
        // 動態跳轉頁面
        return formName;
    }
}

  

項目實踐 hrm項目的設計過程