【正文】
示。本模塊分為借閱管理和歸還記錄,借閱記錄查詢是本系統(tǒng)中一個(gè)重要環(huán)節(jié),此處詳細(xì)記錄著被借書籍信息和借閱者的信息,并且針對(duì)無(wú)法在規(guī)定時(shí)間內(nèi)歸還圖書的借閱者的需求增設(shè)了續(xù)借的功能,在此模塊中可以查詢借閱記錄,也可以添加新的借閱記錄。在借閱明細(xì)表中,如有歸還操作,既將借閱明細(xì)表中的借閱記錄刪除,作為歷史記錄保存在歸還明細(xì)表中,同時(shí)改變圖書的庫(kù)存數(shù)量。圖518 借閱管理界面圖519 借閱界面圖520 歸還記錄界面圖521 借閱程序流程圖數(shù)據(jù)統(tǒng)計(jì)。界面如圖52523所示。第6章 軟件測(cè)試 軟件測(cè)試的方法與步驟該系統(tǒng)在本地服務(wù)器上進(jìn)行運(yùn)行和調(diào)試,鑒于對(duì)系統(tǒng)的內(nèi)部結(jié)構(gòu)和處理算法的完全了解以及對(duì)系統(tǒng)功能的全面掌握對(duì)系統(tǒng)進(jìn)行白盒測(cè)試和黑盒測(cè)試。測(cè)試目的在于發(fā)現(xiàn)錯(cuò)誤而執(zhí)行一個(gè)程序的過(guò)程,測(cè)試主要為了發(fā)現(xiàn)尚未發(fā)現(xiàn)的錯(cuò)誤。圖61 測(cè)試階段信息流程為了設(shè)計(jì)出有效地測(cè)試方案按照下面準(zhǔn)則進(jìn)行測(cè)試:所有測(cè)試都應(yīng)追溯到用戶需求;在完成了需求模型就要著手制定測(cè)試計(jì)劃,在編碼之前最所有測(cè)試工作進(jìn)行計(jì)劃和設(shè)計(jì);從小規(guī)模開始逐步進(jìn)行大規(guī)模測(cè)試,通常先重點(diǎn)測(cè)試單個(gè)程序模塊再轉(zhuǎn)向集成的模塊簇,精心設(shè)計(jì)測(cè)試方案,盡可能充分覆蓋程序邏輯使之達(dá)到要求的可靠性。在單元測(cè)試中可以采用功能性測(cè)試和結(jié)構(gòu)性測(cè)試兩種。這一階段的任務(wù),是通過(guò)了單元測(cè)試的模塊逐步組裝起來(lái),通過(guò)測(cè)試與糾錯(cuò),最終得到一個(gè)滿足需求的目標(biāo)軟件。在這個(gè)測(cè)試步驟中所發(fā)現(xiàn)的往往是需求規(guī)格說(shuō)明的錯(cuò)誤。在整個(gè)測(cè)試中,采用了白盒測(cè)試和黑盒測(cè)試相結(jié)合的方法。表61 登陸模塊用例測(cè)試用例測(cè)試數(shù)據(jù)預(yù)期結(jié)果UC1:輸入正確的用戶名和密碼用戶名:hp 密碼:123系統(tǒng)跳轉(zhuǎn)到登陸成功頁(yè)面UC2:輸入空用戶名用戶名:請(qǐng)輸入用戶名UC3:輸入空密碼用戶名:hp 密碼:請(qǐng)輸入密碼UC4:輸入用戶名和錯(cuò)誤的密碼用戶名:admin 密碼:321ff用戶名不存在當(dāng)用戶輸入的用戶名或密碼錯(cuò)誤是系統(tǒng)會(huì)跳轉(zhuǎn)到出錯(cuò)頁(yè)面并提示“用戶名不存在!”,用戶點(diǎn)擊確定,系統(tǒng)會(huì)重新返回登陸頁(yè)面,其中錯(cuò)誤信息提示頁(yè)面如圖62所示:圖62 錯(cuò)誤信息提示頁(yè)面。這里用以圖書管理員身份登陸系統(tǒng)后的續(xù)借功能作為演示,經(jīng)過(guò)檢驗(yàn)其功能均得以順利實(shí)現(xiàn),下圖為管理員操作的讀者借閱模塊成功運(yùn)行界面如圖64所示:圖64 借閱功能演示 驗(yàn)收測(cè)試在進(jìn)行了以上的測(cè)試工作后,將整個(gè)軟件系統(tǒng)作為單一的實(shí)體進(jìn)行測(cè)試,測(cè)試內(nèi)容與系統(tǒng)測(cè)試基本類似,但它是在用戶積極參與下進(jìn)行的,此測(cè)試過(guò)程主要使用實(shí)際數(shù)據(jù),進(jìn)行測(cè)試,驗(yàn)證測(cè)試的目的是驗(yàn)證系統(tǒng)確實(shí)能夠滿足用戶的需求,經(jīng)過(guò)這個(gè)環(huán)節(jié)的實(shí)際數(shù)據(jù)測(cè)試,系統(tǒng)的各個(gè)功能實(shí)現(xiàn)都達(dá)到了系統(tǒng)需求設(shè)計(jì)的要求。讀者在本系統(tǒng)的應(yīng)用下可實(shí)現(xiàn)按照各種方式(如:書名,圖書類別)查詢圖書館的藏書情況,能夠方便的查詢自己的借閱圖書情況。系統(tǒng)管理員可以對(duì)圖書館信息進(jìn)行修改更新操作,測(cè)試階段的工作一方面發(fā)現(xiàn)了系統(tǒng)的各種錯(cuò)誤,另外一方面也驗(yàn)證了修改后的系統(tǒng)能夠?qū)崿F(xiàn)提高圖書館工作效率的預(yù)期目的。通過(guò)單元測(cè)試,查找出了系統(tǒng)各模塊內(nèi)部的錯(cuò)誤;通過(guò)子系統(tǒng)測(cè)試,發(fā)現(xiàn)了模塊間相互協(xié)調(diào)和通信上的錯(cuò)誤;通過(guò)系統(tǒng)的集成測(cè)試,發(fā)現(xiàn)了軟件設(shè)計(jì)過(guò)程中存在的錯(cuò)誤。結(jié) 論以J2EE為平臺(tái),運(yùn)用JSP網(wǎng)絡(luò)編程語(yǔ)言和Servlet和Oracle數(shù)據(jù)庫(kù)完成了B/S模式的圖書館管理系統(tǒng)。該系統(tǒng)使用純Servlet進(jìn)行開發(fā),系統(tǒng)在數(shù)據(jù)庫(kù)與Web服務(wù)器的連接時(shí)采用的是連接池技術(shù),會(huì)使系統(tǒng)有更強(qiáng)的數(shù)據(jù)庫(kù)映射關(guān)系,進(jìn)而極大簡(jiǎn)化開發(fā)過(guò)程,還有就是系統(tǒng)在一些信息設(shè)置的細(xì)節(jié)上還存在不足,可以對(duì)系統(tǒng)的相關(guān)字段進(jìn)行格式設(shè)置和異常處理,使數(shù)據(jù)更加規(guī)范化。經(jīng)過(guò)三個(gè)月的不斷學(xué)習(xí)和設(shè)計(jì)開發(fā)加上老師同學(xué)的幫助,終于完成了系統(tǒng)開發(fā),在開題報(bào)告階段我參閱了大量的中外文獻(xiàn),對(duì)所開發(fā)系統(tǒng)的現(xiàn)狀有了深入的了解。在配置開發(fā)工具過(guò)程中對(duì)Tomcat ,, 對(duì)開發(fā)Web程序的步驟框架也有了總體性認(rèn)識(shí)。致 謝回想我的四年大學(xué)生活真的有很多的收獲和感觸。首先,我要感謝我的父母,是您們的支持與鼓勵(lì)是我順利的讀完了我的大學(xué);是您們的教導(dǎo)和點(diǎn)播是我在迷茫的時(shí)候不迷失自己;是您們的言傳身教使我懂得了如何與人為善,真愛身邊的朋友們;是您們的實(shí)時(shí)適度的糾正,是我順利成長(zhǎng)不斷進(jìn)步;使您們寬和仁和的處事為人,塑造了我豁達(dá)開朗的性格,是您們一直以來(lái)對(duì)我的關(guān)懷和愛使我健康的成長(zhǎng),不斷地進(jìn)步,謝謝您們,我親愛的爸爸媽媽。在完成畢業(yè)設(shè)計(jì)的過(guò)程中,您不但教授了我很多專業(yè)知識(shí),還為我的未來(lái)發(fā)展工作提出了很多寶貴的意見,在我整個(gè)畢業(yè)設(shè)計(jì)的指導(dǎo)過(guò)程中您給我的印象就是認(rèn)真負(fù)責(zé),在這里我想對(duì)我可敬可親的呂老師說(shuō)一聲:“謝謝!”非常感謝我的同學(xué)們我的老師們當(dāng)我在畢業(yè)設(shè)計(jì)過(guò)程中遇到問(wèn)題和困難時(shí),是你們給我提出許多關(guān)鍵性的意見和建議,使我對(duì)整個(gè)畢業(yè)設(shè)計(jì)的思路有了總體的把握,并耐心的幫我解決了許多實(shí)際問(wèn)題,使我獲益良多。謝謝我的母校對(duì)我的教育,我將以更加飽滿的熱情投入到工作中去,充實(shí)自己,完善自己,向著自己的目標(biāo)不斷地前進(jìn),用我的所學(xué)去實(shí)現(xiàn)我心中的夢(mèng)想。Servlet是運(yùn)行在Web或應(yīng)用服務(wù)器上的Java程序,它是一個(gè)中間層,負(fù)責(zé)連接來(lái)自Web瀏覽器或其他HTTP客戶程序的請(qǐng)求和HTTP服務(wù)器上的數(shù)據(jù)庫(kù)或應(yīng)用程序。圖11 Web中間件的作用圖11中顯示了一條從客戶端到Web服務(wù)器的單箭頭,但實(shí)際上從客戶端傳送到Web服務(wù)器的數(shù)據(jù)有兩種,它們分別為用戶在表單中輸入的顯式數(shù)據(jù),以及后臺(tái)的HTTP信息。HTTP信息包括Cookie、瀏覽器所能識(shí)別的媒體類型和壓縮模式等。實(shí)際的數(shù)據(jù)可能存儲(chǔ)在關(guān)系型數(shù)據(jù)庫(kù)中。即使它能夠做到這一點(diǎn),為了安全上的考慮,我們也不希望讓它這么做。因此,我們需要Web中間層從HTTP流中提取輸入數(shù)據(jù),與應(yīng)用程序會(huì)話,并將結(jié)果嵌入到文檔中。但是,到目前為止,HTML式最常用的格式,故而servelt和JSP的重要任務(wù)之一就式將結(jié)果包裝到HTML中。但是,實(shí)際發(fā)送的數(shù)據(jù)有兩種:文檔本身,以及后臺(tái)的HTTP信息。HTTP響應(yīng)數(shù)據(jù)的發(fā)送過(guò)程涉及告知瀏覽器或其他客戶程序所返回文檔的類型(如HTML),設(shè)置Cookie和緩存參數(shù),以及其他類似的任務(wù)。然而,許多情況下靜態(tài)的結(jié)果不能滿足要求,我們需要針對(duì)每個(gè)請(qǐng)求生成一個(gè)頁(yè)面。在沒有讀取到用戶提交的數(shù)據(jù)之前,我們不知道應(yīng)該顯示什么。兩種輸入都可用來(lái)構(gòu)建輸出頁(yè)面。如果頁(yè)面需要根據(jù)每個(gè)具體的請(qǐng)求做出相應(yīng)的改變,當(dāng)然需要在請(qǐng)求發(fā)生時(shí)構(gòu)建響應(yīng)。具體應(yīng)該采用哪種方式要根據(jù)具體情況而定,但后一種方式常常更為方便,因?yàn)樗恍韬?jiǎn)單地等待用戶的請(qǐng)求。如果數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)中,那么,即使客戶端使用動(dòng)態(tài)Web內(nèi)容,比如applet,我們依舊需要執(zhí)行服務(wù)器端處理。顯然,這樣很愚蠢;這種情況下,我們需要與數(shù)據(jù)庫(kù)進(jìn)行會(huì)話。畢竟數(shù)據(jù)庫(kù)調(diào)用通常是對(duì)速度影響最大的步驟,因而,經(jīng)過(guò)中間層可以執(zhí)行高速緩存和連接共享。例如,Servlet能夠嵌入到FTP或郵件服務(wù)器中,擴(kuò)展他們的功能。但在實(shí)踐中,servelt的這種用法尚不流行,在此,我們只論述HTTP Servlet。應(yīng)用傳統(tǒng)的CGI,針對(duì)每個(gè)HTTP請(qǐng)求都用啟動(dòng)一個(gè)新的進(jìn)程。而使用Servelt,Java虛擬機(jī)會(huì)一直運(yùn)行,并用輕量級(jí)的Java線程處理每個(gè)請(qǐng)求,而非重量級(jí)的操作系統(tǒng)進(jìn)程。同樣的情況,如果使用Servlet則啟動(dòng)N個(gè)線程,單僅僅載入Servlet類的單一副本。最后,當(dāng)CGI程序結(jié)束對(duì)請(qǐng)求的處理之后,程序結(jié)束。然而,Servelt會(huì)一直停留在內(nèi)存中(即使請(qǐng)求處理完畢),因而可以直接存儲(chǔ)客戶請(qǐng)求之間的任意復(fù)雜數(shù)據(jù)。Servlet能夠直接于Web服務(wù)器對(duì)話,而常規(guī)的CGI程序做不到這一點(diǎn),至少在不使用服務(wù)器專有API的情況下是這樣。多個(gè)Servelt還可以共享數(shù)據(jù),從而易于實(shí)現(xiàn)數(shù)據(jù)庫(kù)連接共享和類似的資源共享優(yōu)化。附錄2 英文參考資料Servlet program running in the serverside, dynamically generated Web page with the traditional CGI and many other similar pared to CGI technology, Java Servlet with a more efficient, easier to use, more powerful and has better portability, more savings to invest.Servlets are Java programs that run on Web or application servers, acting as a middle layer between requests ing from Web browsers or other HTTP clients and databases or applications on the HTTP server. Their job is to perform the following tasks, as illustrated in Figure 11.Figure 11 Web middleware roleFigure 11 shows a single arrow going from the client to the Web server (the layer where servlets and JSP execute), but there are really two varieties of data: the explicit data that the end user enters in a form and the behindthescenes HTTP information. Both varieties are critical. The HTTP information includes cookies, information about media types and pression schemes the browser understands, and so on.This process may require talking to a database, executing an RMI or EJB call, invoking a Web service, or puting the response directly. Your real data may be in a relational database. Fine. But your database probably doesn39。t talk directly to the database. Even if it could, for security reasons, you probably would not want it to. The same argument applies to most other need the Web middle layer to extract the results inside a document.This document can be sent in a variety of formats, including text (HTML or XML), binary (GIF images), or even a pressed format like gzip that is layered on top of some other underlying format. But, HTML is by far the most mon format, so an important servlet/JSP task is to wrap the results inside of HTML.Figure 11 shows a single arrow going from the Web middle layer (the servlet or JSP page) to the client. But, there are really two varieties of data sent: the document itself and the behindthescenes HTTP information. Again, both varieties are critical to effective development. Sending HTTP response data involves telling the browser or other client what type of document is being returned (., HTML), setting cookies and caching parameters, and other such tasks. For instance, the results page from search engines and orderconfirmation pages at online stores are specific to particular user requests. You don39。ll only be discussing HTTP servlets.Java servlets are more efficient, easier to use, more powerful, more portable, safer, and cheaper than traditional CGI and many alternative CGIlike technologies.With traditional CGI, a new process is started for each HTTP request. If the C