




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、【最新卓越管理方案您可自由編輯】(醫(yī)療營(yíng)銷)醫(yī)藥銷售管理系統(tǒng)軟件說(shuō)明書2020年5月多年的企業(yè)咨洵顧問(wèn)屋儂,經(jīng)過(guò)實(shí)戰(zhàn)驗(yàn)證可以落地執(zhí)i亍的卓越管理方窠,值得您下我擁有醫(yī)藥銷售管理系統(tǒng)1 系統(tǒng)分析31.1 開(kāi)發(fā)背景31.2 需求分析32系統(tǒng)設(shè)計(jì)32.1 系統(tǒng)目標(biāo)32.2 系統(tǒng)功能結(jié)構(gòu)42.3 系統(tǒng)流程圖43軟件架構(gòu)63.1 邏輯分層結(jié)構(gòu)設(shè)計(jì)63.2 系統(tǒng)文件夾組織結(jié)構(gòu)73.3 實(shí)體對(duì)象設(shè)計(jì)73.4 定義ActionForm83.5 持久層結(jié)構(gòu)設(shè)計(jì)83.6 業(yè)務(wù)層結(jié)構(gòu)設(shè)計(jì)103.7 頁(yè)面結(jié)構(gòu)設(shè)計(jì)114配置文件114.1 酉己置web.xml114.2 酉己置struts-config.xml124.
2、3 酉己置hibernate.cfg.xml125實(shí)體及映射125.1藥品實(shí)體映射125.2 藥品類別實(shí)體映射135.3 銷售明細(xì)實(shí)體映射135.4 用戶實(shí)體映射146公共類設(shè)計(jì)146.1 Hibernate過(guò)濾器146.2 SupperDao類166.3 BaseAction類176.4 DeleteAction類186.5 字符串工具類187國(guó)際化187.1 國(guó)際化資源文件187.2 國(guó)際化實(shí)現(xiàn)198系統(tǒng)登陸模塊198.1 查詢用戶198.2 登陸請(qǐng)求198.3 登錄頁(yè)面199藥品類別信息管理209.1 藥品類別持久層設(shè)計(jì)209.2 藥品類別的添加219.2.1類別添加、修改請(qǐng)求處理 21
3、9.2.2類別添加頁(yè)面219.3 分頁(yè)查看類別信息219.3.1 查詢與刪除請(qǐng)求處理229.3.2 類別信息列表頁(yè)面229.4 類別的修改與刪除229.5 藥品類別統(tǒng)計(jì)229.5.1 JFreeChat工具類239.5.2 Action請(qǐng)求239.5.3 顯示報(bào)表2310藥品信息管理2310.1 藥品對(duì)象持久層設(shè)計(jì)2410.2 藥品信息的添加與修改2410.2.1 藥品添加的請(qǐng)求處理2410.2.2 藥品添加頁(yè)面2510.3 分頁(yè)查看所有藥品2510.4 查看藥品詳細(xì)信息2510.5 模糊查詢藥品2610.5.1 藥品模糊查詢請(qǐng)求處理2610.5.2 藥品模糊查詢頁(yè)面2610.6 高級(jí)查詢27
4、10.8 藥品批量刪除2710.8.1 批量刪除請(qǐng)求處理2810.8.2 映射JSP頁(yè)面中的按鈕2811購(gòu)買藥品2811.1 選購(gòu)藥品2811.2 結(jié)賬2912銷售管理2912.1 明細(xì)信息查詢2912.2 銷售排行統(tǒng)計(jì)3013進(jìn)貨/需求管理3014系統(tǒng)管理3114.1 添加管理員3114.2 修改密碼3214.3 系統(tǒng)初始化3215運(yùn)行項(xiàng)目321系統(tǒng)分析隨著計(jì)計(jì)算機(jī)技術(shù)的不斷發(fā)展,應(yīng)用軟件迅速普及,大到廠礦校企,小到圖書、餐飲、醫(yī)藥管理等,隨處都可看到它的身影。在以往依靠人工為主的醫(yī)藥銷售管理方面,計(jì)算機(jī)和計(jì)算機(jī)系統(tǒng)逐步唱起了主角,憑借省時(shí)、省力、低誤差等優(yōu)點(diǎn),從根本上改變了醫(yī)藥管理的傳統(tǒng)模
5、式,節(jié)省了物理資源,提高了工作效率。1.1 開(kāi)發(fā)背景XX醫(yī)藥抄手坐落于XX小區(qū)內(nèi),多年來(lái)本著經(jīng)濟(jì)、實(shí)惠、高質(zhì)量服務(wù)的宗旨,贏得了小區(qū)百姓的信賴,藥品供應(yīng)量非常大。面對(duì)龐大的信息量,經(jīng)常出現(xiàn)統(tǒng)計(jì)失誤、藥量供應(yīng)不足的情況,醫(yī)藥超市經(jīng)理決定使用一套合理、有效、使用的管理系統(tǒng),對(duì)醫(yī)藥超市進(jìn)行統(tǒng)一的管理。筆者受醫(yī)藥超市經(jīng)理委托,開(kāi)發(fā)一個(gè)醫(yī)藥銷售管理系統(tǒng),其宗旨是實(shí)現(xiàn)醫(yī)藥超市管理的系統(tǒng)化、規(guī)范化、實(shí)用化,對(duì)藥品進(jìn)行統(tǒng)一管理。1.2 需求分析在日常醫(yī)藥管理中,面對(duì)眾多的藥品和眾多不同需求的顧客,每天都會(huì)產(chǎn)生大量的數(shù)據(jù)信息。以傳統(tǒng)的手工方式來(lái)處理這些信息,操作比較繁瑣,且效率低下。此時(shí),一套合理、有效、實(shí)用的
6、醫(yī)藥銷售管理系統(tǒng)就顯得十分必要。利用其提供的藥品查詢、統(tǒng)計(jì)功能,可以進(jìn)行高效的管理,更好地為顧客服務(wù)。筆者通過(guò)對(duì)醫(yī)藥超市的實(shí)地考察,從經(jīng)營(yíng)者和消費(fèi)者的角度出發(fā),以高效管理、快速滿足消費(fèi)者為原則,要求本系統(tǒng)具有以下特點(diǎn)。具有良好的系統(tǒng)性能、友好的用戶界面。較高的處理效率,便于用戶使用。采用成熟的技術(shù)開(kāi)發(fā),全系統(tǒng)具有較高的技術(shù)水平和較長(zhǎng)的生命周期。對(duì)銷售信息進(jìn)行統(tǒng)計(jì)排行盡可能地簡(jiǎn)化藥品管理員的重復(fù)工作,提高工作效率。2系統(tǒng)設(shè)計(jì)2.1 系統(tǒng)目標(biāo)根據(jù)醫(yī)藥超市的管理要求,指定醫(yī)藥銷售管理系統(tǒng)目標(biāo)如下。 靈活的人機(jī)交互界面,操作簡(jiǎn)單方便、界面簡(jiǎn)潔美觀。 系統(tǒng)提供中、英文語(yǔ)言,實(shí)現(xiàn)國(guó)際化 藥品分類管理,并提
7、供類別統(tǒng)計(jì)功能。 實(shí)現(xiàn)各種查詢,如多條件查詢、模糊查詢等。 提供創(chuàng)建管理員賬戶及修改口令功能。 可對(duì)系統(tǒng)銷售信息進(jìn)行統(tǒng)計(jì)分析。 系統(tǒng)運(yùn)行穩(wěn)定、安全可靠。2.2 系統(tǒng)功能結(jié)構(gòu)醫(yī)藥銷售管理系統(tǒng)提供了四大功能,分別為“基本信息管理”、“進(jìn)貨/需求管理”、“藥品管理”、“系統(tǒng)管理”,具體結(jié)構(gòu)如圖1.1所示圖1.肖系統(tǒng)庫(kù) 存 信 息圖 看當(dāng) 藥 醫(yī)藥品信息簿理程如藥品需求管理月1.藥品進(jìn)貨管理銷售排行鄉(xiāng)計(jì)本銷售明細(xì)管理銷售時(shí)間統(tǒng)計(jì)管理員帳號(hào)管理系統(tǒng)初始化3軟件架構(gòu)在開(kāi)發(fā)項(xiàng)目前,首先要對(duì)軟件的結(jié)構(gòu)進(jìn)行設(shè)計(jì),也稱之為軟件架構(gòu)。此過(guò)程是對(duì)軟件整體結(jié)構(gòu)的設(shè)計(jì),如軟件的邏輯分層結(jié)構(gòu)、結(jié)構(gòu)的實(shí)現(xiàn)、數(shù)據(jù)庫(kù)等,特別是在
8、Java的大型項(xiàng)目中,還需要設(shè)計(jì)出程序中的包結(jié)構(gòu)及接口等,非常復(fù)雜,需要程序員進(jìn)行全面的考慮。對(duì)于醫(yī)藥銷售管理系統(tǒng)的整體涉及如下:3.1 邏輯分層結(jié)構(gòu)設(shè)計(jì)醫(yī)藥銷售管理系統(tǒng)由4層結(jié)構(gòu)組成,并遵循MVC結(jié)構(gòu)進(jìn)行設(shè)計(jì)。4層結(jié)構(gòu)分別為表示層、業(yè)務(wù)邏輯層、持久層與數(shù)據(jù)庫(kù)層,如圖1.3所示。圖1.3邏輯分層其中,表示層與業(yè)務(wù)邏輯層均由Struts框架組成,表示層用于提供程序與用戶交互的界面,項(xiàng)目中主要通過(guò)JSP、ActionForm及Struts標(biāo)簽庫(kù)進(jìn)行展現(xiàn);業(yè)務(wù)邏輯層用于處理程序中的各種業(yè)務(wù)邏輯,項(xiàng)目中通過(guò)Struts框架的中央控制器及Action對(duì)象對(duì)業(yè)務(wù)請(qǐng)求進(jìn)行處理;持久層由Hibernate框架
9、組成,負(fù)責(zé)應(yīng)用程序與關(guān)系型數(shù)據(jù)庫(kù)之間的操作;數(shù)據(jù)庫(kù)層為應(yīng)用程序所使用的數(shù)據(jù)庫(kù),本實(shí)例中為MySQL數(shù)據(jù)庫(kù)。對(duì)于4層結(jié)構(gòu)的具體實(shí)現(xiàn)如圖1.4所示。圖1.4邏輯分層實(shí)現(xiàn)3.2 系統(tǒng)文件夾組織結(jié)構(gòu)規(guī)范系統(tǒng)的整體架構(gòu)是一個(gè)項(xiàng)目開(kāi)發(fā)的標(biāo)準(zhǔn),特別是在團(tuán)隊(duì)開(kāi)發(fā)項(xiàng)目中,在編寫代碼之前,必須定制好項(xiàng)目的系統(tǒng)文件夾組織結(jié)構(gòu),以使程序條理清晰,利于后期的項(xiàng)目整合。在Java項(xiàng)目中可以將不同作用、功能相類似的文件放置于這樣既可以保證團(tuán)隊(duì)開(kāi)發(fā)的一致性,又可以將系統(tǒng)的整體結(jié)構(gòu)規(guī)范化。創(chuàng)建完系統(tǒng)中可能用到的文件夾或Java包之后,在開(kāi)發(fā)時(shí)只需將所創(chuàng)建的類文件或資源文件保存到相應(yīng)的文件夾即可。醫(yī)藥銷售管理系統(tǒng)的文件夾組織結(jié)構(gòu)
10、如圖1.5所示。圖1.5醫(yī)藥銷售管理系統(tǒng)的文件夾組織結(jié)構(gòu)3.3 實(shí)體對(duì)象設(shè)計(jì)在應(yīng)用Hibernate框架的項(xiàng)目中,實(shí)體對(duì)象的確立是其中的關(guān)鍵。實(shí)體對(duì)象與數(shù)據(jù)庫(kù)中的數(shù)據(jù)表相對(duì)應(yīng),并通過(guò)O/R映射建立實(shí)體與數(shù)據(jù)庫(kù)的聯(lián)系,Hibernate完全通過(guò)操作實(shí)體來(lái)操作數(shù)據(jù)庫(kù),所以首先要確定項(xiàng)目中的實(shí)體對(duì)象。在醫(yī)藥銷售管理系統(tǒng)中,實(shí)體對(duì)象及關(guān)系如圖1.6所示。圖1.6醫(yī)藥銷售管理系統(tǒng)中的實(shí)體對(duì)象及其關(guān)系從圖1.6中可以看到,藥品實(shí)體對(duì)象為Medicine類,藥品類別實(shí)體對(duì)象為Category類,銷售明細(xì)實(shí)體為SellDetail類,操作用戶實(shí)體為User類,這4個(gè)實(shí)體對(duì)象為醫(yī)藥銷售管理系統(tǒng)的核心實(shí)體對(duì)象,它
11、們所對(duì)應(yīng)的映射文件均為“類名+hbm.xml”文件。其中,藥品信息與藥品類別為多對(duì)一關(guān)聯(lián)關(guān)系,一個(gè)類別中包含多個(gè)藥品對(duì)象;藥品信息與銷售明細(xì)為一對(duì)多關(guān)聯(lián)關(guān)系,多個(gè)銷售明細(xì)對(duì)應(yīng)一個(gè)藥品對(duì)象;銷售明細(xì)與用戶之間為多對(duì)多的關(guān)聯(lián)關(guān)系,多個(gè)銷售明細(xì)信息對(duì)應(yīng)多個(gè)操作用戶。3.4 定義ActionFormActionForm是簡(jiǎn)單的JavaBean,主要用來(lái)保存用戶所輸入的表單數(shù)據(jù),Action要獲取這些數(shù)據(jù)需要通過(guò)ActionForm對(duì)象進(jìn)行傳遞。ActionForm對(duì)表單的數(shù)據(jù)進(jìn)行了封裝,在 JSP頁(yè)面與Action對(duì)象中提供了交互訪問(wèn)的方法。在使用過(guò)程中,可通過(guò)繼承org.apache.struts.
12、action.ActionForm對(duì)象來(lái)創(chuàng)建需要的ActionForm對(duì)象,項(xiàng)目中所涉及到的ActionForm對(duì)象如圖1.7所示。圖1.7項(xiàng)目中所涉及到的ActionForm對(duì)象3.5 持久層結(jié)構(gòu)設(shè)計(jì)持久層結(jié)構(gòu)通過(guò)Hibernate框架進(jìn)行設(shè)計(jì)。由于Hibernate對(duì)不同對(duì)象的增、刪、改、查等操作具有一定的共性,如添加數(shù)據(jù)使用save()方法、刪除數(shù)據(jù)使用delete()方法等,項(xiàng)目中將這些具有共性的操作抽取出來(lái),封裝成一個(gè)類,其他數(shù)據(jù)庫(kù)操作對(duì)象可繼承此類來(lái)?yè)碛羞@些方法,從而減少程序中的多余代碼,如圖1.8所示。圖1.8持久層結(jié)構(gòu)SupperDao類為所有數(shù)據(jù)庫(kù)操作對(duì)象的父類,在此類中定義
13、了對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作的常用方法,具體方法及說(shuō)明如表1.1所示。表1.1SupperDao方法及說(shuō)明方法說(shuō)明save()用于保存一個(gè)對(duì)象saveOrUpdate()用于保存或更新一個(gè)對(duì)象delete(Objectobj)用于刪除一個(gè)對(duì)象,入口參數(shù)為Object類型findByHQL()通過(guò)HQL語(yǔ)句查詢數(shù)據(jù),入口委數(shù)為String類型的HQL語(yǔ)句deleteByHQL()通過(guò)HQL語(yǔ)句刪除數(shù)據(jù),入口參數(shù)為String類型的HQL語(yǔ)句uniqueResult()單值檢索數(shù)據(jù),入口參數(shù)hql為HQL查詢語(yǔ)句、where為查詢條件findPaging()分頁(yè)查詢數(shù)據(jù),入口參數(shù)hql為HQL查詢語(yǔ)句、of
14、fset為結(jié)果集的起始位置、length為返回結(jié)果集的條目數(shù)、where為查詢條件這些方法均為數(shù)據(jù)庫(kù)操作的常用方法,所以將其封裝在單獨(dú)的一個(gè)類中,對(duì)于各個(gè)對(duì)象的數(shù)據(jù)庫(kù)相關(guān)操作,可通過(guò)繼承此類來(lái)獲取這些常用方法。其子類對(duì)象有CategoryDao類、MedicineDao類、SellDao類、UserDao類,其功能分別介紹如下。CategoryDao類:藥品類別數(shù)據(jù)庫(kù)操作對(duì)象,用于封裝與藥品類別相關(guān)的數(shù)據(jù)庫(kù)操作方法。MedicineDao類:藥品信息數(shù)據(jù)庫(kù)操作對(duì)象,用于封裝與藥品信息相關(guān)的數(shù)據(jù)庫(kù)操作方法。SellDao類:藥品銷售數(shù)據(jù)庫(kù)操作對(duì)象,用于封裝與藥品銷售相關(guān)的數(shù)據(jù)庫(kù)操作方法。User
15、Dao類:用戶數(shù)據(jù)庫(kù)操作對(duì)象,用于封裝與管理員及系統(tǒng)相關(guān)的數(shù)據(jù)庫(kù)操作方法。3.6 業(yè)務(wù)層結(jié)構(gòu)設(shè)計(jì)業(yè)務(wù)層結(jié)構(gòu)主要通過(guò)Struts框架進(jìn)行設(shè)計(jì),由Struts的中央控制器對(duì)各種操作請(qǐng)求進(jìn)行控制,并通過(guò)相應(yīng)的Action對(duì)其進(jìn)行業(yè)務(wù)處理,項(xiàng)目中所用到的Action對(duì)象及關(guān)系如圖1.9所示。圖1.9Action對(duì)象及關(guān)系A(chǔ)ction、DispatchAction與LookUpDispatchAction為Struts封裝的Action對(duì)象,具有不同的特點(diǎn)及作用,項(xiàng)目中通過(guò)繼承這幾個(gè)對(duì)象實(shí)現(xiàn)對(duì)不同業(yè)務(wù)請(qǐng)求的處理。除這3個(gè)對(duì)象外,圖1.9中其余的Action對(duì)象均為自定義的Action對(duì)象。在這些自定義的
16、Action對(duì)象中,LanguageAction與LoginAction用于處理國(guó)際化語(yǔ)言及用戶登錄操作。由于二者不涉及過(guò)多的業(yè)務(wù)邏輯,它們都直接繼承于Action對(duì)象。BaseAction對(duì)象與DeleteAction對(duì)象為重要的Action對(duì)象,二者都繼承了DispatchAction對(duì)象。項(xiàng)目中封裝這兩個(gè)對(duì)象的目的在于簡(jiǎn)化程序中的業(yè)務(wù)邏輯、提高程序的安全性。在這兩個(gè)對(duì)象中均對(duì)用戶登錄身份做出了嚴(yán)格的驗(yàn)證,其子類對(duì)象通過(guò)繼承不必再考慮用戶登錄的安全問(wèn)題,而更專注于業(yè)務(wù)邏輯,同時(shí)通過(guò)繼承還可以減少程序的代碼量。其中BaseAction對(duì)象的子類及作用如表1.2所示。表1.2BaseActio
17、n對(duì)象的子類及其作用子類作用SellAction封裝藥品銷售的相關(guān)操作,處理封裝藥品銷售請(qǐng)求SystemAction封裝系統(tǒng)相關(guān)操作,處理系統(tǒng)級(jí)的請(qǐng)求CategoryAction封裝藥品類別相關(guān)操作,處理藥品類別相關(guān)操作MedicineAction封裝藥品信息相關(guān)操作,處理封裝藥品信息的相關(guān)請(qǐng)求RequireAction封裝藥品需求及庫(kù)存相關(guān)操作,處理藥品需求相關(guān)請(qǐng)求DeleteAction對(duì)象繼承了LookUpDispatchAction對(duì)象,此類通過(guò)重寫getKeyMethodMap()方法對(duì)數(shù)據(jù)進(jìn)行批量刪除操作,其子類對(duì)象及其作用如表1.3所示。表1.3DeleteAction對(duì)象的子類
18、及其作用子類作用DeleteMedicineAction封裝藥品信息刪除操作,用于批量刪除藥品信息DeleteReqMedAction封裝藥品需求信息刪除操作,用于批量刪除藥品需求信息3.7頁(yè)面結(jié)構(gòu)設(shè)計(jì)醫(yī)藥銷售管理系統(tǒng)的頁(yè)面結(jié)構(gòu)采用框架進(jìn)行設(shè)計(jì),通過(guò)HTML語(yǔ)言中的frameset標(biāo)簽及frame標(biāo)簽將頁(yè)面分成3個(gè)部分,分別為頁(yè)面頭部、頁(yè)面導(dǎo)航及內(nèi)容頁(yè)面,如圖1.10所示。圖1.10頁(yè)面布局此種布局方式將每一個(gè)頁(yè)面單獨(dú)置于一個(gè)框架之中,其中“頁(yè)面頭部”和“貢面導(dǎo)航”在登錄之后是固定不變的,對(duì)于用戶的操作將在“內(nèi)容頁(yè)面”顯示結(jié)果。使用這種方式的有點(diǎn)在于:(1)避免了JSP頁(yè)面中大量引用inclu
19、de動(dòng)作標(biāo)簽。(2)避免瀏覽器反復(fù)加載“頁(yè)面頭部”及“頁(yè)面導(dǎo)航”等同樣的內(nèi)容,加快瀏覽器速度。4配置文件在編寫代碼之前,需要做一些準(zhǔn)備工作,如項(xiàng)目環(huán)境的搭建、項(xiàng)目所涉及到的第三方類庫(kù)的支持、web.xml的配置等。在醫(yī)藥銷售管理系統(tǒng)中,主要涉及到Struts框架、Hibernate框架及JFreeChart組件的應(yīng)用,因此在項(xiàng)目開(kāi)發(fā)之前,需要添加其類庫(kù)支持。4.1 配置web.xmlweb.xml文件是Web項(xiàng)目的配置文件,在醫(yī)藥銷售管理系統(tǒng)中,此文件需要配置Struts框架、JFreeChart組件和過(guò)濾器等信息。4.2 配置struts-config.xmlStruts框架實(shí)現(xiàn)了MVC模式
20、,web.xml和struts-config.xml文件是其兩個(gè)重要的配置文件,其中web.xml文件實(shí)現(xiàn)了Struts的初始化加載,而struts-config.xml是它的核心配置文件。Struts-config.xml所做的工作比較多,包括ActionForm對(duì)象的定義、用戶請(qǐng)求和Action之間的映射、異常處理等重要的配置。其中<form-beans>標(biāo)簽用于注冊(cè)實(shí)例中所涉及到的ActionForm對(duì)象,<global-forwards>標(biāo)簽用于設(shè)置全局跳轉(zhuǎn),<action-mappings>標(biāo)簽配置用戶請(qǐng)求Action對(duì)象的映射。4.3 配置hib
21、ernate.cfg.xmlHibernate.cfg.xml文件是Hibernate的配置文件,在項(xiàng)目中,此文件配置了數(shù)據(jù)庫(kù)的方言、數(shù)據(jù)庫(kù)鏈接信息、自動(dòng)建表屬性和打印SQL語(yǔ)句等屬性。5實(shí)體及映射Hibernate是一個(gè)ORM產(chǎn)品,它完全可以操作對(duì)象的方式進(jìn)行數(shù)據(jù)庫(kù)操作,其實(shí)體對(duì)象與數(shù)據(jù)表之間通過(guò)映射文件建立映射關(guān)系。因此,在醫(yī)藥銷售管理系統(tǒng)中需要建立實(shí)體對(duì)象與數(shù)據(jù)表之間的映射。5.1 藥品實(shí)體映射藥品實(shí)體對(duì)象的持久化類為Medicine類,此類封裝了藥品相關(guān)屬性提供相應(yīng)的getXX()和setXXX()方法。藥品對(duì)象與藥品類別對(duì)象為多對(duì)一關(guān)聯(lián)關(guān)系,所以在Medicine類中加入了藥品類別屬
22、性category,其關(guān)聯(lián)關(guān)系通過(guò)映射文件Medicine.hbm.xml進(jìn)行映射。映射文件Medicine.hbm.xml將實(shí)體對(duì)象Medicine映射為tb_medicine表,主鍵的生成策略采用自動(dòng)生成方式。此映射文件中,對(duì)于數(shù)據(jù)表的部分字段還通過(guò)not-null、length、unique等屬性映射字段的屬性,其中not-null用于映射字段的非空屬性、length用于映射字段的長(zhǎng)度、unique用于映射字段是否唯一。映射后的數(shù)據(jù)表如圖1.11所示。圖1.11tb_medicine表5.2 藥品類別實(shí)體映射藥品類別實(shí)體用于封裝藥品類別屬性信息,其持久化類為Category類,與藥品對(duì)象
23、存在一對(duì)多關(guān)聯(lián)關(guān)系。藥品對(duì)象與藥品類別對(duì)象為多對(duì)一關(guān)聯(lián)關(guān)系,但從藥品類別一端來(lái)看,藥品類別對(duì)象與藥品對(duì)象又是一對(duì)多的關(guān)系,所以程序中采用了多對(duì)一雙向關(guān)聯(lián)進(jìn)行映射。藥品類別實(shí)體對(duì)象的映射文件為Category.hbm.xml。Category類所映射的數(shù)據(jù)表為tb_category,其中<ser>標(biāo)簽用于映射藥品類別實(shí)體與藥品實(shí)體間的一對(duì)多關(guān)聯(lián)關(guān)系,此種映射方式將在藥品數(shù)據(jù)表中添加categoryId字段。映射后的數(shù)據(jù)表tb_category如圖1.12所示。圖1.12tb_categoy表5.3 銷售明細(xì)實(shí)體映射銷售明細(xì)用于描述藥品銷售時(shí)的具體情況,如銷售時(shí)間、銷售人員、銷售數(shù)量等
24、。這些信息十分重要,需要記錄到數(shù)據(jù)庫(kù)中,實(shí)例中將其封裝為SellDetail類。為了方便查看銷售明細(xì)的總額信息,在SellDetail類中加入了sellTotal()屬性,此屬性并不進(jìn)行數(shù)據(jù)表的映射,它只有一個(gè)與之對(duì)應(yīng)的get()方法,在此方法中通過(guò)單價(jià)與數(shù)量的運(yùn)算對(duì)sellTotal進(jìn)行賦值,并將其返回。銷售明細(xì)實(shí)體的映射文件為SellDetail.hbm.xml,此映射文件中映射了兩個(gè)多對(duì)一關(guān)聯(lián)關(guān)系,分別為與藥品對(duì)象的多對(duì)一關(guān)系及操作用戶間的多對(duì)一關(guān)系。銷售明細(xì)實(shí)體映射的數(shù)據(jù)表為tb_selldetail。在映射文件SellDetail.hbm.xml中,通過(guò)兩個(gè)<many-to-o
25、ne>標(biāo)簽分別映射與藥品對(duì)象及操作用戶的多對(duì)一關(guān)聯(lián)關(guān)系,并配置了級(jí)聯(lián)操作類型為save-update。映射后的數(shù)據(jù)表結(jié)構(gòu)如圖1.13所示。圖1.13tb_selldetail表5.4 用戶實(shí)體映射在醫(yī)藥銷售管理系統(tǒng)中,用戶實(shí)體用于封裝管理員的基本信息,如登錄的用戶名、密碼等屬性,其類名為User。User類中屬性相對(duì)較少,其映射過(guò)程也相對(duì)簡(jiǎn)單。其映射文件為User.hbm.xml。用戶實(shí)體所映射的數(shù)據(jù)表為tb_user,其結(jié)構(gòu)如圖1.14所示。圖1.14tb_user表6公共類設(shè)計(jì)在Java程序開(kāi)發(fā)中,如果一個(gè)功能反復(fù)被調(diào)用,則可將該功能抽取出來(lái)封裝為一個(gè)類作為公共類,在需要此功能的地方
26、通過(guò)此類進(jìn)行實(shí)現(xiàn)。公共類實(shí)質(zhì)是代碼的重用的一種方式,在面向?qū)ο蟮拈_(kāi)發(fā)模式中經(jīng)常使用它來(lái)簡(jiǎn)化程序中的代碼,提高程序的可讀性。下面是醫(yī)藥銷售管理系統(tǒng)找那個(gè)的公共類設(shè)計(jì)。6.1Hibernate過(guò)濾器在沒(méi)有使用Spring管理Hibernate的情況下,對(duì)Hibernate的管理仍然存在一定的難度,特別是在J2EE開(kāi)發(fā)中,線程安全、SessionFactory對(duì)象、Session對(duì)象、Hibernate緩存及延遲加載等是程序設(shè)計(jì)中的難題,管理不當(dāng)將會(huì)對(duì)程序造成極為嚴(yán)重的影響。在醫(yī)藥銷售管理系統(tǒng)中,將SessionFactory對(duì)象、Session對(duì)象置于過(guò)濾器中,由過(guò)濾器對(duì)其進(jìn)行管理,從而解決了這些
27、問(wèn)題。在Web項(xiàng)目中,以普通方式使用Hibernate將無(wú)法解決Hibernate延遲加載,如圖1.15所示。當(dāng)有一個(gè)業(yè)務(wù)請(qǐng)求查詢數(shù)據(jù)時(shí),首先要開(kāi)啟Session對(duì)象,然后Hibernate對(duì)數(shù)據(jù)進(jìn)行查詢。在關(guān)閉Session對(duì)象,最后通過(guò)JSP頁(yè)面來(lái)顯示數(shù)據(jù)。在這一過(guò)程中,如果查詢數(shù)據(jù)時(shí)使用了延遲加載,當(dāng)JSP頁(yè)面顯示數(shù)據(jù)信息時(shí),Hibernate將拋出異常信息,因?yàn)榇藭r(shí)Session對(duì)象已經(jīng)關(guān)閉,Hibernate不能再對(duì)數(shù)據(jù)進(jìn)行操作。圖1.16Hibernate過(guò)濾器在Web容器啟動(dòng)時(shí),過(guò)濾器被初始化,它將執(zhí)行init()方法,在后續(xù)的操作中不會(huì)再次被執(zhí)行;而當(dāng)容器關(guān)閉時(shí),過(guò)濾器將執(zhí)行d
28、estroy()方法。這兩個(gè)方法恰好符合SessionFactory對(duì)象的生命周期,在運(yùn)行期間只執(zhí)行一次操作,可用于實(shí)例化及銷毀SessionFactory對(duì)象。對(duì)于Session對(duì)象的關(guān)閉操作,可以在業(yè)務(wù)邏輯處理結(jié)束后、response請(qǐng)求轉(zhuǎn)發(fā)大View層之前進(jìn)行。實(shí)例將其封裝在HibernateFilter類中,此類繼承了Filter類,它是一個(gè)過(guò)濾器。為了保證線程的安全性,實(shí)例中將Session對(duì)象存放與ThreadLocal對(duì)象中,當(dāng)用到一個(gè)Session對(duì)象時(shí),首先從ThreadLocal中獲取,在無(wú)法獲取的情況下才會(huì)開(kāi)啟一個(gè)新的Session對(duì)象。同時(shí),為了保證Session對(duì)象能
29、在resopnse請(qǐng)求轉(zhuǎn)發(fā)到View層之前被關(guān)閉,實(shí)例采取了tryfinally語(yǔ)句對(duì)Session對(duì)象進(jìn)行關(guān)閉。6.2SupperDao類SupperDao類為項(xiàng)目中所有數(shù)據(jù)庫(kù)操作類的父類,此類封裝了數(shù)據(jù)庫(kù)操作的常用方法。在此類中,由于Hibernate對(duì)數(shù)據(jù)的操作都需要用到Session接口,類中定義了一個(gè)protected類型的Session對(duì)象,為其子類提供了方便。save()方法及savaOrUpdate()方法都用于保存一個(gè)對(duì)象,其入口參數(shù)均為Object類型。其中saveOrUpdate()方法比save()方法更智能一些,可以根據(jù)實(shí)體對(duì)象中的標(biāo)識(shí)值來(lái)判斷保存還是更新操作。Sup
30、perDao類中使用這兩個(gè)方法對(duì)實(shí)體對(duì)象進(jìn)行保存及更新操作。刪除操作的方法為delete(),入口參數(shù)為Object類型,此方法通過(guò)Session接口的delete()方法進(jìn)行實(shí)現(xiàn)。SupperDao類為項(xiàng)目中所有數(shù)據(jù)庫(kù)操作類的父類,在設(shè)計(jì)時(shí)應(yīng)當(dāng)考慮全面。Hibernate的HQL查詢語(yǔ)言提供了更為靈活的查詢方式,在這個(gè)超類之中應(yīng)該加入HQL的操作方法,其中findByHQL()方法用于根據(jù)指定的HQL查詢語(yǔ)句查詢結(jié)果集,deleteByHQL()方法用于根據(jù)指定的HQL查詢語(yǔ)句進(jìn)行刪除操作。Hibernate單值檢索在查詢后返回單個(gè)對(duì)象,當(dāng)返回的結(jié)果包含多條數(shù)據(jù)時(shí),Hibernate將拋出異
31、常。此種操作可用于查詢單條數(shù)據(jù),如聚合函數(shù)count()等。在SupperDao類中,單值檢索的方法為uniqueResult()。此方法的入口參數(shù)為HQL查詢語(yǔ)句及查詢條件,其中查詢條件為Object數(shù)組類型,用于裝載查詢語(yǔ)句中的參數(shù)。例如HQL語(yǔ)句“fromMedicinemwherem.id=?”,此時(shí)即可通過(guò)參數(shù)where對(duì)其進(jìn)行動(dòng)態(tài)賦值。分頁(yè)查詢?cè)诔绦蜷_(kāi)發(fā)中經(jīng)常用到,不但方便查看,還可以減少結(jié)果集的返回?cái)?shù)量,提高數(shù)據(jù)訪問(wèn)效率。使用Hibernate的分頁(yè)查詢方法極為簡(jiǎn)單,只需要傳入幾個(gè)參數(shù)即可,但在SupperDao類中對(duì)其進(jìn)行了擴(kuò)展,加入了HQL語(yǔ)句的動(dòng)態(tài)賦值,其方法名為findP
32、aging()。此方法入口參數(shù)有4個(gè),其中參數(shù)hql為HQL查詢語(yǔ)句,它允許傳入?yún)?shù)中帶有占位符“?”的HQL語(yǔ)句;參數(shù)offset為查詢結(jié)果集對(duì)象的起始位置;參數(shù)length為查詢結(jié)果的偏移量,也是返回?cái)?shù)據(jù)的條目數(shù);參數(shù)where為查詢條件,屬于Object數(shù)組類型,用于裝載HQL語(yǔ)句中的參數(shù)。通過(guò)上述這幾個(gè)參數(shù)基本可以滿足項(xiàng)目中所有的分頁(yè)查詢,當(dāng)然遇到特殊情況時(shí),可以通過(guò)子類對(duì)象重寫此方法。6.3BaseAction類BaseAction類是業(yè)務(wù)層,有一個(gè)超類對(duì)象,它繼承了Struts的DispatchAction類,同時(shí)還為子類對(duì)象提供公用方法。此類首先定義了3個(gè)protected類型的
33、變量,分別用于設(shè)置每頁(yè)的記錄數(shù)、本地語(yǔ)言信息及國(guó)際化消息資源。Struts的DispatchAction類繼承了Action類,此類處理請(qǐng)求時(shí)首先要執(zhí)行execute。方法,然后通過(guò)控制器再轉(zhuǎn)發(fā)到相應(yīng)的方法進(jìn)行業(yè)務(wù)處理。根據(jù)這一分析,可以在execute。方法中對(duì)用戶的身份作出驗(yàn)證,其實(shí)現(xiàn)過(guò)程如圖1.17所示。通過(guò)getPage()方法進(jìn)行實(shí)現(xiàn),子類對(duì)象可以通過(guò)繼承來(lái)獲取此方法。getPage()方法返回一個(gè)Map集合對(duì)象,該集合用于裝載結(jié)果集及分頁(yè)條。其中,結(jié)果集對(duì)象為一頁(yè)中的所有數(shù)據(jù)集合,它是一個(gè)List對(duì)象;分頁(yè)條為分頁(yè)查詢后在JSP頁(yè)面所顯示的分頁(yè)信息,如記錄數(shù)、頁(yè)碼、上一頁(yè)、下一頁(yè)的
34、超鏈接等,它是一個(gè)String類型的字符串。getPage()方法的入口參數(shù)有四個(gè),其中參數(shù)hql為分頁(yè)查詢的HQL語(yǔ)句,此語(yǔ)句不可以包括select子句,它從from子句開(kāi)始,可以傳入帶有占位符的HQL,但需要通過(guò)查詢條件參數(shù)where傳遞占位符的值,當(dāng)HQL語(yǔ)句沒(méi)有參數(shù)時(shí),where參數(shù)可以設(shè)置為null;參數(shù)recPerPage為每一頁(yè)的記錄數(shù);currPage為當(dāng)前的頁(yè)碼;action為分頁(yè)所請(qǐng)求的Action地址。getPage()方法提供這些參數(shù)的目的在于提高程序代碼的重用性,因?yàn)樵卺t(yī)藥銷售管理系統(tǒng)中,通過(guò)這些參數(shù),getPage()方法已滿足所有的分頁(yè)查詢,用到分頁(yè)查詢的地方都調(diào)
35、用了此方法。此外,在其他項(xiàng)目中此方法的重用價(jià)值也是非常高的。分頁(yè)查詢?cè)跇I(yè)務(wù)層的實(shí)現(xiàn)比較繁瑣,因?yàn)樵诜猪?yè)條中要考慮到國(guó)際化的實(shí)現(xiàn),所以在分頁(yè)條中所有文字信息均通過(guò)MessageResources對(duì)象讀取國(guó)際化資源文件來(lái)獲取。MessageResources對(duì)象是Struts中的對(duì)象,此對(duì)象根據(jù)Locale信息讀取相應(yīng)的國(guó)際化消息資源文件。1.4 DeleteAction類公共類DeleteAction主要用于對(duì)項(xiàng)目中LookupDispatchAction的請(qǐng)求進(jìn)行處理。它繼承了LookupDispatchAction類,重寫了execute()方法對(duì)用戶的身份作出驗(yàn)證,當(dāng)用戶身份驗(yàn)證失敗時(shí)將進(jìn)
36、行錯(cuò)誤處理;同時(shí),此類還重寫了LookupDispatchAction類中的getKeyMethodMap()方法,添加了兩個(gè)按鈕對(duì)象的key。1.5 字符串工具類在一個(gè)Web項(xiàng)目中,字符串是經(jīng)常被操作的對(duì)象。為了簡(jiǎn)化程序的代碼及提高程序的可讀性,對(duì)于經(jīng)常用到的字符串處理方法,可以封裝一個(gè)字符串工具類對(duì)其進(jìn)行操作。例如JSP頁(yè)面的多選框,它提交的參數(shù)值為數(shù)組類型,在數(shù)據(jù)庫(kù)的操作過(guò)程中需要將其轉(zhuǎn)換為字符串類型;在超鏈接中,如果加入中文參數(shù)將不能被瀏覽器解析,需要對(duì)其進(jìn)行一定的處理才可以使用。類似于這種操作在程序中使用的非常頻繁,將其封裝為一個(gè)公共類無(wú)疑是一種較好的解決方案。在醫(yī)藥銷售管理系統(tǒng)中,
37、封裝了一個(gè)名為StringUtil的字符串工具類,用于對(duì)字符的特殊處理。此類中均為靜態(tài)方法。在HQL語(yǔ)句中,如果刪除多個(gè)對(duì)象可以使用whereidin(1,2,3)的方式進(jìn)行刪除。arr2Str()方法用于將數(shù)組轉(zhuǎn)換為字符串,可以將JSP表單傳遞id值轉(zhuǎn)換為此種方式;encodeURL()方法可對(duì)字符串進(jìn)行URL編碼,主要用于對(duì)含有中文的超鏈接進(jìn)行處理;encodeZh()方法用于對(duì)字符串中的中文亂碼進(jìn)行處理。7 國(guó)際化國(guó)際化是Struts的一項(xiàng)強(qiáng)大功能,它以不同國(guó)家的語(yǔ)言構(gòu)建本地化的頁(yè)面,方便不同國(guó)家、不同語(yǔ)言的用戶瀏覽訪問(wèn)。在醫(yī)藥銷售管理系統(tǒng)中,分別構(gòu)建了中文和英文兩種語(yǔ)言環(huán)境,根據(jù)使用者
38、瀏覽器的默認(rèn)語(yǔ)言環(huán)境呈現(xiàn)不同的語(yǔ)言顯示方式。7.1 國(guó)際化資源文件醫(yī)藥銷售管理系統(tǒng)對(duì)所有涉及到語(yǔ)言信息的地方均進(jìn)行了國(guó)際化設(shè)置,包括JSP頁(yè)面文字信息及JS腳本提示信息等。主要包含3個(gè)國(guó)際化資源文件,其中屬性文件為MessageRperties為默認(rèn)的資源文件,實(shí)例中將其設(shè)置為中文;屬性文件MessageResources_en_US.properties為英文國(guó)際化資源文件;MessageResources_zh_CN.properties為中文國(guó)際化資源文件。在編寫屬性文件時(shí)應(yīng)該注意,屬性文件以Unicode編碼,在處理中文時(shí)應(yīng)該對(duì)其進(jìn)行轉(zhuǎn)碼。Java提供了將中文轉(zhuǎn)
39、換為Unicode編碼格式的工具,在命令窗口中直接輸入“native2ascii”,再輸入中文,然后按回車鍵,將輸出中文對(duì)應(yīng)的Unicode碼。7.2 國(guó)際化實(shí)現(xiàn)實(shí)例中除了對(duì)用戶瀏覽器語(yǔ)言的自動(dòng)匹配外,還為使用者提供了中文和英文的語(yǔ)言鏈接,用戶在使用過(guò)程中可對(duì)語(yǔ)言進(jìn)行自動(dòng)切換。此請(qǐng)求由LanguageAction類進(jìn)行處理。本地語(yǔ)言信息存放在Session會(huì)話中的Globals.LOCALE_KEY值中,它是Struts的默認(rèn)配置,可以通過(guò)Strtus的API幫助文檔和源碼得到。對(duì)于中、英文兩種請(qǐng)求,實(shí)例中分別創(chuàng)建了中、英文所對(duì)應(yīng)的Locale對(duì)象,并將其設(shè)置到Globals.LOCALE_K
40、EY值中,實(shí)現(xiàn)了語(yǔ)言的自動(dòng)切換。8 系統(tǒng)登陸模塊系統(tǒng)登錄是一個(gè)用戶身份驗(yàn)證的過(guò)程,只有登錄成功的用戶才可以對(duì)系統(tǒng)進(jìn)行操作,否則不能對(duì)系統(tǒng)進(jìn)行管理維護(hù)。形象地說(shuō),它就是系統(tǒng)的一道安全門。8.1 查詢用戶創(chuàng)建名為UserDao的類,封裝對(duì)用戶及系統(tǒng)級(jí)的數(shù)據(jù)操作。在此類中編寫login()方法,用于根據(jù)用戶名及密碼查詢用戶對(duì)象。在用戶登錄的過(guò)程中,需要判斷數(shù)據(jù)庫(kù)用戶對(duì)象是否存在,當(dāng)用戶提交登錄信息時(shí),調(diào)用此方法可返回查詢后的用戶對(duì)象,如果查詢不到將返回null值。8.2 登陸請(qǐng)求用戶登錄請(qǐng)求由LoginAction類進(jìn)行處理,此類繼承了Action對(duì)象,它重寫execute()方法對(duì)用戶登錄請(qǐng)求進(jìn)行
41、驗(yàn)證。UserForm對(duì)象為用戶ActionForm對(duì)象,Struts自動(dòng)將JSP頁(yè)面表單信息封裝在此對(duì)象中,所以可以直接獲取ActionForm對(duì)象中的屬性信息。LoginAction類通過(guò)UserForm中的用戶名和密碼屬性,調(diào)用UserDao對(duì)象中的login()方法對(duì)用戶信息進(jìn)行查詢,當(dāng)數(shù)據(jù)庫(kù)中存在與之匹配的數(shù)據(jù),則登錄成功,否則登錄失敗。8.3 登錄頁(yè)面在Web文件夾的根目錄中創(chuàng)建login.jsp文件,即系統(tǒng)中的用戶登錄頁(yè)面,在其中放置用戶登錄的表單。在此頁(yè)面中,首先通過(guò)<logic:notEmpty>標(biāo)簽判斷是否存在error值,如果存在即表示用戶登錄發(fā)生錯(cuò)誤,將在登
42、錄頁(yè)面顯示錯(cuò)誤信息。Login.jsp頁(yè)面運(yùn)行結(jié)果如圖1.21所示。圖1.21系統(tǒng)登錄頁(yè)面9 藥品類別信息管理藥品超市經(jīng)營(yíng)的藥品眾多,為方便產(chǎn)看、統(tǒng)計(jì),需要對(duì)其進(jìn)行分類。藥品類別信息管理模塊主要是對(duì)藥品類別信息進(jìn)行統(tǒng)一管理,其中包括對(duì)藥品類別的添加、查看、統(tǒng)計(jì)等操作。9.1 藥品類別持久層設(shè)計(jì)CategoryDao類是藥品類別的數(shù)據(jù)庫(kù)操作類,它繼承了SupperDao類,提供對(duì)藥品類別的數(shù)據(jù)庫(kù)操作方法。其中l(wèi)oadCategory()方法用于查詢指定id的藥品類別信息,其入口參數(shù)為int型藥品id。在添加藥品信息時(shí),需要添加與之對(duì)應(yīng)的類別信息,所以還需要提供一個(gè)查詢所有藥品類別信息的方法fin
43、dAllCategory()。為方便藥品類別數(shù)據(jù)的統(tǒng)計(jì),實(shí)例中對(duì)藥品類別中藥品的數(shù)量進(jìn)行統(tǒng)計(jì)的操作被定義在findCategoryAndCount(),由HQL語(yǔ)句的內(nèi)連接查詢進(jìn)行實(shí)現(xiàn)。findCategoryAndCount()方法中的hql屬性為內(nèi)連接查詢語(yǔ)句,可對(duì)藥品數(shù)量按藥品類別進(jìn)行分組統(tǒng)計(jì),查詢后返回其結(jié)果集對(duì)象。9.2 藥品類別的添加藥品類別的添加是指將藥品類別信息寫入數(shù)據(jù)庫(kù),實(shí)現(xiàn)過(guò)程如下。9.2.1 類別添加、修改請(qǐng)求處理實(shí)例中將藥品類別的相關(guān)請(qǐng)求封裝在CategoryAction類中,此類繼承了BaseAction對(duì)象,所以在對(duì)類別信息進(jìn)行處理時(shí),不必考慮用戶是否登錄的安全問(wèn)題
44、。此類中處理添加類別信息請(qǐng)求的方法為add(),由于CategoryAction類是一個(gè)DispatchAction對(duì)象,所以當(dāng)請(qǐng)求的參數(shù)為add時(shí),將由此方法進(jìn)行處理。此方法調(diào)用了CategoryDao對(duì)象的saveOrUpdate()方法,所以藥品類別信息的添加與修改操作均可通過(guò)此方法進(jìn)行實(shí)現(xiàn);當(dāng)傳遞的CategoryForm對(duì)象含有id值時(shí),則進(jìn)行修改操作。9.2.2 類別添加頁(yè)面類別添加頁(yè)面即category_add.jsp文件,此頁(yè)面中主要放置了類別添加的表單。此頁(yè)面中使用Struts的<html:hidden>標(biāo)簽設(shè)置藥品類別的id屬性值,如果此屬性不為空,則意味著操作
45、為修改操作。類別添加頁(yè)面運(yùn)行結(jié)果如圖1.22所示。圖1.22類別添加頁(yè)面9.3 分頁(yè)查看類別信息在添加藥品信息后,系統(tǒng)將跳轉(zhuǎn)到類別信息列表頁(yè)面。在此頁(yè)面中將對(duì)類別信息進(jìn)行分頁(yè)顯示,此外還提供了藥品類別修改與刪除的超鏈接,如圖1.23所示。圖1.23類別信息列表頁(yè)面9.3.1 查詢與刪除請(qǐng)求處理在CategoryAction類中,藥品類別信息的分頁(yè)查詢方法為paging(),由于此類繼承于BaseAction類,所以調(diào)用其父類中的getPage()方法就可以實(shí)現(xiàn)。它將返回結(jié)果集與分頁(yè)條對(duì)象。在此方法中,currPage屬性為請(qǐng)求的頁(yè)碼;action對(duì)象為JSP頁(yè)面請(qǐng)求的action地址;hql為
46、查詢語(yǔ)句,由于它不含有占位符參數(shù),所以getPage()方法的條件參數(shù)設(shè)置為null.9.3.2 類別信息列表頁(yè)面category_list.jsp是類別信息列表頁(yè)面,在此頁(yè)面中使用Struts的標(biāo)簽對(duì)藥品類別信息進(jìn)行迭代輸出。在程序開(kāi)發(fā)過(guò)程中,應(yīng)盡量減少程序中bug。例如,category_list.jsp頁(yè)面中,在輸出request對(duì)象中的屬性時(shí),首先使用<logic:present>標(biāo)簽判斷其屬性是否存在。Category_list.jsp頁(yè)面中的“修改”與“刪除”超鏈接使用Struts的<html:link>標(biāo)簽進(jìn)行設(shè)置,此標(biāo)簽的功能十分強(qiáng)大,它可以設(shè)置超鏈接中
47、的參數(shù)。實(shí)例中使用的paramName屬性用于設(shè)置所迭代的對(duì)象,paramId屬性用于設(shè)置參數(shù)的名稱,paramProperty屬性用于設(shè)置參數(shù)值,href屬性用于指定鏈接地址。9.4 類別的修改與刪除在CategoryAction類中,類別的修改與刪除相對(duì)簡(jiǎn)單一些,其中處理刪除類別請(qǐng)求的方法為delete(),可根據(jù)指定的藥品類別id刪除藥品類別對(duì)象。處理修改類別信息請(qǐng)求的方法為edit(),此方法通過(guò)類別id加載藥品類別對(duì)象將類別信息保存到CategoryForm對(duì)象中,最后轉(zhuǎn)發(fā)到編輯頁(yè)面。此方法在加載類別信息后,會(huì)將頁(yè)面轉(zhuǎn)到類別添加頁(yè)面,因?yàn)轭悇e添加請(qǐng)求處理的方法調(diào)用了Hibernate
48、的saveOrUpdate()方法,所以會(huì)對(duì)其進(jìn)行自動(dòng)更新。9.5 藥品類別統(tǒng)計(jì)為了方便查看、管理藥品統(tǒng)計(jì)信息,實(shí)例中使用了報(bào)表組件JFreeChat對(duì)藥品分類進(jìn)行統(tǒng)計(jì)。其實(shí)現(xiàn)過(guò)程如下:9.5.1 JFreeChat工具類創(chuàng)建名為ChartUtil的類,用于生成制圖對(duì)象JFreeChat。其中categoryChart()方法用于生成藥品類別統(tǒng)計(jì)的餅形圖對(duì)象,其入口參數(shù)為裝載結(jié)果集的List集合對(duì)象。此方法中,通過(guò)傳遞的List集合對(duì)象生成DefaultPieDataset數(shù)據(jù)集合,然后使用制圖工廠ChartFactory創(chuàng)建餅形圖JFreeChart對(duì)象,并將其返回。9.5.2 Action
49、請(qǐng)求藥品類別統(tǒng)計(jì)請(qǐng)求由CategoryAction類的findCategoryAndCound()方法進(jìn)行處理,此方法首先通過(guò)CategoryDao對(duì)象統(tǒng)計(jì)藥品類別信息,獲取結(jié)果集對(duì)象后,通過(guò)ChartUtil類的categoryChart()方法生成制圖對(duì)象,最后將生成的圖片路徑放置到request中。9.5.3 顯示報(bào)表藥品類別統(tǒng)計(jì)信息通過(guò)category_graph.jsp頁(yè)面進(jìn)行顯示,此頁(yè)面通過(guò)<bean:write>標(biāo)簽獲取所生成圖片的路徑。為避免空指針錯(cuò)誤,category_graph.jsp頁(yè)面使用<logic:notEmpty>標(biāo)簽判斷生成的圖片路徑是否
50、存在,其運(yùn)行結(jié)果如圖1.24所示。圖1.24category_graph.jsp頁(yè)面10 藥品信息管理藥品信息管理主要是對(duì)藥品基本信息的維護(hù),其中包括對(duì)藥品信息的添加、刪除、修改、查詢等操作。10.1 藥品對(duì)象持久層設(shè)計(jì)MedicineDao類是藥品對(duì)象的數(shù)據(jù)庫(kù)操作類,它繼承了SupperDao類,此類主要包含3個(gè)方法,分別為loadMedicine()、loadMedicineCategory()、findMedicineByMedNo()。其中,loadMedicine()方法與findMedicineByMedNo()方法用于根據(jù)藥品id及藥品編碼查詢藥品信息;loadMedicineA
51、ndCategory()方法用于查詢藥品信息與藥品類別信息。loadMedicineAndCategory()方法使用內(nèi)連接對(duì)藥品信息表與藥品類別表進(jìn)行聯(lián)合查詢,可以減少SQL語(yǔ)句的數(shù)量。藥品實(shí)體與藥品類別實(shí)體存在多對(duì)一的關(guān)聯(lián)關(guān)系,當(dāng)同時(shí)查看藥品信息與藥品類別信息時(shí),Hibernate將發(fā)出兩條SQL語(yǔ)句,分別為查詢藥品信息的SQL語(yǔ)句與查詢藥品類別的SQL語(yǔ)句,所以實(shí)例中采用內(nèi)連接將藥品信息與藥品類別信息一次加載出來(lái),減少了SQL語(yǔ)句,提高了數(shù)據(jù)庫(kù)的性能。10.2 藥品信息的添加與修改藥品編碼是藥品對(duì)象的一個(gè)標(biāo)識(shí),當(dāng)添加一個(gè)藥品信息時(shí),需要判斷此藥品是否已經(jīng)在數(shù)據(jù)庫(kù)中存在,如果存在則只需更新
52、藥品的數(shù)量即可,其添加流程如圖1.25所示添加藥品圖1.25藥品添加流程建品管理的Action類為MedicinpAction,它即承于BaseAction類,是保存到數(shù)據(jù)庫(kù)更新藥品數(shù)量L個(gè)DispatchAUion對(duì)象。此類的findMedlcineByMedNoO方法用于根據(jù)藥品編碼查詢藥品信息是否存在,當(dāng)所添加的藥品編碼存在時(shí),將跳轉(zhuǎn)到藥品更新頁(yè)面,否則跳轉(zhuǎn)到藥品添加頁(yè)面。MedicineAction類的add()方法用于添加或修改藥品信息。此方法所做的工作比較多,包含了判斷藥品信息是否存在、圖片上傳、保存藥品以及更新藥品等操作。此方法調(diào)用了MedicineDao類中的saveOrUpd
53、ate()方法,因此適用于藥品對(duì)象的添加與修改操作。其中上傳文件的命名采用日期時(shí)間格式,為防止重復(fù)實(shí)例中加入時(shí)間毫秒;上傳文件保存在Web目錄的upload文件夾中。10.2.2藥品添加頁(yè)面藥品添加有3個(gè)頁(yè)面,其中med_add.jsp頁(yè)面提供輸入藥品編號(hào)的表單;當(dāng)添加的藥品信息在數(shù)據(jù)庫(kù)中不存在時(shí),將通過(guò)med_save.jsp錄入藥品的詳細(xì)信息;當(dāng)所添加的藥品信息存在與數(shù)據(jù)庫(kù)中時(shí),經(jīng)通過(guò)med_update.jsp頁(yè)面更新藥品數(shù)量,如圖1.26所示。圖1.26更新藥品數(shù)量10.3 分頁(yè)查看所有藥品在添加藥品信息后,請(qǐng)求轉(zhuǎn)發(fā)到查看所有藥品信息,對(duì)所有藥品信息進(jìn)行分頁(yè)顯示。此操作通過(guò)Medici
54、neAction類的paging()方法進(jìn)行處理。此方法通過(guò)調(diào)用MedicineAction類繼承的getPage()方法進(jìn)行分頁(yè)查詢,在查詢后分別將結(jié)果集與分頁(yè)條放置到request中,并轉(zhuǎn)發(fā)到med_list.jsp頁(yè)面進(jìn)行顯示,如圖1.27所示。圖1.27med_list.jsp頁(yè)面10.4 查看藥品詳細(xì)信息在藥品列表中提供了查看藥品詳細(xì)的超鏈接,此鏈接作用于藥品名稱上,單擊此鏈接將進(jìn)入藥品查看請(qǐng)求中,該請(qǐng)求由MedicineAction類view()方法進(jìn)行處理。在view()方法中,首先通過(guò)傳遞的藥品id值查詢藥品對(duì)象,然后將查詢到藥品信息放置于request對(duì)象中,轉(zhuǎn)發(fā)到med_v
55、iew.jsp頁(yè)面進(jìn)行顯示,如圖1.28所示。圖1.28med_view.jsp頁(yè)面在med_view.jsp頁(yè)面中,通過(guò)<logic:empty>標(biāo)簽及<logic:notEmpty>標(biāo)簽對(duì)藥品圖片是否存在進(jìn)行邏輯判斷,當(dāng)藥品圖片存在時(shí),通過(guò)<bean:write>標(biāo)簽輸出圖片路徑,否則輸出提示信息。10.5 模糊查詢藥品為方便用戶查詢藥品,藥品信息管理模塊還提供了藥品的模糊查詢功能,即根據(jù)用戶所輸入的關(guān)鍵字信息,對(duì)藥品名稱、藥品描述等多個(gè)藥品屬性進(jìn)行模糊匹配,并分頁(yè)顯示模糊查詢后的結(jié)果集。10.5.1 藥品模糊查詢請(qǐng)求處理藥品模糊查詢通過(guò)Medicine
56、Action類的blurQuery()方法進(jìn)行處理。此方法根據(jù)提交的關(guān)鍵詞keyWord組合HQL語(yǔ)句,調(diào)用getPage()方法獲取查詢后的結(jié)果信息對(duì)象與分頁(yè)條對(duì)象。HQL的模糊查詢使用like作為關(guān)鍵字,此方法中分別對(duì)藥品名稱、藥品編碼、出廠地址及藥品描述進(jìn)行了模糊匹配。10.5.2 藥品模糊查詢頁(yè)面藥品模糊查詢頁(yè)面為med_list.jsp,此頁(yè)面包含輸入藥品信息的表單。為簡(jiǎn)化程序中的代碼,此表單并沒(méi)有使用Struts標(biāo)簽中的form表單,而采用了普通<form>標(biāo)簽進(jìn)行定義。此段代碼在項(xiàng)目中是一段可以重用的代碼,涉及到模糊查詢時(shí)可通過(guò)更改表單中的action來(lái)實(shí)現(xiàn)。當(dāng)在此表單中輸入模糊關(guān)鍵詞時(shí),單擊“查詢”按鈕,系統(tǒng)將進(jìn)行模糊查詢。例如,查詢的關(guān)鍵詞為“感冒”,其查詢結(jié)果如圖1.29所示。圖1.29模糊查詢
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年應(yīng)急救生系統(tǒng)項(xiàng)目合作計(jì)劃書
- 2025年水基聚合物防水涂料項(xiàng)目合作計(jì)劃書
- 智能交通系統(tǒng)建設(shè)工程施工合同
- 鹽城市房屋租賃合同
- 小學(xué)生品德教育讀后感
- 2025年飲料及冷飲服務(wù)項(xiàng)目發(fā)展計(jì)劃
- 妊娠紋的專業(yè)知識(shí)
- Isonicotinamide-Standard-生命科學(xué)試劑-MCE
- Direct-blue-6-生命科學(xué)試劑-MCE
- 2025年鞋用乳液膠粘劑項(xiàng)目建議書
- 如何在小學(xué)語(yǔ)文教學(xué)中落實(shí)單元語(yǔ)文要素
- 2024年演出經(jīng)紀(jì)人考試必背1000題附答案(黃金題型)
- 2024年知識(shí)競(jìng)賽-競(jìng)彩知識(shí)筆試參考題庫(kù)含答案
- 醫(yī)院DRG付費(fèi)知識(shí)培訓(xùn)課件
- 高考語(yǔ)文一輪復(fù)習(xí):文學(xué)類文本閱讀練習(xí)
- 安全員繼續(xù)教育考試題庫(kù)1000道附參考答案(完整版)
- (2024年)保安培訓(xùn)圖文課件
- 專題16.7 二次根式章末八大題型總結(jié)(拔尖篇)-八年級(jí)數(shù)學(xué)下冊(cè)(人教版)(解析版)
- 雷達(dá)干擾技術(shù)概述
- 如何提高調(diào)查研究能力
- 電網(wǎng)兩票培訓(xùn)課件
評(píng)論
0/150
提交評(píng)論