版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
編號(hào):時(shí)間:2021年x月x日書山有路勤為徑,學(xué)海無涯苦作舟頁(yè)碼:第頁(yè)醫(yī)藥銷售管理系統(tǒng)1系統(tǒng)分析 31.1開發(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定義ActionForm 83.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.xml 114.2配置struts-config.xml 124.3配置hibernate.cfg.xml 125實(shí)體及映射 125.1藥品實(shí)體映射 125.2藥品類別實(shí)體映射 135.3銷售明細(xì)實(shí)體映射 135.4用戶實(shí)體映射 146公共類設(shè)計(jì) 146.1Hibernate過濾器 146.2SupperDao類 166.3BaseAction類 176.4DeleteAction類 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)求處理 219.2.2類別添加頁(yè)面 219.3分頁(yè)查看類別信息 219.3.1查詢與刪除請(qǐng)求處理 229.3.2類別信息列表頁(yè)面 229.4類別的修改與刪除 229.5藥品類別統(tǒng)計(jì) 229.5.1JFreeChat工具類 239.5.2Action請(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í)查詢 2710.7查看庫(kù)存 2710.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)模式,節(jié)省了物理資源,提高了工作效率。1.1開發(fā)背景XX醫(yī)藥抄手坐落于XX小區(qū)內(nè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)理委托,開發(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)的手工方式來處理這些信息,操作比較繁瑣,且效率低下。此時(shí),一套合理、有效、實(shí)用的醫(yī)藥銷售管理系統(tǒng)就顯得十分必要。利用其提供的藥品查詢、統(tǒng)計(jì)功能,可以進(jìn)行高效的管理,更好地為顧客服務(wù)。筆者通過對(duì)醫(yī)藥超市的實(shí)地考察,從經(jīng)營(yíng)者和消費(fèi)者的角度出發(fā),以高效管理、快速滿足消費(fèi)者為原則,要求本系統(tǒng)具有以下特點(diǎn)?!锞哂辛己玫南到y(tǒng)性能、友好的用戶界面?!镙^高的處理效率,便于用戶使用?!锊捎贸墒斓募夹g(shù)開發(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)潔美觀?!锵到y(tǒng)提供中、英文語言,實(shí)現(xiàn)國(guó)際化★藥品分類管理,并提供類別統(tǒng)計(jì)功能。★實(shí)現(xiàn)各種查詢,如多條件查詢、模糊查詢等。★提供創(chuàng)建管理員賬戶及修改口令功能?!锟蓪?duì)系統(tǒng)銷售信息進(jìn)行統(tǒng)計(jì)分析?!锵到y(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所示醫(yī)藥銷售管理系統(tǒng)醫(yī)藥銷售管理系統(tǒng)基本信息管理進(jìn)貨/需求管理藥品銷售管理系統(tǒng)管理藥品信息管理藥品類別管理庫(kù)存信息查看藥品需求管理藥品進(jìn)貨管理銷售明細(xì)管理銷售排行統(tǒng)計(jì)銷售時(shí)間統(tǒng)計(jì)系統(tǒng)初始化管理員帳號(hào)管理圖1.1醫(yī)藥銷售管理系統(tǒng)功能結(jié)構(gòu)圖2.3系統(tǒng)流程圖醫(yī)藥銷售管理系統(tǒng)流程如圖1.2所示。管理員登錄醫(yī)藥銷售管理系統(tǒng)管理員登錄醫(yī)藥銷售管理系統(tǒng)管理員進(jìn)貨/需求管理基本信息管理藥品銷售管理系統(tǒng)管理藥品信息管理刪除藥品藥品類別管理查詢藥品修改藥品添加藥品修改類別查詢類別刪除類別添加類別修改需求查詢需求刪除需求添加需求銷售排行統(tǒng)計(jì)查詢銷售明細(xì)當(dāng)日銷售明細(xì)庫(kù)存修改系統(tǒng)初始化查詢管理員密碼修改添加管理員類別統(tǒng)計(jì)圖1.2醫(yī)藥銷售管理系統(tǒng)流程圖3軟件架構(gòu)在開發(fā)項(xiàng)目前,首先要對(duì)軟件的結(jié)構(gòu)進(jìn)行設(shè)計(jì),也稱之為軟件架構(gòu)。此過程是對(duì)軟件整體結(jié)構(gòu)的設(shè)計(jì),如軟件的邏輯分層結(jié)構(gòu)、結(jié)構(gòu)的實(shí)現(xiàn)、數(shù)據(jù)庫(kù)等,特別是在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所示。醫(yī)藥銷售管理系統(tǒng)醫(yī)藥銷售管理系統(tǒng)表示層(Struts框架)業(yè)務(wù)邏輯層(Struts框架)持久層(Hibernate框架)數(shù)據(jù)庫(kù)層(MySQL數(shù)據(jù)庫(kù))圖1.3邏輯分層其中,表示層與業(yè)務(wù)邏輯層均由Struts框架組成,表示層用于提供程序與用戶交互的界面,項(xiàng)目中主要通過JSP、ActionForm及Struts標(biāo)簽庫(kù)進(jìn)行展現(xiàn);業(yè)務(wù)邏輯層用于處理程序中的各種業(yè)務(wù)邏輯,項(xiàng)目中通過Struts框架的中央控制器及Action對(duì)象對(duì)業(yè)務(wù)請(qǐng)求進(jìn)行處理;持久層由Hibernate框架組成,負(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所示。醫(yī)藥銷售管理系統(tǒng)醫(yī)藥銷售管理系統(tǒng)視圖JSP、ActionForm、Struts標(biāo)簽控制器Action、struts-config.xml持久化HibernateAPI、Hibernate.cfg.xmlMySQL數(shù)據(jù)圖1.4邏輯分層實(shí)現(xiàn)3.2系統(tǒng)文件夾組織結(jié)構(gòu)規(guī)范系統(tǒng)的整體架構(gòu)是一個(gè)項(xiàng)目開發(fā)的標(biāo)準(zhǔn),特別是在團(tuán)隊(duì)開發(fā)項(xiàng)目中,在編寫代碼之前,必須定制好項(xiàng)目的系統(tǒng)文件夾組織結(jié)構(gòu),以使程序條理清晰,利于后期的項(xiàng)目整合。在Java項(xiàng)目中可以將不同作用、功能相類似的文件放置于同一個(gè)包中,這樣既可以保證團(tuán)隊(duì)開發(fā)的一致性,又可以將系統(tǒng)的整體結(jié)構(gòu)規(guī)范化。創(chuàng)建完系統(tǒng)中可能用到的文件夾或Java包之后,在開發(fā)時(shí)只需將所創(chuàng)建的類文件或資源文件保存到相應(yīng)的文件夾即可。醫(yī)藥銷售管理系統(tǒng)的文件夾組織結(jié)構(gòu)如圖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),并通過O/R映射建立實(shí)體與數(shù)據(jù)庫(kù)的聯(lián)系,Hibernate完全通過操作實(shí)體來操作數(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ì)象,它們所對(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,主要用來保存用戶所輸入的表單數(shù)據(jù),Action要獲取這些數(shù)據(jù)需要通過ActionForm對(duì)象進(jìn)行傳遞。ActionForm對(duì)表單的數(shù)據(jù)進(jìn)行了封裝,在JSP頁(yè)面與Action對(duì)象中提供了交互訪問的方法。在使用過程中,可通過繼承org.apache.struts.action.ActionForm對(duì)象來創(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)通過Hibernate框架進(jìn)行設(shè)計(jì)。由于Hibernate對(duì)不同對(duì)象的增、刪、改、查等操作具有一定的共性,如添加數(shù)據(jù)使用save()方法、刪除數(shù)據(jù)使用delete()方法等,項(xiàng)目中將這些具有共性的操作抽取出來,封裝成一個(gè)類,其他數(shù)據(jù)庫(kù)操作對(duì)象可繼承此類來?yè)碛羞@些方法,從而減少程序中的多余代碼,如圖1.8所示。圖1.8持久層結(jié)構(gòu)SupperDao類為所有數(shù)據(jù)庫(kù)操作對(duì)象的父類,在此類中定義了對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作的常用方法,具體方法及說明如表1.1所示。表1.1SupperDao方法及說明方法說明save()用于保存一個(gè)對(duì)象saveOrUpdate()用于保存或更新一個(gè)對(duì)象delete(Objectobj)用于刪除一個(gè)對(duì)象,入口參數(shù)為Object類型findByHQL()通過HQL語句查詢數(shù)據(jù),入口參數(shù)為String類型的HQL語句deleteByHQL()通過HQL語句刪除數(shù)據(jù),入口參數(shù)為String類型的HQL語句uniqueResult()單值檢索數(shù)據(jù),入口參數(shù)hql為HQL查詢語句、where為查詢條件findPaging()分頁(yè)查詢數(shù)據(jù),入口參數(shù)hql為HQL查詢語句、offset為結(jié)果集的起始位置、length為返回結(jié)果集的條目數(shù)、where為查詢條件這些方法均為數(shù)據(jù)庫(kù)操作的常用方法,所以將其封裝在單獨(dú)的一個(gè)類中,對(duì)于各個(gè)對(duì)象的數(shù)據(jù)庫(kù)相關(guān)操作,可通過繼承此類來獲取這些常用方法。其子類對(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ù)操作方法。UserDao類:用戶數(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)主要通過Struts框架進(jìn)行設(shè)計(jì),由Struts的中央控制器對(duì)各種操作請(qǐng)求進(jìn)行控制,并通過相應(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)目中通過繼承這幾個(gè)對(duì)象實(shí)現(xiàn)對(duì)不同業(yè)務(wù)請(qǐng)求的處理。除這3個(gè)對(duì)象外,圖1.9中其余的Action對(duì)象均為自定義的Action對(duì)象。在這些自定義的Action對(duì)象中,LanguageAction與LoginAction用于處理國(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ì)象通過繼承不必再考慮用戶登錄的安全問題,而更專注于業(yè)務(wù)邏輯,同時(shí)通過繼承還可以減少程序的代碼量。其中BaseAction對(duì)象的子類及作用如表1.2所示。表1.2BaseAction對(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ì)象,此類通過重寫getKeyMethodMap()方法對(duì)數(shù)據(jù)進(jìn)行批量刪除操作,其子類對(duì)象及其作用如表1.3所示。表1.3DeleteAction對(duì)象的子類及其作用子類作用DeleteMedicineAction封裝藥品信息刪除操作,用于批量刪除藥品信息DeleteReqMedAction封裝藥品需求信息刪除操作,用于批量刪除藥品需求信息3.7頁(yè)面結(jié)構(gòu)設(shè)計(jì)醫(yī)藥銷售管理系統(tǒng)的頁(yè)面結(jié)構(gòu)采用框架進(jìn)行設(shè)計(jì),通過HTML語言中的<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è)面頭部”和“頁(yè)面導(dǎo)航”在登錄之后是固定不變的,對(duì)于用戶的操作將在“內(nèi)容頁(yè)面”顯示結(jié)果。使用這種方式的有點(diǎn)在于:(1)避免了JSP頁(yè)面中大量引用<include>動(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)目開發(fā)之前,需要添加其類庫(kù)支持。4.1配置web.xmlweb.xml文件是Web項(xiàng)目的配置文件,在醫(yī)藥銷售管理系統(tǒng)中,此文件需要配置Struts框架、JFreeChart組件和過濾器等信息。4.2配置struts-config.xmlStruts框架實(shí)現(xiàn)了MVC模式,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配置hibernate.cfg.xmlHibernate.cfg.xml文件是Hibernate的配置文件,在項(xiàng)目中,此文件配置了數(shù)據(jù)庫(kù)的方言、數(shù)據(jù)庫(kù)鏈接信息、自動(dòng)建表屬性和打印SQL語句等屬性。5實(shí)體及映射Hibernate是一個(gè)ORM產(chǎn)品,它完全可以操作對(duì)象的方式進(jìn)行數(shù)據(jù)庫(kù)操作,其實(shí)體對(duì)象與數(shù)據(jù)表之間通過映射文件建立映射關(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類中加入了藥品類別屬性category,其關(guān)聯(lián)關(guān)系通過映射文件Medicine.hbm.xml進(jìn)行映射。映射文件Medicine.hbm.xml將實(shí)體對(duì)象Medicine映射為tb_medicine表,主鍵的生成策略采用自動(dòng)生成方式。此映射文件中,對(duì)于數(shù)據(jù)表的部分字段還通過not-null、length、unique等屬性映射字段的屬性,其中not-null用于映射字段的非空屬性、length用于映射字段的長(zhǎng)度、unique用于映射字段是否唯一。映射后的數(shù)據(jù)表如圖1.11所示。圖1.11tb_medicine表5.2藥品類別實(shí)體映射藥品類別實(shí)體用于封裝藥品類別屬性信息,其持久化類為Category類,與藥品對(duì)象存在一對(duì)多關(guān)聯(lián)關(guān)系。藥品對(duì)象與藥品類別對(duì)象為多對(duì)一關(guān)聯(lián)關(guān)系,但從藥品類別一端來看,藥品類別對(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ù)量等。這些信息十分重要,需要記錄到數(shù)據(jù)庫(kù)中,實(shí)例中將其封裝為SellDetail類。為了方便查看銷售明細(xì)的總額信息,在SellDetail類中加入了sellTotal()屬性,此屬性并不進(jìn)行數(shù)據(jù)表的映射,它只有一個(gè)與之對(duì)應(yīng)的get()方法,在此方法中通過單價(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中,通過兩個(gè)<many-to-one>標(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ì)較少,其映射過程也相對(duì)簡(jiǎn)單。其映射文件為User.hbm.xml。用戶實(shí)體所映射的數(shù)據(jù)表為tb_user,其結(jié)構(gòu)如圖1.14所示。圖1.14tb_user表6公共類設(shè)計(jì)在Java程序開發(fā)中,如果一個(gè)功能反復(fù)被調(diào)用,則可將該功能抽取出來封裝為一個(gè)類作為公共類,在需要此功能的地方通過此類進(jìn)行實(shí)現(xiàn)。公共類實(shí)質(zhì)是代碼的重用的一種方式,在面向?qū)ο蟮拈_發(fā)模式中經(jīng)常使用它來簡(jiǎn)化程序中的代碼,提高程序的可讀性。下面是醫(yī)藥銷售管理系統(tǒng)找那個(gè)的公共類設(shè)計(jì)。6.1Hibernate過濾器在沒有使用Spring管理Hibernate的情況下,對(duì)Hibernate的管理仍然存在一定的難度,特別是在J2EE開發(fā)中,線程安全、SessionFactory對(duì)象、Session對(duì)象、Hibernate緩存及延遲加載等是程序設(shè)計(jì)中的難題,管理不當(dāng)將會(huì)對(duì)程序造成極為嚴(yán)重的影響。在醫(yī)藥銷售管理系統(tǒng)中,將SessionFactory對(duì)象、Session對(duì)象置于過濾器中,由過濾器對(duì)其進(jìn)行管理,從而解決了這些問題。在Web項(xiàng)目中,以普通方式使用Hibernate將無法解決Hibernate延遲加載,如圖1.15所示。當(dāng)有一個(gè)業(yè)務(wù)請(qǐng)求查詢數(shù)據(jù)時(shí),首先要開啟Session對(duì)象,然后Hibernate對(duì)數(shù)據(jù)進(jìn)行查詢。在關(guān)閉Session對(duì)象,最后通過JSP頁(yè)面來顯示數(shù)據(jù)。在這一過程中,如果查詢數(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)行操作。開啟Session開啟Session查詢數(shù)據(jù)(Lazy)關(guān)閉SessionJSP頁(yè)面業(yè)務(wù)請(qǐng)求圖1.15普通方式通過過濾器管理Hibernate的Session對(duì)象則可以避免此問題,其實(shí)現(xiàn)過程如圖1.16所示。業(yè)務(wù)請(qǐng)求業(yè)務(wù)請(qǐng)求Init()方法初始化SessionFactorydoFilter()過濾處理業(yè)務(wù)處理destroy()方法銷毀SessionFactoryJSP頁(yè)面SessinFactory關(guān)閉SessionResponseResponseRequestRequest圖1.16Hibernate過濾器在Web容器啟動(dòng)時(shí),過濾器被初始化,它將執(zhí)行init()方法,在后續(xù)的操作中不會(huì)再次被執(zhí)行;而當(dāng)容器關(guān)閉時(shí),過濾器將執(zhí)行destroy()方法。這兩個(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è)過濾器。為了保證線程的安全性,實(shí)例中將Session對(duì)象存放與ThreadLocal對(duì)象中,當(dāng)用到一個(gè)Session對(duì)象時(shí),首先從ThreadLocal中獲取,在無法獲取的情況下才會(huì)開啟一個(gè)新的Session對(duì)象。同時(shí),為了保證Session對(duì)象能在resopnse請(qǐng)求轉(zhuǎn)發(fā)到View層之前被關(guān)閉,實(shí)例采取了try…finally語句對(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í)值來判斷保存還是更新操作。SupperDao類中使用這兩個(gè)方法對(duì)實(shí)體對(duì)象進(jìn)行保存及更新操作。刪除操作的方法為delete(),入口參數(shù)為Object類型,此方法通過Session接口的delete()方法進(jìn)行實(shí)現(xiàn)。SupperDao類為項(xiàng)目中所有數(shù)據(jù)庫(kù)操作類的父類,在設(shè)計(jì)時(shí)應(yīng)當(dāng)考慮全面。Hibernate的HQL查詢語言提供了更為靈活的查詢方式,在這個(gè)超類之中應(yīng)該加入HQL的操作方法,其中findByHQL()方法用于根據(jù)指定的HQL查詢語句查詢結(jié)果集,deleteByHQL()方法用于根據(jù)指定的HQL查詢語句進(jìn)行刪除操作。Hibernate單值檢索在查詢后返回單個(gè)對(duì)象,當(dāng)返回的結(jié)果包含多條數(shù)據(jù)時(shí),Hibernate將拋出異常。此種操作可用于查詢單條數(shù)據(jù),如聚合函數(shù)count()等。在SupperDao類中,單值檢索的方法為uniqueResult()。此方法的入口參數(shù)為HQL查詢語句及查詢條件,其中查詢條件為Object[]數(shù)組類型,用于裝載查詢語句中的參數(shù)。例如HQL語句“fromMedicinemwherem.id=?”,此時(shí)即可通過參數(shù)where對(duì)其進(jìn)行動(dòng)態(tài)賦值。分頁(yè)查詢?cè)诔绦蜷_發(fā)中經(jīng)常用到,不但方便查看,還可以減少結(jié)果集的返回?cái)?shù)量,提高數(shù)據(jù)訪問效率。使用Hibernate的分頁(yè)查詢方法極為簡(jiǎn)單,只需要傳入幾個(gè)參數(shù)即可,但在SupperDao類中對(duì)其進(jìn)行了擴(kuò)展,加入了HQL語句的動(dòng)態(tài)賦值,其方法名為findPaging()。此方法入口參數(shù)有4個(gè),其中參數(shù)hql為HQL查詢語句,它允許傳入?yún)?shù)中帶有占位符“?”的HQL語句;參數(shù)offset為查詢結(jié)果集對(duì)象的起始位置;參數(shù)length為查詢結(jié)果的偏移量,也是返回?cái)?shù)據(jù)的條目數(shù);參數(shù)where為查詢條件,屬于Object[]數(shù)組類型,用于裝載HQL語句中的參數(shù)。通過上述這幾個(gè)參數(shù)基本可以滿足項(xiàng)目中所有的分頁(yè)查詢,當(dāng)然遇到特殊情況時(shí),可以通過子類對(duì)象重寫此方法。6.3BaseAction類BaseAction類是業(yè)務(wù)層,有一個(gè)超類對(duì)象,它繼承了Struts的DispatchAction類,同時(shí)還為子類對(duì)象提供公用方法。此類首先定義了3個(gè)protected類型的變量,分別用于設(shè)置每頁(yè)的記錄數(shù)、本地語言信息及國(guó)際化消息資源。Struts的DispatchAction類繼承了Action類,此類處理請(qǐng)求時(shí)首先要執(zhí)行execute()方法,然后通過控制器再轉(zhuǎn)發(fā)到相應(yīng)的方法進(jìn)行業(yè)務(wù)處理。根據(jù)這一分析,可以在execute()方法中對(duì)用戶的身份作出驗(yàn)證,其實(shí)現(xiàn)過程如圖1.17所示。業(yè)務(wù)請(qǐng)求一業(yè)務(wù)請(qǐng)求一業(yè)務(wù)請(qǐng)求三業(yè)務(wù)請(qǐng)求二業(yè)務(wù)請(qǐng)求四業(yè)務(wù)處理二業(yè)務(wù)處理三業(yè)務(wù)處理一業(yè)務(wù)處理四Execute()方法驗(yàn)證用戶身份錯(cuò)誤處理驗(yàn)證失敗驗(yàn)證成功驗(yàn)證成功圖1.17用戶身份驗(yàn)證如果對(duì)系統(tǒng)中涉及到的Action均編寫一個(gè)驗(yàn)證方法,則程序代碼的重復(fù)性太高,不能體現(xiàn)出面向?qū)ο蟮脑O(shè)計(jì)模式,所以需將其單獨(dú)封裝在BaseAction類中,此類通過重寫Action類的execute()方法對(duì)用戶身份進(jìn)行驗(yàn)證。由于分頁(yè)查詢的應(yīng)用比較多,所以在業(yè)務(wù)層將其封裝在BaseAction類中,通過getPage()方法進(jìn)行實(shí)現(xiàn),子類對(duì)象可以通過繼承來獲取此方法。getPage()方法返回一個(gè)Map集合對(duì)象,該集合用于裝載結(jié)果集及分頁(yè)條。其中,結(jié)果集對(duì)象為一頁(yè)中的所有數(shù)據(jù)集合,它是一個(gè)List對(duì)象;分頁(yè)條為分頁(yè)查詢后在JSP頁(yè)面所顯示的分頁(yè)信息,如記錄數(shù)、頁(yè)碼、上一頁(yè)、下一頁(yè)的超鏈接等,它是一個(gè)String類型的字符串。getPage()方法的入口參數(shù)有四個(gè),其中參數(shù)hql為分頁(yè)查詢的HQL語句,此語句不可以包括select子句,它從from子句開始,可以傳入帶有占位符的HQL,但需要通過查詢條件參數(shù)where傳遞占位符的值,當(dāng)HQL語句沒有參數(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)中,通過這些參數(shù),getPage()方法已滿足所有的分頁(yè)查詢,用到分頁(yè)查詢的地方都調(diào)用了此方法。此外,在其他項(xiàng)目中此方法的重用價(jià)值也是非常高的。分頁(yè)查詢?cè)跇I(yè)務(wù)層的實(shí)現(xiàn)比較繁瑣,因?yàn)樵诜猪?yè)條中要考慮到國(guó)際化的實(shí)現(xiàn),所以在分頁(yè)條中所有文字信息均通過MessageResources對(duì)象讀取國(guó)際化資源文件來獲取。MessageResources對(duì)象是Struts中的對(duì)象,此對(duì)象根據(jù)Locale信息讀取相應(yīng)的國(guó)際化消息資源文件。6.4DeleteAction類公共類DeleteAction主要用于對(duì)項(xiàng)目中LookupDispatchAction的請(qǐng)求進(jìn)行處理。它繼承了LookupDispatchAction類,重寫了execute()方法對(duì)用戶的身份作出驗(yàn)證,當(dāng)用戶身份驗(yàn)證失敗時(shí)將進(jìn)行錯(cuò)誤處理;同時(shí),此類還重寫了LookupDispatchAction類中的getKeyMethodMap()方法,添加了兩個(gè)按鈕對(duì)象的key。6.5字符串工具類在一個(gè)Web項(xiàng)目中,字符串是經(jīng)常被操作的對(duì)象。為了簡(jiǎn)化程序的代碼及提高程序的可讀性,對(duì)于經(jīng)常用到的字符串處理方法,可以封裝一個(gè)字符串工具類對(duì)其進(jìn)行操作。例如JSP頁(yè)面的多選框,它提交的參數(shù)值為數(shù)組類型,在數(shù)據(jù)庫(kù)的操作過程中需要將其轉(zhuǎn)換為字符串類型;在超鏈接中,如果加入中文參數(shù)將不能被瀏覽器解析,需要對(duì)其進(jìn)行一定的處理才可以使用。類似于這種操作在程序中使用的非常頻繁,將其封裝為一個(gè)公共類無疑是一種較好的解決方案。在醫(yī)藥銷售管理系統(tǒng)中,封裝了一個(gè)名為StringUtil的字符串工具類,用于對(duì)字符的特殊處理。此類中均為靜態(tài)方法。在HQL語句中,如果刪除多個(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ó)家的語言構(gòu)建本地化的頁(yè)面,方便不同國(guó)家、不同語言的用戶瀏覽訪問。在醫(yī)藥銷售管理系統(tǒng)中,分別構(gòu)建了中文和英文兩種語言環(huán)境,根據(jù)使用者瀏覽器的默認(rèn)語言環(huán)境呈現(xiàn)不同的語言顯示方式。7.1國(guó)際化資源文件醫(yī)藥銷售管理系統(tǒng)對(duì)所有涉及到語言信息的地方均進(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)換為Unicode編碼格式的工具,在命令窗口中直接輸入“native2ascii”,再輸入中文,然后按回車鍵,將輸出中文對(duì)應(yīng)的Unicode碼。7.2國(guó)際化實(shí)現(xiàn)實(shí)例中除了對(duì)用戶瀏覽器語言的自動(dòng)匹配外,還為使用者提供了中文和英文的語言鏈接,用戶在使用過程中可對(duì)語言進(jìn)行自動(dòng)切換。此請(qǐng)求由LanguageAction類進(jìn)行處理。本地語言信息存放在Session會(huì)話中的Globals.LOCALE_KEY值中,它是Struts的默認(rèn)配置,可以通過Strtus的API幫助文檔和源碼得到。對(duì)于中、英文兩種請(qǐng)求,實(shí)例中分別創(chuàng)建了中、英文所對(duì)應(yīng)的Locale對(duì)象,并將其設(shè)置到Globals.LOCALE_KEY值中,實(shí)現(xiàn)了語言的自動(dòng)切換。8系統(tǒng)登陸模塊系統(tǒng)登錄是一個(gè)用戶身份驗(yàn)證的過程,只有登錄成功的用戶才可以對(duì)系統(tǒng)進(jìn)行操作,否則不能對(duì)系統(tǒng)進(jìn)行管理維護(hù)。形象地說,它就是系統(tǒng)的一道安全門。8.1查詢用戶創(chuàng)建名為UserDao的類,封裝對(duì)用戶及系統(tǒng)級(jí)的數(shù)據(jù)操作。在此類中編寫login()方法,用于根據(jù)用戶名及密碼查詢用戶對(duì)象。在用戶登錄的過程中,需要判斷數(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)行驗(yàn)證。UserForm對(duì)象為用戶ActionForm對(duì)象,Struts自動(dòng)將JSP頁(yè)面表單信息封裝在此對(duì)象中,所以可以直接獲取ActionForm對(duì)象中的屬性信息。LoginAction類通過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è)面中,首先通過<logic:notEmpty>標(biāo)簽判斷是否存在error值,如果存在即表示用戶登錄發(fā)生錯(cuò)誤,將在登錄頁(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è)查詢所有藥品類別信息的方法——findAllCategory()。為方便藥品類別數(shù)據(jù)的統(tǒng)計(jì),實(shí)例中對(duì)藥品類別中藥品的數(shù)量進(jìn)行統(tǒng)計(jì)的操作被定義在findCategoryAndCount(),由HQL語句的內(nèi)連接查詢進(jìn)行實(shí)現(xiàn)。findCategoryAndCount()方法中的hql屬性為內(nèi)連接查詢語句,可對(duì)藥品數(shù)量按藥品類別進(jìn)行分組統(tǒng)計(jì),查詢后返回其結(jié)果集對(duì)象。9.2藥品類別的添加藥品類別的添加是指將藥品類別信息寫入數(shù)據(jù)庫(kù),實(shí)現(xiàn)過程如下。9.2.1類別添加、修改請(qǐng)求處理實(shí)例中將藥品類別的相關(guān)請(qǐng)求封裝在CategoryAction類中,此類繼承了BaseAction對(duì)象,所以在對(duì)類別信息進(jìn)行處理時(shí),不必考慮用戶是否登錄的安全問題。此類中處理添加類別信息請(qǐng)求的方法為add(),由于CategoryAction類是一個(gè)DispatchAction對(duì)象,所以當(dāng)請(qǐng)求的參數(shù)為add時(shí),將由此方法進(jìn)行處理。此方法調(diào)用了CategoryDao對(duì)象的saveOrUpdate()方法,所以藥品類別信息的添加與修改操作均可通過此方法進(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屬性值,如果此屬性不為空,則意味著操作為修改操作。類別添加頁(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為查詢語句,由于它不含有占位符參數(shù),所以getPage()方法的條件參數(shù)設(shè)置為null.9.3.2類別信息列表頁(yè)面category_list.jsp是類別信息列表頁(yè)面,在此頁(yè)面中使用Struts的標(biāo)簽對(duì)藥品類別信息進(jìn)行迭代輸出。在程序開發(fā)過程中,應(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è)置超鏈接中的參數(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(),此方法通過類別id加載藥品類別對(duì)象將類別信息保存到CategoryForm對(duì)象中,最后轉(zhuǎn)發(fā)到編輯頁(yè)面。此方法在加載類別信息后,會(huì)將頁(yè)面轉(zhuǎn)到類別添加頁(yè)面,因?yàn)轭悇e添加請(qǐng)求處理的方法調(diào)用了Hibernate的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)過程如下:9.5.1JFreeChat工具類創(chuàng)建名為ChartUtil的類,用于生成制圖對(duì)象JFreeChat。其中categoryChart()方法用于生成藥品類別統(tǒng)計(jì)的餅形圖對(duì)象,其入口參數(shù)為裝載結(jié)果集的List集合對(duì)象。此方法中,通過傳遞的List集合對(duì)象生成DefaultPieDataset數(shù)據(jù)集合,然后使用制圖工廠ChartFactory創(chuàng)建餅形圖JFreeChart對(duì)象,并將其返回。9.5.2Action請(qǐng)求藥品類別統(tǒng)計(jì)請(qǐng)求由CategoryAction類的findCategoryAndCound()方法進(jìn)行處理,此方法首先通過CategoryDao對(duì)象統(tǒng)計(jì)藥品類別信息,獲取結(jié)果集對(duì)象后,通過ChartUtil類的categoryChart()方法生成制圖對(duì)象,最后將生成的圖片路徑放置到request中。9.5.3顯示報(bào)表藥品類別統(tǒng)計(jì)信息通過category_graph.jsp頁(yè)面進(jìn)行顯示,此頁(yè)面通過<bean:write>標(biāo)簽獲取所生成圖片的路徑。為避免空指針錯(cuò)誤,category_graph.jsp頁(yè)面使用<logic:notEmpty>標(biāo)簽判斷生成的圖片路徑是否存在,其運(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及藥品編碼查詢藥品信息;loadMedicineAndCategory()方法用于查詢藥品信息與藥品類別信息。loadMedicineAndCategory()方法使用內(nèi)連接對(duì)藥品信息表與藥品類別表進(jìn)行聯(lián)合查詢,可以減少SQL語句的數(shù)量。藥品實(shí)體與藥品類別實(shí)體存在多對(duì)一的關(guān)聯(lián)關(guān)系,當(dāng)同時(shí)查看藥品信息與藥品類別信息時(shí),Hibernate將發(fā)出兩條SQL語句,分別為查詢藥品信息的SQL語句與查詢藥品類別的SQL語句,所以實(shí)例中采用內(nèi)連接將藥品信息與藥品類別信息一次加載出來,減少了SQL語句,提高了數(shù)據(jù)庫(kù)的性能。10.2藥品信息的添加與修改藥品編碼是藥品對(duì)象的一個(gè)標(biāo)識(shí),當(dāng)添加一個(gè)藥品信息時(shí),需要判斷此藥品是否已經(jīng)在數(shù)據(jù)庫(kù)中存在,如果存在則只需更新藥品的數(shù)量即可,其添加流程如圖1.25所示。添加藥品添加藥品保存到數(shù)據(jù)庫(kù)更新藥品數(shù)量判斷是否存在不存在存在圖1.25藥品添加流程10.2.1藥品添加的請(qǐng)求處理藥品管理的Action類為MedicineAction,它繼承于BaseAction類,是一個(gè)DispatchAction對(duì)象。此類的findMedicineByMedNo()方法用于根據(jù)藥品編碼查詢藥品信息是否存在,當(dāng)所添加的藥品編碼存在時(shí),將跳轉(zhuǎn)到藥品更新頁(yè)面,否則跳轉(zhuǎn)到藥品添加頁(yè)面。MedicineAction類的add()方法用于添加或修改藥品信息。此方法所做的工作比較多,包含了判斷藥品信息是否存在、圖片上傳、保存藥品以及更新藥品等操作。此方法調(diào)用了MedicineDao類中的saveOrUpdate()方法,因此適用于藥品對(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í),將通過med_save.jsp錄入藥品的詳細(xì)信息;當(dāng)所添加的藥品信息存在與數(shù)據(jù)庫(kù)中時(shí),經(jīng)通過med_update.jsp頁(yè)面更新藥品數(shù)量,如圖1.26所示。圖1.26更新藥品數(shù)量10.3分頁(yè)查看所有藥品在添加藥品信息后,請(qǐng)求轉(zhuǎn)發(fā)到查看所有藥品信息,對(duì)所有藥品信息進(jìn)行分頁(yè)顯示。此操作通過MedicineAction類的paging()方法進(jìn)行處理。此方法通過調(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()方法中,首先通過傳遞的藥品id值查詢藥品對(duì)象,然后將查詢到藥品信息放置于request對(duì)象中,轉(zhuǎn)發(fā)到med_view.jsp頁(yè)面進(jìn)行顯示,如圖1.28所示。圖1.28med_view.jsp頁(yè)面在med_view.jsp頁(yè)面中,通過<logic:empty>標(biāo)簽及<logic:notEmpty>標(biāo)簽對(duì)藥品圖片是否存在進(jìn)行邏輯判斷,當(dāng)藥品圖片存在時(shí),通過<bean:write>標(biāo)簽輸出圖片路徑,否則輸出提示信息。10.5模糊查詢藥品為方便用戶查詢藥品,藥品信息管理模塊還提供了藥品的模糊查詢功能,即根據(jù)用戶所輸入的關(guān)鍵字信息,對(duì)藥品名稱、藥品描述等多個(gè)藥品屬性進(jìn)行模糊匹配,并分頁(yè)顯示模糊查詢后的結(jié)果集。10.5.1藥品模糊查詢請(qǐng)求處理藥品模糊查詢通過MedicineAction類的blurQuery()方法進(jìn)行處理。此方法根據(jù)提交的關(guān)鍵詞keyWord組合HQL語句,調(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)化程序中的代碼,此表單并沒有使用Struts標(biāo)簽中的form表單,而采用了普通<form>標(biāo)簽進(jìn)行定義。此段代碼在項(xiàng)目中是一段可以重用的代碼,涉及到模糊查詢時(shí)可通過更改表單中的action來實(shí)現(xiàn)。當(dāng)在此表單中輸入模糊關(guān)鍵詞時(shí),單擊“查詢”按鈕,系統(tǒng)將進(jìn)行模糊查詢。例如,查詢的關(guān)鍵詞為“感冒”,其查詢結(jié)果如圖1.29所示。圖1.29模糊查詢藥品10.6高級(jí)查詢使用模糊查詢返回的數(shù)據(jù)結(jié)果集可能比較復(fù)雜,不方便尋找某一確切的藥品。此時(shí)高級(jí)查詢便派上了用場(chǎng),此查詢可以根據(jù)藥品的多個(gè)屬性信息來查詢一個(gè)確切的的藥品對(duì)象,例如輸入一個(gè)藥品的名稱、藥品編碼及其他屬性,可進(jìn)行更為具體的查詢。實(shí)例中通過MedicineAction類的query()方法對(duì)高級(jí)查詢請(qǐng)求進(jìn)行處理,此方法通過MedicineForm對(duì)象構(gòu)造查詢條件,并調(diào)用getPage()方法對(duì)查詢后的結(jié)果集進(jìn)行分頁(yè)顯示。10.7查看庫(kù)存為了方便操作人員了解藥品的庫(kù)存數(shù)量,本系統(tǒng)中提供了對(duì)庫(kù)存數(shù)量的檢索功能,即通過比較運(yùn)算符查詢相應(yīng)的庫(kù)存數(shù)量,如圖1.30所示。圖1.30查看庫(kù)存MedicineAction類的QueryMedCount()方法用于處理庫(kù)存數(shù)量的查詢請(qǐng)求,此方法通過參數(shù)type判斷其查詢的類型,并構(gòu)造相應(yīng)的HQL查詢語句。10.8藥品批量刪除藥品批量刪除操作使用LookUpDispatchAction對(duì)象進(jìn)行處理,此操作通過Struts的資源文件,映射JSP頁(yè)面與LookUpDispatchAction對(duì)象之間的請(qǐng)求關(guān)系,其實(shí)現(xiàn)原理如圖1.31所示。業(yè)務(wù)方法業(yè)務(wù)方法業(yè)務(wù)方法MapKeyvalueLookupDispatchAction“刪除全部”按鈕“刪除所選”按鈕JSP頁(yè)面Struts資源文件Button.delete.allButton.delete.selected圖1.31LookUpDispatchAction實(shí)現(xiàn)批量刪除Struts的資源文件中定義了兩個(gè)key,它們所對(duì)應(yīng)的值分別為“刪除所選”、“刪除全選”,二者將映射至JSP頁(yè)面中的按鈕;同時(shí)二者還對(duì)應(yīng)LookUpDispatchAction對(duì)象中的Map集合,此集合中key對(duì)應(yīng)資源文件中的key值,value對(duì)應(yīng)LookUpDispatchAction對(duì)象中的業(yè)務(wù)方法,當(dāng)單擊頁(yè)面中的一個(gè)按鈕時(shí),將觸發(fā)LookUpDispatchAction對(duì)象的相應(yīng)方法。10.8.1批量刪除請(qǐng)求處理處理批量刪除請(qǐng)求的類為DeleteMedicineAction類,它繼承與DeleteAction類,是一個(gè)LookUpDispatchAction對(duì)象,此類通過all()方法與selected()方法處理藥品的批量刪除操作。此類的父類對(duì)象DeleteAction重寫了LookUpDispatchAction對(duì)象的getKeyMethodMap()方法,它已經(jīng)與Struts的資源文件中的key值進(jìn)行匹配,所以此類只需要對(duì)業(yè)務(wù)請(qǐng)求進(jìn)行相應(yīng)的處理即可。10.8.2映射JSP頁(yè)面中的按鈕在藥品信息列表頁(yè)面med_list.jsp中,添加批量刪除的表單與按鈕,其中“刪除所選”與“刪除全部”按鈕通過<htnl:submit>標(biāo)簽添加。11購(gòu)買藥品購(gòu)買藥品模塊主要對(duì)購(gòu)買藥品的請(qǐng)求進(jìn)行處理。對(duì)于用戶購(gòu)買藥品,實(shí)例中使用了購(gòu)物車模式。當(dāng)用戶確定購(gòu)買一個(gè)藥品時(shí),先將其添加到購(gòu)物車中;接下來可以繼續(xù)選購(gòu)其他藥品,在選購(gòu)藥品結(jié)束后對(duì)其進(jìn)行統(tǒng)一結(jié)賬。這種做法不僅可以方便用戶選購(gòu)藥品,且能減少程序中所發(fā)出的SQL語句,提高數(shù)據(jù)庫(kù)的性能。11.1選購(gòu)藥品在程序中,對(duì)于用戶所選購(gòu)藥品首先將其加到一個(gè)List集合中,然后再將其保存到Session會(huì)話中;當(dāng)用戶所購(gòu)買的藥品發(fā)生變化時(shí),將對(duì)Session會(huì)話中的對(duì)象進(jìn)行操作,該操作通過SellAction類的canSellMeds()方法進(jìn)行請(qǐng)求。為了安全起見,程序中對(duì)于每一個(gè)購(gòu)買的藥品都要進(jìn)行數(shù)據(jù)查詢,判斷其庫(kù)存是否滿足用戶需求,如果庫(kù)存數(shù)量小于用戶所需求的數(shù)量,程序?qū)?duì)其進(jìn)行一定的錯(cuò)誤請(qǐng)求。用戶選購(gòu)藥品后,實(shí)例中通過sell_order.jsp頁(yè)面對(duì)用戶所選購(gòu)的藥品進(jìn)行顯示,此頁(yè)面為用戶的訂單頁(yè)面,提供“刪除”、“繼續(xù)”、“清除”以及“結(jié)賬”等超鏈接,其效果如圖1.32所示。圖1.32訂單頁(yè)面11.2結(jié)賬對(duì)于用戶結(jié)賬操作,程序中通過兩步來實(shí)現(xiàn),首先程序要更新藥品在數(shù)據(jù)庫(kù)的庫(kù)存數(shù)量,然后還需要清空用戶的訂單信息。這一操作請(qǐng)求在實(shí)例中是通過SellAction類的buy()方法進(jìn)行處理。在此方法中,程序還通過循環(huán)迭代用戶訂單中的藥品對(duì)象,并在循環(huán)中判斷其庫(kù)存情況是否滿足用戶需求,如不滿足則進(jìn)行相應(yīng)的錯(cuò)誤請(qǐng)求,最后通過finally塊清除用戶的訂單信息。12銷售管理銷售管理模塊主要用于對(duì)藥品的銷售信息進(jìn)行管理,包括藥品銷售的明細(xì)管理、銷售排行統(tǒng)計(jì)查詢等操作,其持久層操作由SellDao類進(jìn)行處理,業(yè)務(wù)請(qǐng)求由SellAction類進(jìn)行處理。12.1明細(xì)信息查詢本實(shí)例中,對(duì)藥品銷售明細(xì)的查詢主要提供了兩種方式,分別為查詢所有銷售明細(xì)信息、查詢指定時(shí)間段的銷售明細(xì)信息。這兩種查詢請(qǐng)求均通過SellAction類進(jìn)行處理,對(duì)于查詢后的結(jié)果集通過sell_list.jsp頁(yè)面進(jìn)行顯示,其效果如圖1.33所示。圖1.33銷售明細(xì)12.2銷售排行統(tǒng)計(jì)為了了解藥品的銷售情況以及需求信息,實(shí)例中通過HQL查詢對(duì)藥品的銷售排行進(jìn)行統(tǒng)計(jì),然后將銷售排列在前10名的藥品顯示出來,如圖1.34所示。圖1.34銷售排行銷售排行統(tǒng)計(jì)的數(shù)據(jù)庫(kù)查詢方法為sellSeq(),此方法封裝在SellDao類中,通過HQL語句的連接查詢對(duì)藥品銷售信息進(jìn)行統(tǒng)計(jì)操作。由于分組統(tǒng)計(jì)只查詢了部分字段,Hibernate所返回的數(shù)據(jù)并不是一個(gè)已封裝的持久化對(duì)象,而是一個(gè)Object數(shù)組對(duì)象。實(shí)例中為了便于管理及使用,將其封裝為SellSeq對(duì)象,此方法返回裝載SellSeq對(duì)象的List集合。13進(jìn)貨/需求管理進(jìn)貨/需求管理模塊主要用于對(duì)藥品的需求信息進(jìn)行增、刪、改、查等數(shù)據(jù)庫(kù)操作。藥品需求信息的添加與藥品信息添加相類似,如果數(shù)據(jù)庫(kù)中已存在所添加的藥品需求信息,則更新藥品需求的數(shù)量即可,否則將錄入一個(gè)新的藥品需求信息到數(shù)據(jù)庫(kù)中。藥品需求信息添加后由req_list.jsp頁(yè)面進(jìn)行列表顯示,如圖1.35所示。圖1.35req_list.jsp頁(yè)面在此頁(yè)面中,程序同樣提供了藥品需求的模糊查詢、修改等操作,其實(shí)現(xiàn)方法與藥品信息管理中的類似。其中“進(jìn)貨完成”超鏈接用于對(duì)藥品進(jìn)貨完成進(jìn)行操作,當(dāng)某一藥品完成進(jìn)貨時(shí),可單擊此超鏈接更新藥品的庫(kù)存數(shù)量,此請(qǐng)求由RequireAction類的meded()方法進(jìn)行處理。進(jìn)貨完成操作實(shí)質(zhì)是將藥品的需求數(shù)量更新到庫(kù)存中,同時(shí)清空藥品的需求數(shù)量。此方法通過加載指定藥品ID的藥品信息,查詢藥品庫(kù)存數(shù)量與藥品的需求數(shù)量,然后通過數(shù)學(xué)運(yùn)算更新藥品的庫(kù)存數(shù)量與藥品的需求數(shù)量。14系統(tǒng)管理系統(tǒng)管理模塊的作用是對(duì)管理員賬戶進(jìn)行管理及對(duì)系統(tǒng)進(jìn)行初始化操作,在業(yè)務(wù)層與持久層分別由SystemAction類與UserDao類進(jìn)行處理。14.1添加管理員添加管理員實(shí)質(zhì)就是對(duì)管理員帳號(hào)信息持久化的過程。其操作比較簡(jiǎn)單,持久層可以通過Hibernate框架的save()方法添加管理員用戶,在業(yè)務(wù)層由SystemAction類的userAdd()方法處理此請(qǐng)求。此方法首先驗(yàn)證了密碼與確認(rèn)密碼是否相同,只有在密碼與確認(rèn)密碼一致的情況下才可以添加管理員用戶。在添加管理員用戶之后,由user_list.jsp頁(yè)面進(jìn)行顯示,其效果如圖1.36所示。圖1.36user_list.jsp頁(yè)面14.2修改密碼修改密碼操作需要提供舊密碼,否則不能進(jìn)行修改。此請(qǐng)求SystemAction類的modifyPassowrd()方法實(shí)現(xiàn)。出于程序的安全性考慮,此方法分別對(duì)用戶的舊密碼、新密碼及確認(rèn)密碼進(jìn)行驗(yàn)證,只有符合的條件下才可以修改成功,否則程序?qū)?duì)其進(jìn)行相應(yīng)的錯(cuò)誤處理,由error.jsp頁(yè)面輸出錯(cuò)誤信息。例如用戶提供了錯(cuò)誤的原始密碼,則結(jié)果如圖1.37所示。圖1.37原始密碼錯(cuò)誤14.3系統(tǒng)初始化在系統(tǒng)需要恢復(fù)原始狀態(tài)的時(shí)候,可以通過程序提供的系統(tǒng)初始化操作來實(shí)現(xiàn)。此操作將清除數(shù)據(jù)庫(kù)中所有數(shù)據(jù),在使用過程中要慎重。其數(shù)據(jù)庫(kù)的清理操作由UserDao類的initialization()實(shí)現(xiàn)。Hibernate提供的SchemaExport類是一個(gè)工具類,其create()方法用于導(dǎo)出表操作。實(shí)例中通過此方法進(jìn)行數(shù)據(jù)的初始化操作,此過程將刪除數(shù)據(jù)庫(kù)中原有的數(shù)據(jù)并重新生成。15運(yùn)行項(xiàng)目項(xiàng)目開發(fā)完成后,就可以在MyEclipse中運(yùn)行該項(xiàng)目了。具體步驟如下:(1)在MyEclipse的包資源管理器中選中MedicineManager項(xiàng)目,單擊鼠標(biāo)右鍵,在彈出的快捷鍵中選擇“運(yùn)行方式”/MyEclipseServerApplication命令,如圖1.38所示,此時(shí)MyEclipse將對(duì)項(xiàng)目自動(dòng)部署并運(yùn)行。圖1.38運(yùn)行MedicineManager項(xiàng)目(2)在Web服務(wù)器啟動(dòng)成功后,MyEclipse將通過內(nèi)置的瀏覽器打開項(xiàng)目主頁(yè),登錄成功將進(jìn)入系統(tǒng),其運(yùn)行效果如圖1.39所示圖1.39實(shí)例運(yùn)行結(jié)果附錄資料:不需要的可以自行刪除Excel表格的35招必學(xué)秘技一、讓不同類型數(shù)據(jù)用不同顏色顯示在工資表中,如果想讓大于等于2000元的工資總額以“紅色”顯示,大于等于1500元的工資總額以“藍(lán)色”顯示,低于1000元的工資總額以“棕色”顯示,其它以“黑色”顯示,我們可以這樣設(shè)置。1.打開“工資表”工作簿,選中“工資總額”所在列,執(zhí)行“格式→條件格式”命令,打開“條件格式”對(duì)話框。單擊第二個(gè)方框右側(cè)的下拉按鈕,選中“大于或等于”選項(xiàng),在后面的方框中輸入數(shù)值“2000”。單擊“格式”按鈕,打開“單元格格式”對(duì)話框,將“字體”的“顏色”設(shè)置為“紅色”。2.按“添加”按鈕,并仿照上面的操作設(shè)置好其它條件(大于等于1500,字體設(shè)置為“藍(lán)色”;小于1000,字體設(shè)置為“棕色”)。3.設(shè)置完成后,按下“確定”按鈕??纯垂べY表吧,工資總額的數(shù)據(jù)是不是按你的要求以不同顏色顯示出來了。二、建立分類下拉列表填充項(xiàng)我們常常要將企業(yè)的名稱輸入到表格中,為了保持名稱的一致性,利用“數(shù)據(jù)有效性”功能建了一個(gè)分類下拉列表填充項(xiàng)。1.在Sheet2中,將企業(yè)名稱按類別(如“工業(yè)企業(yè)”、“商業(yè)企業(yè)”、“個(gè)體企業(yè)”等)分別輸入不同列中,建立一個(gè)企業(yè)名稱數(shù)據(jù)庫(kù)。2.選中A列(“工業(yè)企業(yè)”名稱所在列),在“名稱”欄內(nèi),輸入“工業(yè)企業(yè)”字符后,按“回車”鍵進(jìn)行確認(rèn)。仿照上面的操作,將B、C……列分別命名為“商業(yè)企業(yè)”、“個(gè)體企業(yè)”……3.切換到Sheet1中,選中需要輸入“企業(yè)類別”的列(如C列),執(zhí)行“數(shù)據(jù)→有效性”命令,打開“數(shù)據(jù)有效性”對(duì)話框。在“設(shè)置”標(biāo)簽中,單擊“允許”右側(cè)的下拉按鈕,選中“序列”選項(xiàng),在下面的“來源”方框中,輸入“工業(yè)企業(yè)”,“商業(yè)企業(yè)”,“個(gè)體企業(yè)”……序列(各元素之間用英文逗號(hào)隔開),確定退出。再選中需要輸入企業(yè)名稱的列(如D列),再打開“數(shù)據(jù)有效性”對(duì)話框,選中“序列”選項(xiàng)后,在“來源”方框中輸入公式:=INDIRECT(C1),確定退出。4.選中C列任意單元格(如C4),單擊右側(cè)下拉按鈕,選擇相應(yīng)的“企業(yè)類別”填入單元格中。然后選中該單元格對(duì)應(yīng)的D列單元格(如D4),單擊下拉按鈕,即可從相應(yīng)類別的企業(yè)名稱列表中選擇需要的企業(yè)名稱填入該單元格中。提示:在以后打印報(bào)表時(shí),如果不需要打印“企業(yè)類別”列,可以選中該列,右擊鼠標(biāo),選“隱藏”選項(xiàng),將該列隱藏起來即可。三、建立“常用文檔”新菜單在菜單欄上新建一個(gè)“常用文檔”菜單,將常用的工作簿文檔添加到其中,方便隨時(shí)調(diào)用。1.在工具欄空白處右擊鼠標(biāo),選“自定義”選項(xiàng),打開“自定義
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二四全新閣樓房產(chǎn)買賣合同范本下載2篇
- 2025年度道路照明工程路燈設(shè)施租賃與維護(hù)合同4篇
- 二零二四書店門面臨時(shí)代租及文化活動(dòng)策劃合同3篇
- 2025年度大數(shù)據(jù)分析服務(wù)外包合同范本4篇
- 2025年電子產(chǎn)品銷售代理合同協(xié)議范本
- 二零二五年度品牌形象塑造與廣告宣傳一體化合同4篇
- 2025年度蔬菜配送及農(nóng)業(yè)科技研發(fā)合作合同3篇
- 二零二五版攪拌站工程勞務(wù)分包合同實(shí)施細(xì)則12篇
- Unit 4 What can you do?B read and write(說課稿)-2024-2025學(xué)年人教PEP版英語五年級(jí)上冊(cè)
- 1 負(fù)數(shù) 第二課時(shí)(說課稿)-2023-2024學(xué)年六年級(jí)下冊(cè)數(shù)學(xué)人教版
- GB/T 12914-2008紙和紙板抗張強(qiáng)度的測(cè)定
- GB/T 1185-2006光學(xué)零件表面疵病
- ps6000自動(dòng)化系統(tǒng)用戶操作及問題處理培訓(xùn)
- 家庭教養(yǎng)方式問卷(含評(píng)分標(biāo)準(zhǔn))
- 城市軌道交通安全管理課件(完整版)
- 線纜包覆擠塑模設(shè)計(jì)和原理
- TSG ZF001-2006 安全閥安全技術(shù)監(jiān)察規(guī)程
- 部編版二年級(jí)語文下冊(cè)《蜘蛛開店》
- 鍋爐升降平臺(tái)管理
- 200m3╱h凈化水處理站設(shè)計(jì)方案
- 個(gè)體化健康教育記錄表格模板1
評(píng)論
0/150
提交評(píng)論