范士領(lǐng) 盛凱 合肥職業(yè)技術(shù)學(xué)院
引言:隨著行業(yè)的完善和細(xì)分,各行業(yè)(尤其是軟件行業(yè))出現(xiàn)了越來越多的中小型公司、兼職團(tuán)隊(duì)和自由職業(yè)者,這些公司或團(tuán)隊(duì)的組成及合作方式非常動(dòng)態(tài)、變化極大、靈活性非常高,他們通常無法在一起面對(duì)面工作和溝通,甚至工作的時(shí)間段也不一致;加上資金有限,也沒有能力購買一整套協(xié)作和溝通的軟件。目前市場(chǎng)上存在的項(xiàng)目管理軟件,如微軟的project,存在著很多的缺陷:費(fèi)用相對(duì)較高,復(fù)雜,分享比較麻煩,無法集成其他方面的功能,比如在線方面的功能。軟件項(xiàng)目管理工作面臨著極大的挑戰(zhàn),迫切需要一個(gè)高效,方便的資源共享,動(dòng)態(tài)監(jiān)控,指導(dǎo)各軟件項(xiàng)目開發(fā)管理的信息化工作平臺(tái)的支持。
在線項(xiàng)目協(xié)作平臺(tái)的目標(biāo)是搭建一個(gè)基于Web的在線項(xiàng)目管理協(xié)作平臺(tái),方便項(xiàng)目負(fù)責(zé)人對(duì)于項(xiàng)目的規(guī)劃、管理、任務(wù)分配、項(xiàng)目進(jìn)度的把握,成員之間協(xié)作、溝通、分享資料和互相通知,以適應(yīng)項(xiàng)目和團(tuán)隊(duì)的快速變化和遠(yuǎn)程協(xié)作。
目前,在軟件開發(fā)技術(shù)方面,提高應(yīng)用系統(tǒng)開發(fā)效率的方法較多,其中比較成熟的技術(shù)有基于MVC模式的Struts2技術(shù)、Spring2技術(shù)和Hibernate3技術(shù),而將這三種技術(shù)有機(jī)結(jié)合起來構(gòu)建SSH框架,不但可以有效提高系統(tǒng)開發(fā)效率,而且在系統(tǒng)安全性、穩(wěn)定性和健壯性、擴(kuò)展性上都有良好的改進(jìn)。在線項(xiàng)目協(xié)作平臺(tái)軟件綜合應(yīng)用了Struts2、Spring2和Hiberhate3這三種最新的軟件框架技術(shù),使其具有良好的架構(gòu)和穩(wěn)定的性能。
Struts2是現(xiàn)今WEB開發(fā)技術(shù)中運(yùn)用最廣泛的實(shí)現(xiàn)了MVC模式開源框架, 相對(duì)于Strutsl來說,Struts2并不是簡單的升級(jí), 而是從WebWork升級(jí)而來的新版Struts。在Strutsl的基礎(chǔ)上作了大量的改進(jìn),并融入了Struts1和WebWork2的優(yōu)點(diǎn),Struts2使用了webwork設(shè)計(jì)核心,而不是Struts1設(shè)計(jì)核心。Struts2將一個(gè)Web系統(tǒng)的程序分為模型、視圖和控制器三個(gè)部分。模型由JavaBean、EJB等組件構(gòu)成;視圖由JSP、HTML、Struts2標(biāo)簽,JSTL標(biāo)簽組成;控制器由Action來實(shí)現(xiàn)。
Spring2是一種輕量級(jí)J2EE開源框架,提供了管理業(yè)務(wù)對(duì)象的一致方法并且鼓勵(lì)對(duì)接口編程而不是對(duì)類編程的良好習(xí)慣。它以控制反轉(zhuǎn)(inversion of control,IoC)或依賴注入(dependency injection,DI)原則和面向方面編程(aspect-oriented programming,AOP)思想為基礎(chǔ),提供管理業(yè)務(wù)對(duì)象服務(wù)。IoC/DI是Spring的核心,即組件的關(guān)系由容器來控制,而非傳統(tǒng)的程序代碼,從而極大改善了代碼的可重用性。核心容器的主要組件是BeanFactory,它是工廠模式的實(shí)現(xiàn)。BeanFactory使用IoC模式將應(yīng)用程序的配置和依賴性規(guī)范與實(shí)際的應(yīng)用程序代碼分開。
Hibernate框架使用O/R映射技術(shù),對(duì)JDBC進(jìn)行輕量級(jí)的對(duì)象封裝,讓普通的Java對(duì)象(Plain Old Java Objects,POJO)變成持久化類,管理Java類到數(shù)據(jù)庫表的映射,并提供數(shù)據(jù)查詢和獲取數(shù)據(jù)的方法。Hibernate3,在以前的版本上,做了三個(gè)方面變化:API的變化,元數(shù)據(jù),HQL查詢語句,產(chǎn)品的性能,兼容性,穩(wěn)定性都得到了提高。
在平臺(tái)中采用了如下的整合策略:
(1)Struts2中的Action和數(shù)據(jù)邏輯層的數(shù)據(jù)操作bean交由Spring2容器來管理,在Struts2中采用偽Action來代替真實(shí)的Action,真實(shí)的Action位于Spring2容器中。
(2)數(shù)據(jù)操作bean僅針對(duì)POJO對(duì)象操作,而POJO對(duì)象與數(shù)據(jù)庫中數(shù)據(jù)的映射、數(shù)據(jù)的關(guān)系邏輯及數(shù)據(jù)的持久化工作由Hibernate3來實(shí)現(xiàn)。
(3)數(shù)據(jù)操作bean中的POJO對(duì)象由Spring2注入,POJO的屬性值則由Hibernate來生成。整合后的框架結(jié)構(gòu)如圖 1:
圖 1 基于Struts2+Spring2+Hibernate3平臺(tái)的總體軟件架構(gòu)
在線項(xiàng)目管理系統(tǒng)是部署于WEB服務(wù)器上的基于B/S架構(gòu)的應(yīng)用系統(tǒng)。系統(tǒng)用戶可以使用設(shè)定的帳號(hào)登錄系統(tǒng)。系統(tǒng)結(jié)構(gòu)圖如圖2:
圖 2在線項(xiàng)目協(xié)作平臺(tái)模塊結(jié)構(gòu)圖
該項(xiàng)目的開發(fā)環(huán)境為Windows XP,數(shù)據(jù)庫使用SQL Servser 2005,Web Server使用 Tomcat v6.0 Server,開發(fā)語言為 java,開發(fā)工具為eclipse。在建立項(xiàng)目后,需要導(dǎo)入struts2,spring2和hibernate所需的.jar包。以項(xiàng)目管理模塊添加項(xiàng)目為例,介紹基于SSH項(xiàng)目的具體實(shí)現(xiàn)。
頁面提交請(qǐng)求,該請(qǐng)求交由Action處理,Action調(diào)用Service進(jìn)行業(yè)務(wù)邏輯處理,處理后調(diào)用Dao層服務(wù)實(shí)現(xiàn)數(shù)據(jù)的持久化。如圖3:
圖 3 增加項(xiàng)目的時(shí)序圖
SSH整合后的框架所用的配置文件主要有web.xml,struts.xml,applica-tionContext.xml,若干.hbm.xml文件如項(xiàng)目所用的Projec-t.hbm.xml等,類的設(shè)計(jì)包括Domain域模型層,業(yè)務(wù)邏輯層(Action層和Service層),持久層的設(shè)計(jì)。
首先在web.xml中加載pring2框架,在web中編寫如下內(nèi)容:<listener><listener-class>org.springframework.web.context.ContextLoaderLis-tener</listener-class></listener>
這樣在Web應(yīng)用啟動(dòng)時(shí)將加載Spring2框架,遇到html或者jsp請(qǐng)求,將通過struts2的偽Action過渡將請(qǐng)求轉(zhuǎn)發(fā)給Spring MVC處理。
完成了web.xml配置后,首先設(shè)計(jì)Domain域?qū)ο竽P?,并確定它們的關(guān)聯(lián)關(guān)系。可以借助Hibernate提供的DDL工具,自動(dòng)地生成域模型對(duì)象及對(duì)應(yīng)的.hbm.xml文件。以Project為例,生成的域?qū)ο笕缦拢?/p>
public class Project{
private Integer id; private String proName;
public String getProName() { return proName; }
public void setProName(String proName) { this.proName = proName;}
…… }
在生成域?qū)ο笸瑫r(shí),還生成了Project.hbm.xml,該文件也可以手動(dòng)配置。.hbm.xml文件的主要作用是實(shí)現(xiàn)實(shí)體類(域?qū)ο螅┡c數(shù)據(jù)庫表字段之間的相互映射。
域模型層設(shè)計(jì)好后,可以進(jìn)行業(yè)務(wù)邏輯層的設(shè)計(jì),該層主要設(shè)計(jì)Action層代碼和Service層代碼,所使用的配置文件有struts.xml,applicationCont-ext.xml。Action 層和 Service層代碼如下:
// Action層代碼
public class ProjectAction{
public String saveNewProject() {
if(this.projectService.saveNewProject(project)==true)
return Action.SUCCESS; else return Action.ERROR; }
…… }
// Service層代碼
public class ProjectService {
public boolean saveNewProject(Project project)
{ return (this.projectDao.saveNewProject(project)); }
…… }
struts.xml主要是將具體Action請(qǐng)求過渡給spring2處理,配置如下:
<struts><package name="onlineproject"extends="struts-default">
<action name="SaveNewProject"class="SaveNewProjectTemp"
method="saveNewProject">
<result name="success">/SaveSuccess.jsp</result>
<result name="error">/SaveError.jsp</result>
</action></package></struts>
由上面的配置,將通過class="SaveNewProjectTemp"偽Action過渡將請(qǐng)求轉(zhuǎn)由spring2處理。
applicationContext.xml實(shí)現(xiàn)Spring2對(duì)所有的Action管理和具體請(qǐng)求處理,另外還可以配置連接數(shù)據(jù)庫和連接池的相關(guān)參數(shù)。配置如下:
<bean id="SaveNewProjectTemp"
class="com.online.ui.action.ProjectAction"scope="prototype">
<property name="projectService" ref="projectService"/>
</bean>
<bean id="projectService" class="com.online.service.ProjectService">
<property name="projectDao"ref="projectDao" />
</bean>
<bean id="projectDao" class="com.online.dao.impl.ProjectHibernateDao">
<property name="sessionFactory"ref="mySessionFactory" />
</bean>
<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost/onlineproject" />
<property name="username" value="root" />
<property name="password" value="1" />
</bean>
……
由上面的配置,spring2通過bean id="SaveNewProjectTemp"實(shí)現(xiàn)struts2到spring2過渡,將struts2攔截的請(qǐng)求轉(zhuǎn)由某個(gè)具體的 Action 如 com.online.ui.action.ProjectAction 進(jìn)行業(yè)務(wù)邏輯的處理,在處理過程中注入屬性和對(duì)象。
最后進(jìn)行持久層設(shè)計(jì),DAO模式是持久層的標(biāo)準(zhǔn)模式。項(xiàng)目使用Dao層定義統(tǒng)一的接口,由Dao接口層實(shí)現(xiàn)具體的接口。以下是持久層代碼:
// Dao層代碼
public interface ProjectDao
{ public boolean saveNewProject(Project project); ……}
// Dao接口層代碼
public class ProjectHibernateDao extends HibernateDaoSupport implements ProjectDao {
public boolean saveNewProject(Project project){
try {this.getHibernateTemplate().save(project);return true;}
catch (Exception e) { e.printStackTrace();}return false;}
}
Spring2對(duì)Hibernate3進(jìn)行了很好的集成,HibernateTemplate提供了一系列的方法來實(shí)現(xiàn)數(shù)據(jù)庫表的增刪改查操作。通過在ProjectHibernateDao中注入HibernateTemplate,實(shí)現(xiàn)保存功能。
頁面設(shè)計(jì)使用jsp+struts2標(biāo)簽,增加項(xiàng)目所用的頁面有projectForm.jsp,SaveSuccess.jsp,SaveError.jsp。需要在頁面的開始引入<%@taglib uri="/struts-tags" prefix="s"%>。使用struts2標(biāo)簽,在表單提交的時(shí)候,可以自動(dòng)將各標(biāo)簽的屬性值映射為類的屬性值。
在線項(xiàng)目協(xié)作平臺(tái),使用了SSH技術(shù)架構(gòu),使系統(tǒng)的開發(fā)效率、擴(kuò)展性、重用性、易維護(hù)性得到提高。該軟件平臺(tái),有效的規(guī)范了軟件項(xiàng)目管理的流程,加強(qiáng)了員工之間的溝通與協(xié)作,為軟件企業(yè)提供了一個(gè)高效、方便的資源共享、動(dòng)態(tài)監(jiān)控、指導(dǎo)各軟件項(xiàng)目開發(fā)管理的信息化工作平臺(tái)。