張 博
(亳州職業(yè)技術學院計算機系, 安徽 亳州 236800)
J2EE架構(gòu)是當前主流的架構(gòu)之一,企業(yè)采用J2EE架構(gòu)作為解決方案已經(jīng)成為業(yè)界的發(fā)展趨勢.J2EE體系結(jié)構(gòu)提供中間層框架,可以滿足高可用性、高可靠性以及可擴展性的應用需求.通過提供統(tǒng)一的開發(fā)平臺,J2EE降低了開發(fā)多層應用的費用和復雜性,同時提供了對現(xiàn)有應用程序集成的強有力支持,具備良好的部署應用,為用戶提供了統(tǒng)一安全模型和靈活的事務處理控制.在J2EE應用中,Struts是一種非常優(yōu)秀的MVC應用框架.如何開發(fā)出層次分明、結(jié)構(gòu)清晰、可復用性的系統(tǒng),是當前企業(yè)級開發(fā)的主要目標.Struts框架給我們實現(xiàn)這樣的目標提供了一個很好的機會.
亳州地處安徽北部,氣候和土壤適宜中藥材的生長,自古以來就有中藥材種植和交易的歷史,交易量居全國四大藥都之首,被譽為“中華藥都”.亳州建有全國最大的中藥材交易中心,年成交額100億元以上,交易輻射全國30個省、市、自治區(qū).在亳州已經(jīng)取得GMP認證的中藥企業(yè)已達到40余家,成為了全國最大的中藥飲片生產(chǎn)基地,取得《藥品經(jīng)營許可證》的企業(yè)860余家,其中通過GSP認證的703家,直接從業(yè)人員達15萬之眾,基本涉及中藥的種植、生產(chǎn)、加工、銷售各領域.
由于中藥材的保存時間、藥物效果、對環(huán)境的要求等特殊特點,同時藥材的品種不同,國家對中藥材、成藥的管理要求不同,因此和一般的商品相比較,對中藥材的庫存、流通和運輸提出了更高的要求,其中庫存又成為中藥企業(yè)在生產(chǎn)過程中提高企業(yè)生產(chǎn)效率和控制藥材損耗至關重要的環(huán)節(jié).
通過對中國(亳州)中藥材交易中心、華佗國藥廠、新興飲片廠等8家中藥材相關企業(yè)的調(diào)查后發(fā)現(xiàn),雖然大部分企業(yè)都使用了計算機進行庫存管理,但是采用的方案都是市場上通用的進銷存系統(tǒng),這些通用系統(tǒng)雖然可以提高企業(yè)統(tǒng)計人員填寫報表的速度,卻沒有針對中藥企業(yè)的生產(chǎn)特點和管理模式進行優(yōu)化,無法完全實現(xiàn)對藥材的分類管理、倉儲狀態(tài)監(jiān)測、出入庫管理、網(wǎng)絡在線查詢等功能.
而由SUN公司提出的J2EE(Java2 Platform Enterprise Edition)架構(gòu),通過服務器組件的形式,將系統(tǒng)部件進行封裝,提高了程序的重用性、擴展性和安全性,降低了開發(fā)過程中的成本,提高了系統(tǒng)的穩(wěn)定性和可移植性,具有廣泛的開發(fā)前景.
本文就如何利用基于Struts技術的J2EE平臺,構(gòu)建高效的中藥庫存管理系統(tǒng)進行了積極的嘗試.
Struts實際上是基于JSP Model 2模式下的一種MVC框架.Struts的目標是希望分離Web程序的表示層、控制層和功能層,使程序員有更多的精力投入到后臺的業(yè)務邏輯設計中去.
和其它的Java架構(gòu)一樣,Struts也是面向?qū)ο笤O計,它將MVC模式分離為顯示邏輯和業(yè)務邏輯兩部分.在Structs 框架中,模型由Javabeans或者EJB組件擔當,控制器由Action和Actionservlet實現(xiàn)主要功能,視圖由JSP文件組成.圖1為Struts框架的實現(xiàn)原理圖.
圖 1 Struts框架原理圖 圖2 中藥材庫存管理系統(tǒng)的模型架構(gòu)
Struts框架使開發(fā)者在構(gòu)建基于Java Servlet和JSP技術的Web應用時更加容易,為開發(fā)者提供了一個統(tǒng)一的標準框架.通過使用Struts作為基礎,開發(fā)者能夠更專注于應用程序的業(yè)務邏輯實現(xiàn).具體來講,Struts的優(yōu)點有:
(1) Struts和Tomcat、Turbine等諸多Apache項目都屬于是開源軟件,這是它的一大優(yōu)點,使開發(fā)者能更深入地了解其內(nèi)部實現(xiàn)機制和聯(lián)系.
(2)有豐富的Taglib可以使用.Struts的標記庫Taglib,如能靈活運用,則能大大提高開發(fā)效率.
(3)頁面導航.頁面導航將是以后的重點發(fā)展方向,通過頁面導航使得系統(tǒng)的實現(xiàn)邏輯更加清晰.
在Struts框架中,模型包含了業(yè)務實體和業(yè)務規(guī)則,同時負責訪問持久化數(shù)據(jù),所以在系統(tǒng)中要保持模型的相對獨立性,將模型組件集中在一起,這樣可以大大提高組件的可重用性.在中藥材庫存管理系統(tǒng)中,采用Model 2模型的實現(xiàn)原理,其模型架構(gòu)如圖2所示.
業(yè)務處理的流程如下:
(1)用戶通過JSP頁面,將表單數(shù)據(jù)提交到Servlet類.
(2)Servlet類從表單中獲得數(shù)據(jù).
(3)Servlet類通過從request中獲得的表單數(shù)據(jù),調(diào)用不同的業(yè)務邏輯JavaBean.
(4)JavaBean處理完業(yè)務邏輯后調(diào)用DAO數(shù)據(jù)庫接口與中藥材數(shù)據(jù)庫進行數(shù)據(jù)交互.
(5)DAO通過數(shù)據(jù)傳輸類(DTO)把從數(shù)據(jù)庫獲得的數(shù)據(jù)返回給JavaBean,再傳送給Servlet,最后由JSP頁面將更新的數(shù)據(jù)顯示給用戶.
業(yè)務實體在系統(tǒng)中表現(xiàn)為實體域的對象,在數(shù)據(jù)庫中表現(xiàn)為關系數(shù)據(jù).在進行數(shù)據(jù)庫開發(fā)的準備工作中需要將中藥材的類別確定下來.參考《中國藥典》2005版中藥材分類方法,結(jié)合亳州藥材市場的常見藥材種類,在本系統(tǒng)中,將藥材分為3大類:
(1)植物類藥材:主要包括根莖類、果實子仁類、全草類、菌藻類四小類,如圖3所示.
圖3 植物類藥材
(2)動物類藥材.
(3)其他(礦石)類.
根據(jù)以上的分類方法,建立中藥材數(shù)據(jù)庫的分類表如表1~表6所示.
表1 根莖類索引表
表2 果實子仁類索引表
表3 全草類索引表
表4 菌藻類索引表
表5 動物類索引表
表6 其他(礦石)類索引表
在中藥材庫存管理系統(tǒng)中,業(yè)務實體包括:用戶賬號(Account)、客戶賬號、藥材入庫單(Storage invoices)、藥材出庫單(OutStock invoices)、藥材訂單(Herbal Order)、庫存藥材(Stock Herbal).
本系統(tǒng)主要完成藥材庫庫存的相關功能,包括生成入(出)庫單、庫存藥材清單、完善的數(shù)據(jù)匯總功能、藥材查詢功能及數(shù)據(jù)庫的維護功能.在上述實體關系圖的分析基礎上,需要進行具體數(shù)據(jù)分析和網(wǎng)絡數(shù)據(jù)庫查詢的設計.為完成這些功能,設計了如下模塊:
(1)用戶認證模塊,完成系統(tǒng)安全檢查維護和用戶授權工作. 用戶輸入用戶名和密碼,提交給后臺服務器進行驗證,通過與用戶表中的數(shù)據(jù)進行比對,允許合法用戶登錄成功;否則給出出錯處理.
(2)入庫、出庫模塊,進行藥材入(出)庫操作.入庫時,收集入庫信息,包括入庫的藥材種類、產(chǎn)地、規(guī)格、數(shù)量等信息,分別導入數(shù)據(jù)庫中的不同表中,同時打印入庫單.出庫時,用戶首先進行庫存藥材的查詢,獲得當前庫存情況.然后,輸入準備出庫藥材的數(shù)據(jù),與數(shù)據(jù)庫中的相關表中數(shù)據(jù)進行比對,如滿足藥材出庫條件則允許出庫,并打印出庫單.
圖4 系統(tǒng)功能圖
(3)查詢模塊,實現(xiàn)比較完善的庫存藥材查詢功能. 用戶可以輸入藥材的種類、產(chǎn)地、規(guī)格、批次,了解實時的庫存情況,同時輸入時間段條件,能夠獲得相應的入出庫操作明細表.
(4)統(tǒng)計模塊,結(jié)合設計情況,進行庫存數(shù)據(jù)的統(tǒng)計. 用戶輸入需要統(tǒng)計的時間段、藥材種類、產(chǎn)地等條件,系統(tǒng)可以統(tǒng)計出本時間段的入庫表、出庫表、實時庫存等數(shù)據(jù).
(5) 數(shù)據(jù)維護模塊,維護系統(tǒng)數(shù)據(jù),進行數(shù)據(jù)備份、數(shù)據(jù)導入/ 導出和數(shù)據(jù)恢復功能. 在用戶誤操作或者是其他原因?qū)е孪到y(tǒng)崩潰的時候,能夠進行數(shù)據(jù)的恢復,同時定期進行數(shù)據(jù)備份,允許用戶在權限范圍內(nèi)進行數(shù)據(jù)的的導入/導出工作.
本系統(tǒng)的功能實現(xiàn)圖如圖4所示.
在struts-config.xml中有代碼1:
path=“stock/LoginForm” type=“org.herblstock.web.struts.action.DoNothingAction” validate=“false”
這個Action沒有name屬性,也就是它沒有與之相關聯(lián)的ActionForm.它的作用就是將請求轉(zhuǎn)發(fā)到/WEB-INF/jsp/struts/LoginForm.jsp頁面上.處理登錄操作的功能由LoginAction來完成.
該模塊主要實現(xiàn)中藥材的入庫操作.模塊的輸入項主要包括:登藥材的編號、名稱、類別、數(shù)量、所屬公司、入庫的時間等.當用戶輸入數(shù)據(jù)后,系統(tǒng)將數(shù)據(jù)讀入數(shù)據(jù)庫中,同時將入庫信息添加到入庫信息表中,并更新庫存表中的數(shù)據(jù).
出庫模塊主要實現(xiàn)中藥材的出庫操作.當用戶進行出庫操作前,首先要了解當前的庫存情況,因此在本系統(tǒng)中增加了一個當前庫存狀態(tài)的查詢功能.在輸入出庫的藥材名稱、發(fā)送公司和規(guī)格后就可以查看所查詢的藥材實時庫存情況.
當滿足出庫條件的時候,打印出庫單,同時更新出庫數(shù)據(jù)表;若不滿足出庫條件,則要求用戶更改出庫訂單.
查詢模塊包括出入庫數(shù)據(jù)、藥材庫存數(shù)據(jù)統(tǒng)計的查詢.
查詢功能頁面提供4個可選擇方法:按藥材分類查詢、按藥材產(chǎn)地查詢、按藥材屬性查詢、按客戶類別查詢.用戶選擇自己想要進入的頁面即可.這里以按藥材屬性查詢?yōu)槔榻B一下查詢過程的具體實現(xiàn).
按藥材屬性查詢的界面提供藥材分類目錄.目錄的每個節(jié)點顯示藥材名稱和類別,用戶點擊節(jié)點,將顯示該類藥材下的具體規(guī)格.
本模塊主要是采用SQL查詢語言進行編程,通過查詢模塊可以隨時查到當前選中的藥材在倉庫內(nèi)的庫存情況以及相關報表,本系統(tǒng)使用WebLogic Server的JDBC實現(xiàn)數(shù)據(jù)庫操作.
JDBC對數(shù)據(jù)庫的訪問分為3個方面:一是通過JDBC將數(shù)據(jù)存儲在數(shù)據(jù)庫中,二是使用JDBC更新數(shù)據(jù)庫中的數(shù)據(jù);三是使用JDBC查詢數(shù)據(jù)庫中的數(shù)據(jù).
在這里,以使用JDBC查詢數(shù)據(jù)為例討論JDBC數(shù)據(jù)庫的訪問.
在WebLogic Server中,使用JDBC查詢數(shù)據(jù)的過程分為5步,如下:
(1)建立數(shù)據(jù)庫連接.創(chuàng)建一個新的數(shù)據(jù)庫連接,實現(xiàn)過程如代碼2所示:
Connection myConn=null;
Try{
Context ctx=new initialContext();
Javax.sql.DataSource ds
=(javax.sql.DataSource)
Ctx.lookup(“example-dataSource-demopool”);
Java.sql.Connection myConn=ds.getConnection();
} Catch(SQL Exception sqle) {
}
這段代碼首先查詢WebLogic Server的JDBC服務,找到訪問的數(shù)據(jù)源,然后創(chuàng)建一個java.sql.Connection類的實例,把ds.getConnection()方法返回的對象賦值給它.通過使用WebLogic Server定義的DataSource對象作為參數(shù),調(diào)用getConnection()方法,可以獲得數(shù)據(jù)庫的配置信息.
(2)對數(shù)據(jù)庫進行查詢操作.Statement對象用于將SQL語句發(fā)送到數(shù)據(jù)庫中,對數(shù)據(jù)庫的查詢操作由java.sql.Statement類完成.
首先,利用Connection類的createStatement()方法,創(chuàng)建Statement類的實例.代碼如下:
Statement stmt=Con.createStatement();
這個代碼將創(chuàng)建一個當前Statement對象實例:
Stmt.execute(“SELECT *FROM 數(shù)據(jù)庫表名”);
ResultSet rs=stmt.getResultSet(); //返回查詢結(jié)果
(3)讀取查詢結(jié)果. 調(diào)用ResultSet類的方法,讀取其中的數(shù)據(jù).ResultSet對象具有指向當前數(shù)據(jù)行的光標,光標會定位到第一個數(shù)據(jù)行的前面.Next()方法是將光標移動到下一行,當ResultSet對象到達整個數(shù)據(jù)表的最后一行時Next()方法返回false值,因此可以實現(xiàn)掃描整個查詢結(jié)果.
(4)處理查詢結(jié)果.
(5)釋放數(shù)據(jù)庫.查詢結(jié)束之后,釋放Statement 和Connection對象.
在系統(tǒng)開發(fā)時,庫存統(tǒng)計一般采用兩種方法.一種是在數(shù)據(jù)庫中建立庫存表,當用戶需要查詢庫存時,直接從數(shù)據(jù)庫表中提取相應的信息,這種方法需要在每次入出庫操作后立即更新庫存表.另一種方法是不建立庫存表,在用戶需要查詢時,立即在相對應的出入庫記錄中重新統(tǒng)計出結(jié)果.與第一種方法相比,這種方法不存在冗余的數(shù)據(jù)庫表,雖然在統(tǒng)計時產(chǎn)生統(tǒng)計數(shù)據(jù),但能夠做到統(tǒng)計數(shù)據(jù)的準確及時.
本系統(tǒng)采用第二種方式進行庫存藥材的統(tǒng)計,這樣可以保證庫存藥材的實時更新,庫存統(tǒng)計時要涉及到庫存匯總表、各種出入庫表等.用戶只要輸入時間段、需要統(tǒng)計的庫存藥材、藥材產(chǎn)地等系統(tǒng)就能統(tǒng)計出相應的上期庫存、本期入庫數(shù)據(jù)、本期出庫數(shù)據(jù)、當前庫存數(shù)據(jù)等.
本文討論了基于Struts架構(gòu)的中藥庫存管理系統(tǒng)的開發(fā)原理,深入闡述了基于J2EE平臺的中藥材庫存管理系統(tǒng)的構(gòu)建原理.對于建立在Struts架構(gòu)下的具體實現(xiàn)方法進行了很好的嘗試.在系統(tǒng)實現(xiàn)的過程中,將J2EE技術與本地的行業(yè)應用相結(jié)合,在中藥材庫存管理的應用中取得了很好的效果.
由于接觸J2EE平臺的應用時間不長以及自己的經(jīng)驗不足,本系統(tǒng)還存在著一些不足之處.例如對中藥材的倉儲細化方面的處理還不夠準確,受現(xiàn)階段研究條件和水平的限制,庫存環(huán)境溫度的自動化檢測還不能很好實現(xiàn)等,這些都需要在今后的工作中進一步完善,同時要加強和本地的藥材生產(chǎn)企業(yè)合作,改進系統(tǒng)的不足.
參考文獻
[1]邱 哲,王俊標,馬 斗. Struts Web設計與開發(fā)大全[M]. 北京: 清華大學出版社,2005.
[2]詹 森(Johnson,R), 赫 魯(Hoeller.J).Expert one-on-one J2EE Development without EJB 中文版[M].北京:電子工業(yè)出版社,2005.
[3]阿 盧(Alur,Deepak).J2EE核心模式[M].北京:機械工業(yè)出版社,2005.
[4]楊中科.J2EE開發(fā)全程實錄[M].北京:清華大學出版社, 2007.
[5]羅玉玲,封朋成,梁曉揚,等. J2EE應用開發(fā)詳解[M]. 北京: 電子工業(yè)出版社,2009.
[6]張 博. 基于Struts的中藥材庫存管理系統(tǒng)的應用研究[D]. 上海:華東師范大學碩士學位論文,2007.
[7]張國梁. 基于Struts和Hibernate的J2EE Web應用的研究與實現(xiàn)[D]. 上海:華東師范大學碩士學位論,2007.
[8]Struts,an open-source MVC implementation[EB/OL]. http://www.ibm. com/developer works/library/j-struts/,F(xiàn)eb 2001.
[9]Struts,MVC 的一種開放源碼實現(xiàn)[EB/OL]. http://www. ibm. com/ developerworks/cn/java/j-struts/,2001.