【正文】
return strIn。 } try{ temp=new String((ISO88591),GBK)。 } catch(UnsupportedEncodingException e){ (())。 } return temp。 } } 對(duì)于 GBK 到 ISO 88591的轉(zhuǎn)換方法限于篇幅,此處略去,可在源程序中找到。 信息的分頁(yè)顯示 手機(jī)銷售系統(tǒng)中,消費(fèi)者或者管理員在查看信息時(shí),若信息有 35 多條記錄,則分頁(yè)顯示查看成為了一個(gè)必要的操作。根據(jù)記錄總數(shù)目和自定義的每頁(yè)顯示記錄數(shù)來(lái)確定本頁(yè)顯示記錄的開始序號(hào)和結(jié)束序號(hào)的程序流程如圖 42所示。 程序中首先是調(diào)用函數(shù) getPage 來(lái)得到記錄的總頁(yè)數(shù)。在下面通過(guò)當(dāng)前要顯示的頁(yè)面號(hào)來(lái)判斷在數(shù)據(jù)庫(kù)中第一個(gè)要顯示的記錄號(hào)和最后一個(gè)要顯示的記錄號(hào)。 pagesize 用來(lái)定義每頁(yè)要顯示的記錄條數(shù)。 pages 為當(dāng)前頁(yè)號(hào)。 start 和 end 分別來(lái)描述開始和結(jié)束的記錄號(hào)。通過(guò)當(dāng)前頁(yè)號(hào),和每頁(yè)要顯示的記錄,在根據(jù)總的記錄數(shù),就可以完成對(duì)每個(gè)單頁(yè)中要顯示的具體信息記錄的定位。然后在數(shù)據(jù)庫(kù)查詢語(yǔ)句中根據(jù)開始和結(jié)束的位置選取相應(yīng)的記錄。 開 始p a g e s 1 | | p a g e s t o t a l p a g et o t a l p a g e = g e t P a g e( c o u n t , p a g e s i z e )讀 入p a g e sp a g e s = 1s t a r t = ( p a g e s 1 ) * p a g e s i z ee n d = s t a r t + p a g e s i z ee n d c o u n te n d = c o u n t結(jié) 束FTTF 圖 42 分頁(yè)中記錄位置確定程序流程圖 36 信息列表的實(shí)現(xiàn) 在本系統(tǒng)中完成搜索或顯示等功能操作時(shí),各種提取和顯示的信息的來(lái)源都是數(shù)據(jù)庫(kù),如何把從數(shù)據(jù)庫(kù)中得到的結(jié)果集很好的保存或拿到頁(yè)面中使用和顯示哪。本系統(tǒng)中對(duì)于信息列表的提取應(yīng)用了 Vector。 Vector 是 Java 中的一 個(gè)工具類。它對(duì)應(yīng)于類似數(shù)組的順序存儲(chǔ)的數(shù)據(jù)結(jié)構(gòu),具有比數(shù)組更強(qiáng)大的功能。 Vector 最大的特點(diǎn)是能夠根據(jù)你的需要?jiǎng)討B(tài)增長(zhǎng)。它實(shí)現(xiàn)了 List 接口,因此可以把它看作一個(gè)列表 [8]。 Vector 的最大特點(diǎn)是它只儲(chǔ)存對(duì)象的引用,而不是實(shí)際的對(duì)象。它允許不同類型的元素對(duì)象順序共存于一個(gè)對(duì)象中,同時(shí)它提供了許多有用的方法來(lái)操作和處理元素?cái)?shù)據(jù)。在程序設(shè)計(jì)中, Vector 可以根據(jù)需要改變其元素的個(gè)數(shù),也就是說(shuō) Vector 是一個(gè)變長(zhǎng)數(shù)組,它和普通數(shù)組的最大區(qū)別是 Vector 只支持對(duì)象作為元素,元素不能是基本數(shù)據(jù)類型,并通過(guò) 函數(shù) addElement()可以方便簡(jiǎn)易的將各個(gè)對(duì)象元素順序的放到相應(yīng)的 Vector 變量中存儲(chǔ)起來(lái)?;?Vector 的特點(diǎn),只要將數(shù)據(jù)庫(kù)操作中產(chǎn)生的結(jié)果集即 ResultSet 順序封裝到一個(gè)描述性的類中即可將其以對(duì)象的方式順序存儲(chǔ)到 Vector 中,從而很好的完成將數(shù)據(jù)庫(kù)中信息轉(zhuǎn)換到 Vector 中。而 Vector 中存儲(chǔ)的元素還可以通過(guò) elementAt()函數(shù)簡(jiǎn)單的獲得,從而能方便在所需要的地方進(jìn)行使用。 Vector 的長(zhǎng)度可以通過(guò) size()來(lái)獲得,而它的容量則用capacity()來(lái)得到。由此可見 Vector 使用起來(lái)很靈活也很方便而且對(duì)于本系統(tǒng)功能的完成無(wú)疑不是一個(gè)最佳的選擇。通過(guò)下面語(yǔ)句 Vector example = new Vector() 的形式創(chuàng)建了一個(gè) Vector 類型的變量 example,其空間的分配可以在后面的括號(hào)中給予聲明,亦可以讓系統(tǒng)自動(dòng)給予分配。 Vector 類型變量與得到數(shù)據(jù)庫(kù)中信息的結(jié)果集 ResultSet 的交互過(guò)程如圖 43 所示: 37 圖 43 Vector 在本系統(tǒng)中的工作機(jī)制 下面是一個(gè)用 Vector 來(lái)保存搜索信息的一個(gè)函數(shù),從中可以體現(xiàn)對(duì) Vector 的使用方法。 public Vector queryList(int temptid){ ………… ResultSet rs=()。 count=()。 telephoneList=new Vector(count+1)。 ()。 while(()){ long tid=(t_id)。 String type=(t_type)。 ………… Telephone newtelephone=new Telephone(tid,type ,… )。 (newtelephone)。 } ………… 38 業(yè)務(wù)邏輯層實(shí)現(xiàn)總體概述 本系統(tǒng)實(shí)施的一大特點(diǎn)就是業(yè)務(wù)邏輯層的操作都封裝到相應(yīng)的Javabean 中,這樣不僅使用戶界面和業(yè)務(wù)邏輯分離,系統(tǒng)的安全性,可維護(hù)性,通用性和可擴(kuò)展性都大大得到了提高。 整個(gè)系統(tǒng)中含有三個(gè)包,分別為 util, sys 和 operation 包。 util包中包含了整個(gè)系統(tǒng)中能用到的各種通用功能的類。系統(tǒng)包圖如圖44 所示。 sys 包中各個(gè)類對(duì)系統(tǒng)中的操作實(shí)體進(jìn)行了描述,完成了實(shí)體相應(yīng)屬性的定義和設(shè)置。 operation 包是整個(gè)系統(tǒng)中最主要的包,也是工作量最大的 一塊,其中所有業(yè)務(wù)邏輯的體現(xiàn)和操作過(guò)程,均是通過(guò)此包中的各個(gè)類來(lái)具體完成的。 ① util 包的實(shí)現(xiàn) : util 包類 Conn 完成與數(shù)據(jù)庫(kù)的連接操作, TransCoding 用來(lái)完成字節(jié)編碼的轉(zhuǎn)換,在本章先前的小節(jié)中有相關(guān)描述,在此不再贅述。 TimeP 為一個(gè)獲取本地系統(tǒng)時(shí)間功能的類,主要用于系統(tǒng)數(shù)據(jù)庫(kù)某些表中日期型字段初始值的獲取。 Page為完成顯示某項(xiàng)信息記錄時(shí)的分頁(yè)方法類。 UpLoad 是一個(gè)完成文件上傳的功能類。 39 圖 44 系統(tǒng)包圖 圖 45 Company 類圖 圖 46 Shopcar 類圖 ② sys 包的實(shí)現(xiàn) sys 包中的各個(gè)類都是對(duì)相應(yīng)實(shí)體的定義和屬性描述。 Admin 類是對(duì)管理員實(shí)體的抽象描述。 Company 類是對(duì)品牌信息,即公司實(shí) 40 體的抽象描述。 Telephone 類是對(duì)手機(jī)實(shí)體的抽象描述。 Shopcar 是對(duì)系統(tǒng)購(gòu)物車實(shí)體的抽象描述。 Leaguer 是對(duì)會(huì)員實(shí)體的抽象描述。Teleorder 類和 Orderitem 類分別是對(duì)訂單實(shí)體和訂單明細(xì)實(shí)體的抽象描述。各個(gè)類中的結(jié)構(gòu)基本相同,分別是對(duì)實(shí)體屬性的定義,然后是對(duì)實(shí)體相應(yīng)屬性的設(shè)置和相應(yīng)屬性的獲得。圖 45 和 46 分別為 Company 和 Shopcar 類圖。此包中其它類圖結(jié)構(gòu)均與此類似。 ③ operation 包的實(shí)現(xiàn) 在 operation 包中封裝了整個(gè)系統(tǒng)進(jìn)行具體功能實(shí)現(xiàn)時(shí)所用到的所有操作類。在相應(yīng)的 Jsp 文件中以 bean 的形式來(lái)調(diào)用使用這些類,從而完成系統(tǒng)功能。 Op_admin 類完成與管理員信息相關(guān)的操作。主要包括管理員登錄信息驗(yàn)證。由于本系統(tǒng)中信息獲取的來(lái)源是 WEB頁(yè)面,所以如何從 WEB 頁(yè)面中獲取數(shù)據(jù)成為了一個(gè)首要解決的問(wèn)題。 Java 程序語(yǔ)言提供的包 中包含了很多具體的網(wǎng)絡(luò)操 作方面的類。通過(guò)其 HttpServletRequest 類的 getParameter()方法就可以容易的獲得 WEB 頁(yè)面中表單,或請(qǐng)求中傳遞過(guò)來(lái)的參數(shù)。然后通過(guò)將得到的參數(shù)值與數(shù)據(jù)庫(kù)中存儲(chǔ)的信息進(jìn)行比較,來(lái)確定數(shù)據(jù)庫(kù)中是否含有此記錄,即可達(dá)到登錄信息是否正確的驗(yàn)證操作。在會(huì)員信息驗(yàn)證時(shí)亦是采用了類似的操作。 Op_leaguer 和Op_pany 類分別完成了與會(huì)員相關(guān)和公司信息相關(guān)的操作。Op_order 和 Op_orderitem 兩個(gè)類中定義了完成訂單信息處理的各種方法。 Op_telephone 類和 Op_shopercar 類是 operation 包中的兩個(gè)關(guān)鍵的類,也是系統(tǒng)功能實(shí)現(xiàn)的關(guān)鍵類。 Op_telephone 類主要完成了與手機(jī)信息相關(guān)的操作的各種功能函數(shù)。本系統(tǒng)為手機(jī)銷售系統(tǒng),所以手機(jī)信息的使用貫穿了系統(tǒng)的整個(gè)過(guò)程,不論是消費(fèi)者對(duì)本系統(tǒng)的利用還是管理員對(duì)本系統(tǒng)的維護(hù)。 Op_shopercar 是系統(tǒng)的另一個(gè)關(guān)鍵類,此類是對(duì)購(gòu)物車操作的描述,其中包括了完成購(gòu)物車相關(guān)操作的各個(gè)功能函數(shù)。一個(gè)不能進(jìn)行銷售的系統(tǒng)是無(wú)法稱其為銷售系統(tǒng)的,所以如何完成消費(fèi)者購(gòu)買手機(jī)的操作過(guò)程成為了重點(diǎn)。 41 購(gòu)物車的實(shí)現(xiàn) 購(gòu)物車 的功能是本系統(tǒng)對(duì)于消費(fèi)者最直觀,最重要的功能體現(xiàn)。也是系統(tǒng)看法過(guò)程中的一個(gè)難點(diǎn)。用戶在本系統(tǒng)中可以完成添加,刪除,清空,提交購(gòu)物車的操作,從而完成購(gòu)物的過(guò)程。 對(duì)于購(gòu)物車的實(shí)現(xiàn)本系統(tǒng)主要采用用 session保存一次會(huì)話中的購(gòu)買信息,最后將 session 中的信息一次性提交,即購(gòu)物車的提交,然后將提交的信息以訂單的形式保存到數(shù)據(jù)庫(kù)中。 本系統(tǒng)的購(gòu)物車界面如圖 47 所示。 圖 47 系統(tǒng)購(gòu)物車界面圖 消費(fèi)者在瀏覽手機(jī)信息時(shí),可以選擇購(gòu)買,即添加購(gòu)物車選項(xiàng),則將其購(gòu)買的信息加到購(gòu)物車中并保存在此 次會(huì)話的 session 中,直到提交購(gòu)物車,或者結(jié)束此次會(huì)話。如圖 48 所示為添加購(gòu)物車程序流程圖。其中首先通過(guò) session 變量獲取購(gòu)物車中的信息。然后判斷是否已含有該項(xiàng)信息并最終將信息重新保存回 session 中。 42 開 始n u l l = = b u y L i s tb u y L i s t = n e w V e c t o r ( )從 s e s s i o n 中讀 取 b u y L i s tb u y L i s t . a d d E l e m e n t ( s h o p c a r )s e s s i o n . s e t A t t r i b u t e ( , b u y L i s t )TFS h o p c a r = = ( S h o p c a r )b u y L i s t . e l e m e n t A t ( i )F結(jié) 束T 圖 48 添加購(gòu)物車程序流程圖 在添加完購(gòu)物車記錄后,用戶可以在購(gòu)物車界面中對(duì)購(gòu)買的手機(jī)進(jìn)行數(shù)量的修改。并通過(guò)點(diǎn)選保存更改來(lái)提交數(shù)量的更改。在更改的具體函數(shù)實(shí)現(xiàn)中,首先 要對(duì)更改的數(shù)量與庫(kù)存數(shù)量的值進(jìn)行比較,看是否庫(kù)存手機(jī)數(shù)量已經(jīng)不足購(gòu)買要求,如果是,則給出提示。否則正常修改。由于每次保存修 改是對(duì)購(gòu)物車中所有項(xiàng)的數(shù)量進(jìn)行檢查和重置,所以要?jiǎng)討B(tài)的得到購(gòu)物車中信息的數(shù)量和相應(yīng)表單項(xiàng)的編號(hào),以便在具體的函數(shù)實(shí)現(xiàn)過(guò)程中進(jìn)行操作。因此在購(gòu)物車的 JSP 文件中對(duì)于 form 中每條記錄的名字采用了如下的命名方式,即將 form 中每個(gè)數(shù)據(jù)項(xiàng)的name 動(dòng)態(tài)定義稱增加的整數(shù)。 for(int i=0。i()。i++){ ………… tdinputname=%=i% type=text 43 value=%=()%/td ………… 在相應(yīng)的修改購(gòu)買數(shù)量的函數(shù)中用下面的循環(huán)來(lái)獲取表單中每一項(xiàng)當(dāng)前填寫的數(shù)量值,繼而進(jìn)行數(shù)量的修改。 for(int i=0。i()。i++){ ………… String t=(i)。 long amount=((t))。 在購(gòu)物車界面中用戶還可以完成對(duì)購(gòu)物車中某條記錄的刪除。 (i)。 //移除某一項(xiàng)記錄 (shopcar, buyList)。//更新 session 清空購(gòu)物車則將 session 中的值清空即可 (shopcar) 提交購(gòu)物車是消費(fèi)者購(gòu)買商品的最后一步。系統(tǒng)完成向數(shù)據(jù)庫(kù)訂單表中插入一條記錄的操作,同時(shí)在訂單子項(xiàng)表中插入對(duì)應(yīng)的訂單明細(xì)記錄。為保持消費(fèi)者在線瀏覽信息的一致性,手機(jī)表中相應(yīng)手機(jī)的數(shù)量也要做庫(kù)存減少的調(diào)整。因?yàn)榇瞬僮髦猩婕傲藬?shù)據(jù)庫(kù)中的三個(gè)表,錯(cuò)誤狀態(tài)下的回滾操作顯得很必要。 系統(tǒng) 中分別定義了向三個(gè)表中插入數(shù)據(jù)的函數(shù),向訂單表 teleorder 中插入記錄的函數(shù) insertOrder 的程序流程圖如圖 49 所示 。當(dāng)某個(gè)插入函數(shù)失敗時(shí),則調(diào)用刪除函數(shù),將已經(jīng)插入到某個(gè)表中的記錄刪除掉。當(dāng)訂單表插入成功,訂單子項(xiàng)表插入失敗時(shí),對(duì)訂單表進(jìn)行的操作如下面 sql 語(yǔ)句所示。 delete from teleorder where o_id is (select max(o_id) form teleorder) 44 圖 49 teleorder 表記錄添加程序流程圖 手機(jī)信息相關(guān)操 作的實(shí)現(xiàn) 與手機(jī)信息相關(guān)的操作