項目實踐 hrm項目的設計過程
人事管理系統的設計過程
一、數據庫表和持久化類
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項目的設計過程