[摘 要] 充分保證信息系統良好的可擴展性,是企業級管理軟件開發的重要原則。在對MVC模式的實現框架Struts本質進行分析的基礎上,采用UML系統分析和建模方法,設計并實現了一個企業級的物資綜合管理系統,并提出了使用Struts應遵循的基本原則。該物資綜合管理系統不僅具有傳統的庫存管理功能,而且滿足了企業辦公業務自動化的需要。Struts技術框架的引入,提高了軟件開發效率,使系統結構清晰,具有更好的業務可擴展性和可維護性。
[關鍵詞] 物資綜合管理;Struts;UML;可擴展性
[中圖分類號]F270.7;TP311[文獻標識碼]A[文章編號]1673-0194(2008)18-0074-04
隨著基于Web的Internet應用進一步普及,在企業信息化建設和深化過程中,基于B/S的計算機信息管理模式已成為主流。某企業傳統的基于C/S的物資管理系統由于該企業信息化二期網絡工程的完成、企業物資部門業務的擴展以及對辦公自動化的要求,已不能滿足企業的應用需求。本系統設計以J2EE技術體系為基礎,采用Struts框架,將用戶界面、業務過程和商業邏輯相分離,提高了系統的可擴展性和組件復用的可能性,使企業能更加方便快捷地根據業務需要維護系統[1]。
1 Struts框架工作機制本質分析
Struts框架通過利用JSP、JavaServlet、JavaBean和StrutsTaglib等技術,在JSP Model 2的基礎上實現MVC模式,工作機制如圖1所示。
客戶(client)完成一個請求響應活動包括以下基本步驟:
(1)客戶通過Web瀏覽器或應用程序客戶端發出請求;
(2)Web服務器將根據配置描述文件web.xml將請求發送給中央控制器ActionServlet,ActionServlet調用RequestProcessor實例,實例根據配置描述文件struts-config.xml提供的URI信息,將請求轉發給業務代理Action,不同的Action對象執行相應的應用邏輯;如果Action對象不存在,ActionServlet會自動創建這個Action對象[2];

(3)Action充當用戶請求和商業邏輯處理之間的適配器,調用模型組件JavaBean或EJB,完成商業邏輯;
(4)當Action處理完成應用邏輯后,返回一個ActionForward對象,并將控制權返回給ActionServlet,ActionServlet通過返回值將處理結果轉發給指定的Web組件。
(5)ActionForward對象屬性值指向的JSP 組件利用Taglibs生成動態視圖,返回給客戶,完成動態響應。
從以上的基本分析可以看出,中央控制器Action Servlet主要對請求轉發事件和系統內部的請求重定向事件進行監聽,基于事件所產生的業務活動,通過業務代理Action對象的方法實現,ActionForward對象封裝了轉發相應URI和重定向相應URI,這是Struts框架工作機制的本質。ActionForm主要用于對來自于StrutsTaglib的表單數據的傳遞和驗證,是Struts框架的定制類。在開發過程中,也可以選擇使用標準標簽庫(JSTL)和自定義標簽。
2 物資綜合管理系統的設計
2. 1系統的總體業務模塊設計
物資綜合管理系統分為6個業務模塊[3],每個模塊都有相應的功能,三級結構如圖2所示。

模塊設計按照實際業務流程的要求進行。首先根據計劃管理選擇供應商,簽訂合同,并進行采購過程的監控;到貨后首先進行驗收,合格貨品進入庫存管理。對于新貨品的編號,在計劃管理模塊中由計劃員申請編碼。
計劃管理模塊子系統是系統的核心模塊之一。計劃員根據各單位的需求情況,制訂年、月和臨時計劃,并報批計劃,計劃管理子系統結構模塊結構如圖3所示。

這里以主管經理處理計劃模塊為例,建立UML用例[4],如圖4所示。

