[摘 要] 充分保證信息系統(tǒng)良好的可擴(kuò)展性,是企業(yè)級(jí)管理軟件開(kāi)發(fā)的重要原則。在對(duì)MVC模式的實(shí)現(xiàn)框架Struts本質(zhì)進(jìn)行分析的基礎(chǔ)上,采用UML系統(tǒng)分析和建模方法,設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)企業(yè)級(jí)的物資綜合管理系統(tǒng),并提出了使用Struts應(yīng)遵循的基本原則。該物資綜合管理系統(tǒng)不僅具有傳統(tǒng)的庫(kù)存管理功能,而且滿足了企業(yè)辦公業(yè)務(wù)自動(dòng)化的需要。Struts技術(shù)框架的引入,提高了軟件開(kāi)發(fā)效率,使系統(tǒng)結(jié)構(gòu)清晰,具有更好的業(yè)務(wù)可擴(kuò)展性和可維護(hù)性。
[關(guān)鍵詞] 物資綜合管理;Struts;UML;可擴(kuò)展性
[中圖分類(lèi)號(hào)]F270.7;TP311[文獻(xiàn)標(biāo)識(shí)碼]A[文章編號(hào)]1673-0194(2008)18-0074-04
隨著基于Web的Internet應(yīng)用進(jìn)一步普及,在企業(yè)信息化建設(shè)和深化過(guò)程中,基于B/S的計(jì)算機(jī)信息管理模式已成為主流。某企業(yè)傳統(tǒng)的基于C/S的物資管理系統(tǒng)由于該企業(yè)信息化二期網(wǎng)絡(luò)工程的完成、企業(yè)物資部門(mén)業(yè)務(wù)的擴(kuò)展以及對(duì)辦公自動(dòng)化的要求,已不能滿足企業(yè)的應(yīng)用需求。本系統(tǒng)設(shè)計(jì)以J2EE技術(shù)體系為基礎(chǔ),采用Struts框架,將用戶界面、業(yè)務(wù)過(guò)程和商業(yè)邏輯相分離,提高了系統(tǒng)的可擴(kuò)展性和組件復(fù)用的可能性,使企業(yè)能更加方便快捷地根據(jù)業(yè)務(wù)需要維護(hù)系統(tǒng)[1]。
1 Struts框架工作機(jī)制本質(zhì)分析
Struts框架通過(guò)利用JSP、JavaServlet、JavaBean和StrutsTaglib等技術(shù),在JSP Model 2的基礎(chǔ)上實(shí)現(xiàn)MVC模式,工作機(jī)制如圖1所示。
客戶(client)完成一個(gè)請(qǐng)求響應(yīng)活動(dòng)包括以下基本步驟:
(1)客戶通過(guò)Web瀏覽器或應(yīng)用程序客戶端發(fā)出請(qǐng)求;
(2)Web服務(wù)器將根據(jù)配置描述文件web.xml將請(qǐng)求發(fā)送給中央控制器ActionServlet,ActionServlet調(diào)用RequestProcessor實(shí)例,實(shí)例根據(jù)配置描述文件struts-config.xml提供的URI信息,將請(qǐng)求轉(zhuǎn)發(fā)給業(yè)務(wù)代理Action,不同的Action對(duì)象執(zhí)行相應(yīng)的應(yīng)用邏輯;如果Action對(duì)象不存在,ActionServlet會(huì)自動(dòng)創(chuàng)建這個(gè)Action對(duì)象[2];
(3)Action充當(dāng)用戶請(qǐng)求和商業(yè)邏輯處理之間的適配器,調(diào)用模型組件JavaBean或EJB,完成商業(yè)邏輯;
(4)當(dāng)Action處理完成應(yīng)用邏輯后,返回一個(gè)ActionForward對(duì)象,并將控制權(quán)返回給ActionServlet,ActionServlet通過(guò)返回值將處理結(jié)果轉(zhuǎn)發(fā)給指定的Web組件。
(5)ActionForward對(duì)象屬性值指向的JSP 組件利用Taglibs生成動(dòng)態(tài)視圖,返回給客戶,完成動(dòng)態(tài)響應(yīng)。
從以上的基本分析可以看出,中央控制器Action Servlet主要對(duì)請(qǐng)求轉(zhuǎn)發(fā)事件和系統(tǒng)內(nèi)部的請(qǐng)求重定向事件進(jìn)行監(jiān)聽(tīng),基于事件所產(chǎn)生的業(yè)務(wù)活動(dòng),通過(guò)業(yè)務(wù)代理Action對(duì)象的方法實(shí)現(xiàn),ActionForward對(duì)象封裝了轉(zhuǎn)發(fā)相應(yīng)URI和重定向相應(yīng)URI,這是Struts框架工作機(jī)制的本質(zhì)。ActionForm主要用于對(duì)來(lái)自于StrutsTaglib的表單數(shù)據(jù)的傳遞和驗(yàn)證,是Struts框架的定制類(lèi)。在開(kāi)發(fā)過(guò)程中,也可以選擇使用標(biāo)準(zhǔn)標(biāo)簽庫(kù)(JSTL)和自定義標(biāo)簽。
2 物資綜合管理系統(tǒng)的設(shè)計(jì)
2. 1系統(tǒng)的總體業(yè)務(wù)模塊設(shè)計(jì)
物資綜合管理系統(tǒng)分為6個(gè)業(yè)務(wù)模塊[3],每個(gè)模塊都有相應(yīng)的功能,三級(jí)結(jié)構(gòu)如圖2所示。
模塊設(shè)計(jì)按照實(shí)際業(yè)務(wù)流程的要求進(jìn)行。首先根據(jù)計(jì)劃管理選擇供應(yīng)商,簽訂合同,并進(jìn)行采購(gòu)過(guò)程的監(jiān)控;到貨后首先進(jìn)行驗(yàn)收,合格貨品進(jìn)入庫(kù)存管理。對(duì)于新貨品的編號(hào),在計(jì)劃管理模塊中由計(jì)劃員申請(qǐng)編碼。
計(jì)劃管理模塊子系統(tǒng)是系統(tǒng)的核心模塊之一。計(jì)劃員根據(jù)各單位的需求情況,制訂年、月和臨時(shí)計(jì)劃,并報(bào)批計(jì)劃,計(jì)劃管理子系統(tǒng)結(jié)構(gòu)模塊結(jié)構(gòu)如圖3所示。
這里以主管經(jīng)理處理計(jì)劃模塊為例,建立UML用例[4],如圖4所示。
活動(dòng)者:主管經(jīng)理
(1)前置條件:計(jì)劃員已上報(bào)計(jì)劃。
(2)主事件流:經(jīng)理在待批復(fù)計(jì)劃中選定某一計(jì)劃,并可查看該計(jì)劃詳細(xì)信息;選擇批復(fù),在頁(yè)面?zhèn)溥x項(xiàng)寫(xiě)入批復(fù)信息,提交,激活計(jì)劃員執(zhí)行狀態(tài),通知進(jìn)行采購(gòu)。
(3)備選事件流:選擇不批準(zhǔn),通知計(jì)劃員修改或重做計(jì)劃。報(bào)上級(jí)主管經(jīng)理待批復(fù),對(duì)已批復(fù)的計(jì)劃未執(zhí)行的可召回,重新批復(fù)。
(4)后置條件:計(jì)劃被批準(zhǔn),轉(zhuǎn)為采購(gòu)執(zhí)行。
2. 2根據(jù)MVC設(shè)計(jì)模式對(duì)系統(tǒng)進(jìn)行詳細(xì)設(shè)計(jì)
這里以計(jì)劃員上報(bào)臨時(shí)計(jì)劃和主管領(lǐng)導(dǎo)處理計(jì)劃的過(guò)程來(lái)說(shuō)明:
(1)數(shù)據(jù)表設(shè)計(jì)。上報(bào)的臨時(shí)計(jì)劃由主管經(jīng)理批準(zhǔn),因此建立臨時(shí)計(jì)劃數(shù)據(jù)表t_plan_base,其中用state字段表示計(jì)劃項(xiàng)的狀態(tài)(0:未上報(bào);1:已上報(bào);2:已批準(zhǔn);3:未批準(zhǔn))。
(2)商業(yè)邏輯model設(shè)計(jì)。在實(shí)際開(kāi)發(fā)過(guò)程中,各模塊在數(shù)據(jù)庫(kù)處理方面建立了統(tǒng)一的外部接口,在計(jì)劃管理模塊建立PlanManager接口,其中 boolean add(Bean f )為添加接口,其中f為對(duì)應(yīng)的數(shù)據(jù)表的bean;int modifyData(Bean f ,int state)為修改接口,state為被修改對(duì)象的狀態(tài);boolean delete(String id)為刪除接口,id為被刪除對(duì)象的標(biāo)識(shí);List select(Bean f )和List select()為兩種查詢接口,分別用于條件查詢和無(wú)條件查詢。
計(jì)劃員維護(hù)制訂計(jì)劃,建立DrawPlanManager,其中方法boolean add(PlanBean planlist)完成添加計(jì)劃,參數(shù)planlist為表t_plan_base對(duì)應(yīng)的bean;主管經(jīng)理處理計(jì)劃,建立DealwithPlanManager,其中方法int modifyData (PlanBean planlist,int state)完成計(jì)劃的審批。
int modifyData (PlanBean planlist,int state)的主要代碼如下:
int iState= 0;
String strSQL = \"update t_plan_base set state = ? where plan_id = ? \";
…//數(shù)據(jù)庫(kù)連接,獲得對(duì)象conn
try {
Prepared Statement stmt = conn.prepare Statement(strSQL);
stmt. setString(1,state);// 獲得state狀態(tài)值,并存入數(shù)據(jù)庫(kù)
stmt. setString(2,planlist.getPlanID());//獲得planID值
iState = stmt. executeUpdate();
LoggerFile. logFile(strSQL,\"\");
} catch (SQLException e){
try {
conn. rollback();
} catch (SQLException e1){
e1.printStackTrace();
} finally {…}
}
return iState;//0:改變不成功,1:改變成功
(3)視圖設(shè)計(jì)。計(jì)劃數(shù)據(jù)錄入由t_plans.jsp的表單完成,對(duì)應(yīng)的Temp Plan Form繼承org. apache. struts. action. ActionForm。
(4)控制器代理Action設(shè)計(jì)[5]。建立org. apache. struts.action. Action子類(lèi)TempPlanSubAction和DealWithPlanAction。當(dāng)計(jì)劃錄入完畢,可以由兩種選擇,①放入計(jì)劃草稿箱,Applied Item Action調(diào)用Draw Plan Manager的boolean add(PlanForm planlist)方法,并傳遞參數(shù)state=0;②上報(bào)計(jì)劃,此時(shí)state=1。
當(dāng)主管經(jīng)理進(jìn)入待批復(fù)計(jì)劃工作室,可以查看待批復(fù)計(jì)劃詳單,Deal with Plan Action可以調(diào)用DealwithPlanManager的int modifyData (PlanBean planlist,int state)方法完成待批復(fù)計(jì)劃的批準(zhǔn)(state=2)和不批準(zhǔn)操作或報(bào)上一級(jí)(state=3)。
TempPlanSubAction.java的主要代碼如下:
ActionErrors errors = new ActionErrors();
ActionForward forward = new ActionForward();
TempPlanForm tempPlanForm = (TempPlanForm) form;
PlanBean planlist=new PlanBean();
if (request. getParameter(\"draft\")!=1){//draft=\"存入草稿箱\"
planlist. setState(\"0\");
}
else {
planlist. setState(\"1\");
}
planlist. setPlanerID ( tempPlanForm. getPlanerID( ) );//設(shè)置計(jì)劃員I D
planlist. setPlaner(tempPlanForm. getPlaner());//設(shè)置計(jì)劃員名稱(chēng)
…,…//設(shè)置計(jì)劃項(xiàng)的其他屬性
DrawPlanManager drawPlanManager = new DrawPlanManager ()
if(drawPlanManager. add(planlist)){//保存計(jì)劃
forward=mapping.f indForward(\"jhymain\");
}else{
errors. add(\"tempplan\",new ActionError(\"tempplan. submmit.wrong\"));
saveErrors(request,errors);
firward=mapping. findForward(\"t_plans\");
}
return (forward);
在struts - config.xml配置描述文件中映射關(guān)系如下:
<global-forwards>
<forward name=\" jhymain \" path=\"/jhymain.jsp\" redirect=\"true\" />
<forward name=\" t_plans \" path=\"/t_plans.jsp\" redirect=\"true\" />
</global-forwards>
<form-bean name=\"tempPlanForm\" type=\"wz. forms.plan. TempPlanForm\" />
<action path=\"/tempPlan\" name=\"tempPlanForm\" validate=\"true\" input=\"/tp_design. jsp\" scope=\"session\" type=\"wz. actions. plan.TempPlanSubAction\">
</action>
2. 3系統(tǒng)中基礎(chǔ)信息管理的應(yīng)用
在各模塊中,不同角色需要同時(shí)調(diào)用大量的基礎(chǔ)信息,為此建立了部門(mén)信息DepartInfo、角色信息RolerInfo、物品基本信息GoodsType和庫(kù)房信息WareType等數(shù)據(jù)表和BasicInfManager類(lèi),在ServletContext范圍內(nèi)共享數(shù)據(jù),例如計(jì)劃員登錄后BasicInfAction.java 的主要代碼如下:
ArrayList departInfoList,goodsTypeList,wareTypeList;
ServletContext app=getServlet(). getServletConfig().getServletContext();
departInfoList =(ArrayList)app. getAttribute(\"departInfo\");
goodsTypeList =(ArrayList)app. getAttribute(\"goodsType\");
wareTypeList =(ArrayList)app. getAttribute(\"wareType\");
if(( departInfoList ==1)||( goodsTypeList ==1) ||( wareTypeList ==1)){
BasicInfManager basicInfManager=new BasicInfManager();
departInfoList= basicInfManager.initDepartInfo(); //獲得部門(mén)信息
goodsTypeList = basicInfManager.initGoodsType ();//物品基本信息
wareTypeList = basicInfManager.init WareType ();
app. setAttribute(\"departInfo\",departInfoList);
app. setAttribute(\"goodsType\",goodsTypeList);
app. setAttribute(\"wareType\",wareTypeList);
}
else{…}
3 基于Struts開(kāi)發(fā)應(yīng)遵循的基本原則
基于上述Struts的本質(zhì)分析及開(kāi)發(fā)實(shí)踐,提出以下設(shè)計(jì)時(shí)應(yīng)遵循的基本原則:
(1)JSP頁(yè)面避免直接轉(zhuǎn)發(fā),任何事件都應(yīng)受到Action Servlet的監(jiān)聽(tīng),對(duì)于無(wú)具體業(yè)務(wù)活動(dòng)的事件,可使用專(zhuān)門(mén)用于請(qǐng)求轉(zhuǎn)發(fā)的org. apache. struts.action. ForwardAction類(lèi)。
(2)ActionForm應(yīng)主要用于表單數(shù)據(jù)的傳遞,開(kāi)發(fā)者應(yīng)在模型層建立具有g(shù)etter、setter訪問(wèn)器的Bean,在控制層完成數(shù)據(jù)交換,并通過(guò)Web的共享數(shù)據(jù)機(jī)制完成數(shù)據(jù)傳遞。
(3)在數(shù)據(jù)共享過(guò)程中,應(yīng)減少利用session進(jìn)行數(shù)據(jù)傳遞,request范圍內(nèi)的共享數(shù)據(jù)有利于提高應(yīng)用系統(tǒng)的性能,減少系統(tǒng)資源開(kāi)銷(xiāo)。
只有遵循上述基本原則,才能真正體現(xiàn)Struts的開(kāi)發(fā)理念,雖然在開(kāi)發(fā)過(guò)程中會(huì)增加部分代碼的編寫(xiě)量,但有利于系統(tǒng)今后的技術(shù)擴(kuò)展和業(yè)務(wù)功能擴(kuò)展,并能充分發(fā)揮struts-config. xml配置描述文件的作用,提高應(yīng)用系統(tǒng)的可維護(hù)性。
4 結(jié) 論
本文描述了一個(gè)完全基于Struts框架的綜合物資管理系統(tǒng)的設(shè)計(jì),以及開(kāi)發(fā)過(guò)程中應(yīng)遵循的基本原則,體現(xiàn)Struts的開(kāi)發(fā)理念;系統(tǒng)在WebSphere Application Server 5.1下運(yùn)行良好,并具有較好的業(yè)務(wù)可擴(kuò)展性。另外,由于未使用對(duì)象持久化技術(shù),在開(kāi)發(fā)過(guò)程中對(duì)數(shù)據(jù)庫(kù)操作的效率不高,這將在今后進(jìn)一步加以完善。
主要參考文獻(xiàn)
[1] 黃丹霞,楊璐. 在J2EE項(xiàng)目中使用Struts對(duì)MVC模式的研究與實(shí)現(xiàn)[J]. 計(jì)算機(jī)工程與設(shè)計(jì),2005(9):122-125.
[2] 孫衛(wèi)琴. 精通Struts:基于MVC的Java Web的設(shè)計(jì)與開(kāi)發(fā)[M]. 北京:電子工業(yè)出版社,2004.
[3] 蘇曉玲. 淺談企業(yè)物資管理信息系統(tǒng)建設(shè)[J]. 中國(guó)電力教育,2006(6):75-77.
[4] 蔣慧,吳禮發(fā),陳衛(wèi)衛(wèi). UML設(shè)計(jì)核心技術(shù)[M]. 北京:北京希望電子出版社,2001.
[5] SUN Microsystems Inc. Java TM 2 Platform Enterprise Edition Specification [EB/OL]. http://java. sun. com/j2ee, 2002.