活動者:主管經理
(1)前置條件:計劃員已上報計劃。
(2)主事件流:經理在待批復計劃中選定某一計劃,并可查看該計劃詳細信息;選擇批復,在頁面備選項寫入批復信息,提交,激活計劃員執行狀態,通知進行采購。
(3)備選事件流:選擇不批準,通知計劃員修改或重做計劃。報上級主管經理待批復,對已批復的計劃未執行的可召回,重新批復。
(4)后置條件:計劃被批準,轉為采購執行。
2. 2根據MVC設計模式對系統進行詳細設計
這里以計劃員上報臨時計劃和主管領導處理計劃的過程來說明:
(1)數據表設計。上報的臨時計劃由主管經理批準,因此建立臨時計劃數據表t_plan_base,其中用state字段表示計劃項的狀態(0:未上報;1:已上報;2:已批準;3:未批準)。
(2)商業邏輯model設計。在實際開發過程中,各模塊在數據庫處理方面建立了統一的外部接口,在計劃管理模塊建立PlanManager接口,其中 boolean add(Bean f )為添加接口,其中f為對應的數據表的bean;int modifyData(Bean f ,int state)為修改接口,state為被修改對象的狀態;boolean delete(String id)為刪除接口,id為被刪除對象的標識;List select(Bean f )和List select()為兩種查詢接口,分別用于條件查詢和無條件查詢。
計劃員維護制訂計劃,建立DrawPlanManager,其中方法boolean add(PlanBean planlist)完成添加計劃,參數planlist為表t_plan_base對應的bean;主管經理處理計劃,建立DealwithPlanManager,其中方法int modifyData (PlanBean planlist,int state)完成計劃的審批。
int modifyData (PlanBean planlist,int state)的主要代碼如下:
int iState= 0;
String strSQL = \"update t_plan_base set state = ? where plan_id = ? \";
…//數據庫連接,獲得對象conn
try {
Prepared Statement stmt = conn.prepare Statement(strSQL);
stmt. setString(1,state);// 獲得state狀態值,并存入數據庫
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)視圖設計。計劃數據錄入由t_plans.jsp的表單完成,對應的Temp Plan Form繼承org. apache. struts. action. ActionForm。
(4)控制器代理Action設計[5]。建立org. apache. struts.action. Action子類TempPlanSubAction和DealWithPlanAction。當計劃錄入完畢,可以由兩種選擇,①放入計劃草稿箱,Applied Item Action調用Draw Plan Manager的boolean add(PlanForm planlist)方法,并傳遞參數state=0;②上報計劃,此時state=1。
當主管經理進入待批復計劃工作室,可以查看待批復計劃詳單,Deal with Plan Action可以調用DealwithPlanManager的int modifyData (PlanBean planlist,int state)方法完成待批復計劃的批準(state=2)和不批準操作或報上一級(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( ) );//設置計劃員I D
planlist. setPlaner(tempPlanForm. getPlaner());//設置計劃員名稱
…,…//設置計劃項的其他屬性
DrawPlanManager drawPlanManager = new DrawPlanManager ()
if(drawPlanManager. add(planlist)){//保存計劃
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配置描述文件中映射關系如下:
<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系統中基礎信息管理的應用
在各模塊中,不同角色需要同時調用大量的基礎信息,為此建立了部門信息DepartInfo、角色信息RolerInfo、物品基本信息GoodsType和庫房信息WareType等數據表和BasicInfManager類,在ServletContext范圍內共享數據,例如計劃員登錄后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(); //獲得部門信息
goodsTypeList = basicInfManager.initGoodsType ();//物品基本信息
wareTypeList = basicInfManager.init WareType ();
app. setAttribute(\"departInfo\",departInfoList);
app. setAttribute(\"goodsType\",goodsTypeList);
app. setAttribute(\"wareType\",wareTypeList);
}
else{…}
3 基于Struts開發應遵循的基本原則
基于上述Struts的本質分析及開發實踐,提出以下設計時應遵循的基本原則:
(1)JSP頁面避免直接轉發,任何事件都應受到Action Servlet的監聽,對于無具體業務活動的事件,可使用專門用于請求轉發的org. apache. struts.action. ForwardAction類。
(2)ActionForm應主要用于表單數據的傳遞,開發者應在模型層建立具有getter、setter訪問器的Bean,在控制層完成數據交換,并通過Web的共享數據機制完成數據傳遞。
(3)在數據共享過程中,應減少利用session進行數據傳遞,request范圍內的共享數據有利于提高應用系統的性能,減少系統資源開銷。
只有遵循上述基本原則,才能真正體現Struts的開發理念,雖然在開發過程中會增加部分代碼的編寫量,但有利于系統今后的技術擴展和業務功能擴展,并能充分發揮struts-config. xml配置描述文件的作用,提高應用系統的可維護性。
4 結 論
本文描述了一個完全基于Struts框架的綜合物資管理系統的設計,以及開發過程中應遵循的基本原則,體現Struts的開發理念;系統在WebSphere Application Server 5.1下運行良好,并具有較好的業務可擴展性。另外,由于未使用對象持久化技術,在開發過程中對數據庫操作的效率不高,這將在今后進一步加以完善。
主要參考文獻
[1] 黃丹霞,楊璐. 在J2EE項目中使用Struts對MVC模式的研究與實現[J]. 計算機工程與設計,2005(9):122-125.
[2] 孫衛琴. 精通Struts:基于MVC的Java Web的設計與開發[M]. 北京:電子工業出版社,2004.
[3] 蘇曉玲. 淺談企業物資管理信息系統建設[J]. 中國電力教育,2006(6):75-77.
[4] 蔣慧,吳禮發,陳衛衛. UML設計核心技術[M]. 北京:北京希望電子出版社,2001.
[5] SUN Microsystems Inc. Java TM 2 Platform Enterprise Edition Specification [EB/OL]. http://java. sun. com/j2ee, 2002.