版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
MVC開發(fā)模式使得互聯(lián)網(wǎng)應(yīng)用程序開發(fā)事半功倍,是學(xué)好JavaWEB開發(fā)的重要基石也是核心內(nèi)容,然而,MVC開發(fā)模式概念抽象不易理解,也成為JavaWEB開發(fā)學(xué)習(xí)的瓶頸,本項(xiàng)目通過用戶功能模塊的詳細(xì)設(shè)計(jì)講解MVC開發(fā)模式,再基于MVC開發(fā)模式實(shí)現(xiàn)商品信息的管理。熟悉MVC分層開發(fā)模式原理掌握基于MVC開發(fā)模式設(shè)計(jì)原理能設(shè)計(jì)MVC開發(fā)模式的代碼結(jié)構(gòu)能實(shí)現(xiàn)基于MVC開發(fā)模式的信息更新與查詢?nèi)蝿?wù)編號任務(wù)名稱任務(wù)7.1MVC分層開發(fā)模式設(shè)計(jì)任務(wù)7.2實(shí)現(xiàn)MVC模式下商品信息添加任務(wù)7.3實(shí)現(xiàn)MVC模式下商品信息顯示任務(wù)7.1MVC分層開發(fā)模式設(shè)計(jì)對于剛剛開始工作的小J,要先從簡單一點(diǎn)的功能上手——MVC分層開發(fā)模式設(shè)計(jì).采用MVC框架模式可以實(shí)現(xiàn)WEB系統(tǒng)的職能分工,包括模型層、視圖層、控制層。通過分層開發(fā)模式,開發(fā)人員可以只關(guān)注整個(gè)結(jié)構(gòu)中的其中某一層,很容易的用新的實(shí)現(xiàn)來替換原有層次的實(shí)現(xiàn),可以降低層與層之間的依賴,有利于標(biāo)準(zhǔn)化和各層邏輯的復(fù)用。本任務(wù)是在理解MVC分層開發(fā)模式的基礎(chǔ)上,根據(jù)需求功能分析進(jìn)行ED電子商務(wù)網(wǎng)站的軟件設(shè)計(jì)。知識目標(biāo):理解MVC設(shè)計(jì)模式,以及各層職能分工與實(shí)現(xiàn)形式掌握J(rèn)SP+Servlet+JavaBean+JDBC多種技術(shù)綜合的開發(fā)方法技能目標(biāo):能夠根據(jù)需求分析,采用MVC分層開發(fā)模式設(shè)計(jì)思想,設(shè)計(jì)功能實(shí)現(xiàn)架構(gòu)。MVC(ModelViewController模型-視圖-控制器)設(shè)計(jì)創(chuàng)建Web應(yīng)用程序的模式包括以下三個(gè)部分:Model(模型)是應(yīng)用程序中用于處理應(yīng)用程序數(shù)據(jù)邏輯的部分,負(fù)責(zé)在數(shù)據(jù)庫中存取數(shù)據(jù)。View(視圖)是應(yīng)用程序中處理數(shù)據(jù)顯示的部分,依據(jù)模型數(shù)據(jù)創(chuàng)建的。Controller(控制器)是應(yīng)用程序中處理用戶交互的部分,負(fù)責(zé)從視圖讀取數(shù)據(jù),控制用戶輸入,并向模型發(fā)送數(shù)據(jù)。MVC分層開發(fā)模式中模型、視圖、控制以及用戶的操作形成了一個(gè)閉環(huán),如圖所示。本任務(wù)中軟件設(shè)計(jì)的過程將從模型層設(shè)計(jì)、控制層設(shè)計(jì)、視圖層設(shè)計(jì)三個(gè)環(huán)節(jié)分別展開,其中模型層又包括數(shù)據(jù)模型層、接口層和數(shù)據(jù)操作層。項(xiàng)目1數(shù)據(jù)庫設(shè)計(jì)系統(tǒng)功能較多,在實(shí)現(xiàn)環(huán)節(jié)通過用戶功能模塊進(jìn)行詳細(xì)闡述。數(shù)據(jù)實(shí)體模型層分析與設(shè)計(jì)——User.java
數(shù)據(jù)模型層是MVC模式中M(Model)中的一部分,是為了數(shù)據(jù)存儲和讀取方便,定義的映射數(shù)據(jù)表的結(jié)構(gòu)與關(guān)系的Java類,數(shù)據(jù)表中的字段與類的屬性一一對應(yīng),可以說實(shí)體模型類是數(shù)據(jù)表在程序中的映射表示,表與類的映射關(guān)系如表所示。數(shù)據(jù)表數(shù)據(jù)實(shí)體類數(shù)據(jù)表類表字段類屬性表記錄類對象除了屬性意外,在實(shí)體模型類中的方法還包括無參構(gòu)造方法、有參構(gòu)造方法和屬性的GettersandSetters,user_info表與User類的對照關(guān)系如圖所示。數(shù)據(jù)表結(jié)構(gòu)已經(jīng)在數(shù)據(jù)實(shí)體模型層中定義,數(shù)據(jù)表上操作方法(如增、刪、改、查)則在接口層進(jìn)行定義。在在用戶功能模塊中功能包括:用戶登錄驗(yàn)證用戶注冊用戶信息修改根據(jù)用戶名查詢用戶信息用戶列表更新用戶積分禁用用戶重置密碼接口中定義如圖:接口層分析與設(shè)計(jì)數(shù)據(jù)操作層是接口層的實(shí)現(xiàn)類,在數(shù)據(jù)操作類中實(shí)現(xiàn)接口中所定義的數(shù)據(jù)表的相關(guān)操作方法。由于不同的操作類中用到的數(shù)據(jù)庫訪問對象相同,如Connection、PreparedStatement、ResultSet等,因此定義一個(gè)操作類的父類SupserOpr,將這些共用的屬性封裝在其中,不同表的操作類繼承父類就可以共享獲取連接的方法。對于user_info表的數(shù)據(jù)操作類UserDaoImpl如下定義:數(shù)據(jù)操作類UserDaoImpl,繼承自SuperOpr(繼承了父類的共用屬性),實(shí)現(xiàn)了UserDao接口(實(shí)現(xiàn)了不同表上的功能方法),同時(shí)與User實(shí)體類具有強(qiáng)關(guān)聯(lián)關(guān)系,因?yàn)閁serDaoImpl的方法中一直引用了User類進(jìn)行數(shù)據(jù)的存取。UserDaoImpl代碼略。數(shù)據(jù)操作層分析與設(shè)計(jì)在UserServlet中只有兩個(gè)方法:doGet(HttpServletRequestrequest,HttpServletResponseresponse)和doPost(HttpServletRequestrequest,HttpServletResponseresponse),其中,doGet方法中調(diào)用doPost方法,在doPost方法中實(shí)現(xiàn)邏輯處理。在doPost方法中,根據(jù)不同的操作參數(shù)進(jìn)入不同的分支,處理流程如圖所示控制層分析與設(shè)計(jì)視圖層是與用戶交互的頁面部分,對于用戶功能模塊,視圖層包括:用戶注冊、用戶修改、用戶列表(用戶取消也在此頁面上執(zhí)行)、用戶登錄、找回密碼共5個(gè)頁面。頁面的設(shè)計(jì)一般根據(jù)后臺功能的需求來進(jìn)行,例如用戶注冊功能,需要用到用戶相關(guān)信息包括名稱、密碼、住址等等,因此在用戶界面的表單中需要設(shè)置這些標(biāo)段屬性;再如用戶登錄功能,需要根據(jù)用戶名、密碼在數(shù)據(jù)庫中進(jìn)行驗(yàn)證,因此在登錄界面就包含了用戶名和密碼以及驗(yàn)證碼表單屬性。視圖層分析與設(shè)計(jì)1、MVC設(shè)計(jì)思想MVC英文即Model-View-Controller,即把一個(gè)應(yīng)用的輸入、處理、輸出流程按照Model、View、Controller的方式進(jìn)行分離,這樣一個(gè)應(yīng)用被分成三個(gè)層——模型層、視圖層、控制層。視圖(View):代表用戶交互界面,對于Web應(yīng)用來說,可以概括為HTML界面,但有可能為XHTML、XML和Applet。隨著應(yīng)用的復(fù)雜性和規(guī)模性,界面的處理也變得具有挑戰(zhàn)性。一個(gè)應(yīng)用可能有很多不同的視圖,MVC設(shè)計(jì)模式對于視圖的處理僅限于視圖上數(shù)據(jù)的采集和處理,以及用戶的請求,而不包括在視圖上的業(yè)務(wù)流程的處理。業(yè)務(wù)流程的處理交予模型(Model)處理。比如一個(gè)訂單的視圖只接受來自模型的數(shù)據(jù)并顯示給用戶,以及將用戶界面的輸入數(shù)據(jù)和請求傳遞給控制和模型。模型(Model):就是業(yè)務(wù)流程/狀態(tài)的處理以及業(yè)務(wù)規(guī)則的制定。業(yè)務(wù)流程的處理過程對其它層來說是黑箱操作,模型接受視圖請求的數(shù)據(jù),并返回最終的處理結(jié)果。業(yè)務(wù)模型的設(shè)計(jì)可以說是MVC最主要的核心。目前流行的EJB模型就是一個(gè)典型的應(yīng)用例子,它從應(yīng)用技術(shù)實(shí)現(xiàn)的角度對模型做了進(jìn)一步的劃分,以便充分利用現(xiàn)有的組件,但它不能作為應(yīng)用設(shè)計(jì)模型的框架。它僅僅告訴你按這種模型設(shè)計(jì)就可以利用某些技術(shù)組件,從而減少了技術(shù)上的困難。對一個(gè)開發(fā)者來說,就可以專注于業(yè)務(wù)模型的設(shè)計(jì)。MVC設(shè)計(jì)模式把應(yīng)用的模型按一定的規(guī)則抽取出來,抽取的層次很重要,這也是判斷開發(fā)人員是否優(yōu)秀的設(shè)計(jì)依據(jù)。業(yè)務(wù)模型還有一個(gè)很重要的模型那就是數(shù)據(jù)模型。數(shù)據(jù)模型主要指實(shí)體對象的數(shù)據(jù)保存(持續(xù)化)。比如將一張訂單保存到數(shù)據(jù)庫,從數(shù)據(jù)庫獲取訂單。我們可以將這個(gè)模型單獨(dú)列出,所有有關(guān)數(shù)據(jù)庫的操作只限制在該模型中??刂?Controller):可以理解為從用戶接收請求,將模型與視圖匹配在一起,共同完成用戶的請求。劃分控制層的作用也很明顯,它清楚地告訴你,它就是一個(gè)分發(fā)器,選擇什么樣的模型,選擇什么樣的視圖,可以完成什么樣的用戶請求??刂茖硬⒉蛔鋈魏蔚臄?shù)據(jù)處理。例如,用戶點(diǎn)擊一個(gè)連接,控制層接受請求后,并不處理業(yè)務(wù)信息,它只把用戶的信息傳遞給模型,告訴模型做什么,選擇符合要求的視圖返回給用戶。因此,一個(gè)模型可能對應(yīng)多個(gè)視圖,一個(gè)視圖可能對應(yīng)多個(gè)模型。模型、視圖與控制器的分離,使得一個(gè)模型可以具有多個(gè)顯示視圖。如果用戶通過某個(gè)視圖的控制器改變了模型的數(shù)據(jù),所有其它依賴于這些數(shù)據(jù)的視圖都應(yīng)反映到這些變化。因此,無論何時(shí)發(fā)生了何種數(shù)據(jù)變化,控制器都會(huì)將變化通知所有的視圖,導(dǎo)致顯示的更新。這實(shí)際上是一種模型的變化-傳播機(jī)制。模型、視圖、控制器三者之間的關(guān)系和各自的主要功能。2、MVC的優(yōu)點(diǎn)大部分用過程語言開發(fā)出來的Web應(yīng)用,初始的開發(fā)模板就是混合層的數(shù)據(jù)編程。例如,直接向數(shù)據(jù)庫發(fā)送請求并用HTML顯示,開發(fā)速度往往比較快,但由于數(shù)據(jù)頁面的分離不是很直接,因而很難體現(xiàn)出業(yè)務(wù)模型的樣子或者模型的重用性。產(chǎn)品設(shè)計(jì)彈性力度很小,很難滿足用戶的變化性需求。MVC要求對應(yīng)用分層,雖然要花費(fèi)額外的工作,但產(chǎn)品的結(jié)構(gòu)清晰,產(chǎn)品的應(yīng)用通過模型可以得到更好地體現(xiàn)。首先,最重要的是應(yīng)該有多個(gè)視圖對應(yīng)一個(gè)模型的能力。在目前用戶需求的快速變化下,可能有多種方式訪問應(yīng)用的要求。例如,訂單模型可能有本系統(tǒng)的訂單,也有網(wǎng)上訂單,或者其他系統(tǒng)的訂單,但對于訂單的處理都是一樣,也就是說訂單的處理是一致的。按MVC設(shè)計(jì)模式,一個(gè)訂單模型以及多個(gè)視圖即可解決問題。這樣減少了代碼的復(fù)制,即減少了代碼的維護(hù)量,一旦模型發(fā)生改變,也易于維護(hù)。其次,由于模型返回的數(shù)據(jù)不帶任何顯示格式,因而這些模型也可直接應(yīng)用于接口的使用。再次,由于一個(gè)應(yīng)用被分離為三層,因此有時(shí)改變其中的一層就能滿足應(yīng)用的改變。一個(gè)應(yīng)用的業(yè)務(wù)流程或者業(yè)務(wù)規(guī)則的改變只需改動(dòng)MVC的模型層。第三,控制層的概念也很有效,由于它把不同的模型和不同的視圖組合在一起完成不同的請求,因此,控制層可以說是包含了用戶請求權(quán)限的概念。最后,它還有利于軟件工程化管理。由于不同的層各司其職,每一層不同的應(yīng)用具有某些相同的特征,有利于通過工程化、工具化產(chǎn)生管理程序代碼。3、MVC的不足(1)增加了系統(tǒng)結(jié)構(gòu)和實(shí)現(xiàn)的復(fù)雜性。對于簡單的界面,嚴(yán)格遵循MVC,使模型、視圖與控制器分離,會(huì)增加結(jié)構(gòu)的復(fù)雜性,并可能產(chǎn)生過多的更新操作,降低運(yùn)行效率。(2)視圖與控制器間的過于緊密的連接。視圖與控制器是相互分離,但確實(shí)聯(lián)系緊密的部件,視圖沒有控制器的存在,其應(yīng)用是很有限的,反之亦然,這樣就妨礙了他們的獨(dú)立重用。(3)視圖對模型數(shù)據(jù)的低效率訪問。依據(jù)模型操作接口的不同,視圖可能需要多次調(diào)用才能獲得足夠的顯示數(shù)據(jù)。對未變化數(shù)據(jù)的不必要的頻繁訪問,也將損害操作性能。(4)目前,一般高級的界面工具或構(gòu)造器不支持MVC模式。改造這些工具以適應(yīng)MVC需要和建立分離的部件的代價(jià)是很高的,從而造成使用MVC的困難。MVC框架發(fā)展過程(1)、Model1早期的JSP規(guī)范提出了兩種用JSP技術(shù)建立應(yīng)用程序的方式。這兩種方式在術(shù)語中分別稱作JSPModel1和JSPModel2,它們的本質(zhì)區(qū)別在于處理批量請求的位置不同。在Model1體系中,如圖所示,jsp頁面獨(dú)自響應(yīng)請求并將處理結(jié)果返回客戶。這里仍然存在表達(dá)與內(nèi)容的分離,因?yàn)樗缘臄?shù)據(jù)存取都是由bean來完成的。盡管Model1體系十分適合簡單應(yīng)用的需要,它卻不能滿足復(fù)雜的大型應(yīng)用程序的實(shí)現(xiàn)。不加選擇地隨意運(yùn)用Model1,會(huì)導(dǎo)致JSP頁內(nèi)被嵌入大量的腳本片段或Java代碼,特別是當(dāng)需要處理的請求量很大時(shí),情況更為嚴(yán)重。盡管這對于Java程序員來說可能不是什么大問題,但如果JSP頁面是由網(wǎng)頁設(shè)計(jì)人員開發(fā)并維護(hù)的――通常這是開發(fā)大型項(xiàng)目的規(guī)范――這就確實(shí)是個(gè)問題了。從根本上講,將導(dǎo)致角色定義不清和職責(zé)分配不明,給項(xiàng)目管理帶來不必要的麻煩。工作內(nèi)同包括:客戶將請求提交給JSP。JSP調(diào)用JavaBean組件進(jìn)行數(shù)據(jù)處理。如果數(shù)據(jù)處理需要數(shù)據(jù)庫支持,則使用JDBC操作數(shù)據(jù)庫數(shù)據(jù)。當(dāng)數(shù)據(jù)返回給JSP時(shí),JSP組織響應(yīng)數(shù)據(jù),返回給客戶端。(2)、Model2Model2體系結(jié)構(gòu),如圖所示,是一種把JSP與servlets聯(lián)合使用來實(shí)現(xiàn)動(dòng)態(tài)內(nèi)容服務(wù)的方法。它吸取了兩種技術(shù)各自的突出優(yōu)點(diǎn),用JSP生成表達(dá)層的內(nèi)容,讓servlets完成深層次的處理任務(wù)。在Model2中,servlets充當(dāng)控制者的角色,負(fù)責(zé)管理對請求的處理,創(chuàng)建JSP頁需要使用的bean和對象,同時(shí)根據(jù)用戶的動(dòng)作決定把那個(gè)JSP頁傳給請求者。特別要注意,在JSP頁內(nèi)沒有處理邏輯;它僅負(fù)責(zé)檢索原先由servlets創(chuàng)建的對象或beans,從servlet中提取動(dòng)態(tài)內(nèi)容插入靜態(tài)模板。在我看來,這是一種有代表性的方法,它清晰地分離了表達(dá)和內(nèi)容,明確了角色的定義以及開發(fā)者與網(wǎng)頁設(shè)計(jì)者的分工。事實(shí)上,項(xiàng)目越復(fù)雜,使用Model2體系結(jié)構(gòu)的好處就越大。Model2也是目前教材中所使用的開發(fā)模式。(3)、Struts模型Struts工作流程如圖所示??蛻籼峤徽埱笮畔?。中央控制器類(ActionServlet)通過讀取配置文件struts-config.xml),把表單數(shù)據(jù)填充到Formbean中。中央控制器將Http請求分發(fā)到相應(yīng)的Action處理。Action類調(diào)用Model組件進(jìn)行數(shù)據(jù)處理。中央控制器轉(zhuǎn)發(fā)相應(yīng)的Http請求到相應(yīng)的View組件。View組件將響應(yīng)信息返回給客戶端。2、主流MVC框架(1)、StrutsStruts是Apache軟件基金下Jakarta項(xiàng)目的一部分。Struts框架的主要架構(gòu)設(shè)計(jì)和開發(fā)者是CraigR.McClanahan。Struts是目前JavaWebMVC框架中不爭的王者。經(jīng)過長達(dá)五年的發(fā)展,Struts已經(jīng)逐漸成長為一個(gè)穩(wěn)定、成熟的框架,并且占有了MVC框架中最大的市場份額。但是Struts某些技術(shù)特性上已經(jīng)落后于新興的MVC框架。面對SpringMVC、Webwork2這些設(shè)計(jì)更精密,擴(kuò)展性更強(qiáng)的框架,Struts受到了前所未有的挑戰(zhàn)。但站在產(chǎn)品開發(fā)的角度而言,Struts仍然是最穩(wěn)妥的選擇。Struts有一組相互協(xié)作的類(組件)、Serlvet以及jsptaglib組成?;趕truts構(gòu)架的web應(yīng)用程序基本上符合JSPModel2的設(shè)計(jì)標(biāo)準(zhǔn),可以說是MVC設(shè)計(jì)模式的一種變化類型。根據(jù)上面對framework的描述,我們很容易理解為什么說Struts是一個(gè)webframwork,而不僅僅是一些標(biāo)記庫的組合。但Struts也包含了豐富的標(biāo)記庫和獨(dú)立于該框架工作的實(shí)用程序類。Struts有其自己的控制器(Controller),同時(shí)整合了其他的一些技術(shù)去實(shí)現(xiàn)模型層(Model)和視圖層(View)。在模型層,Struts可以很容易的與數(shù)據(jù)訪問技術(shù)相結(jié)合,包括EJB,JDBC和ObjectRelationBridge。在視圖層,Struts能夠與JSP,VelocityTemplates,XSL等等這些表示層組件想結(jié)合。Strutsframework是MVC模式的體現(xiàn),分別從模型、視圖、控制來介紹struts的體系結(jié)構(gòu)(Architecture)。視圖(View)主要由JSP建立,Struts自身包含了一組可擴(kuò)展的自定義標(biāo)簽庫(TagLib),可以簡化創(chuàng)建用戶界面的過程。目前包括:BeanTags,HTMLTags,LogicTags,NestedTags,TemplateTags這幾個(gè)Taglib。模型(Model)模型主要是表示一個(gè)系統(tǒng)的狀態(tài)。在Struts中,系統(tǒng)的狀態(tài)主要有ActiomFormBean體現(xiàn),一般情況下,這些狀態(tài)是非持久性的。如果需要將這些狀態(tài)轉(zhuǎn)化為持久性數(shù)據(jù)存儲,Struts本身也提供了Utitle包,可以方便的與數(shù)據(jù)庫操作??刂破鳎–ontroller)在Strutsframework中,Controller主要是ActionServlet,但是對于業(yè)務(wù)邏輯的操作則主要由Action、ActionMapping、ActionForward這幾個(gè)組件協(xié)調(diào)完成。其中,Action扮演了真正的業(yè)務(wù)邏輯的實(shí)現(xiàn)者,而ActionMapping和ActionForward則指定了不同業(yè)務(wù)邏輯或流程的運(yùn)行方向。(2)、SpringSpring是一個(gè)開源框架,是為了解決企業(yè)應(yīng)用開發(fā)的復(fù)雜性而創(chuàng)建的。Spring使使用基本的JavaBeans來完成以前只可能由EJB完成的事情變得可能了。然而,Spring的用途不僅限于服務(wù)器端的開發(fā)。從簡單性、可測試性和松耦合的角度而言,任何Java應(yīng)用都可以從Spring中受益。簡單來說,Spring是一個(gè)輕量的控制反轉(zhuǎn)和面向切面的容器框架,包含以下四個(gè)方面:輕量完整的Spring框架可以在一個(gè)大小只有1MB多的JAR文件里發(fā)布。并且Spring所需的處理開銷也是微不足道的。Spring是非侵入式的,從大小與開銷兩方面而言Spring都是輕量的??刂品崔D(zhuǎn)Spring通過一種稱作控制反轉(zhuǎn)(IoC)的技術(shù)促進(jìn)了松耦合。當(dāng)應(yīng)用了IoC,對象被動(dòng)地傳遞它們的依賴而不是自己創(chuàng)建或者查找依賴對象。面向切面Spring包含對面向切面編程的豐富支持,允許通過分離應(yīng)用的業(yè)務(wù)邏輯與系統(tǒng)服務(wù)進(jìn)行內(nèi)聚性的開發(fā)。應(yīng)用對象只完成業(yè)務(wù)邏輯,并不負(fù)責(zé)其它的系統(tǒng)關(guān)注點(diǎn),例如日志或事物支持。容器Spring包含和管理應(yīng)用對象的配置和生命周期,在這個(gè)意義上它是一種容器??梢耘渲媚愕拿總€(gè)bean如何被創(chuàng)建,基于一個(gè)配置原形為bean創(chuàng)建一個(gè)單獨(dú)的實(shí)例或者每次需要時(shí)都生成一個(gè)新的實(shí)例以及它們是如何相互關(guān)聯(lián)的。Spring的使用完全區(qū)別于傳統(tǒng)的龐大而笨重的重量級EJB容器,更加輕量與方便??蚣躍pring是由簡單的組件配置和組合復(fù)雜的應(yīng)用成為可能。在Spring中,應(yīng)用對象被聲明式地組合,典型地是在一個(gè)XML文件里。Spring也提供了很多基礎(chǔ)功能如事務(wù)管理、持久性框架集成等,程序員只負(fù)責(zé)應(yīng)用邏輯的開發(fā)。所有Spring的這些特征使得編程能夠更加清晰、可管理、并且更易于測試。請嘗試設(shè)計(jì)商品管理模塊、訂單管理模塊的MVC模式架構(gòu),以類關(guān)系圖形式體現(xiàn)。任務(wù)7.2實(shí)現(xiàn)MVC模式下商品信息添加對于剛剛開始工作的小J,要先從簡單一點(diǎn)的功能上手——實(shí)現(xiàn)MVC模式下商品信息添加。在MVC模式下,實(shí)現(xiàn)商品信息的添加。用戶輸入商品的相關(guān)信息后,將商品信息添加到數(shù)據(jù)庫中。知識目標(biāo):掌握MVC模式下更新數(shù)據(jù)庫的設(shè)計(jì)與實(shí)現(xiàn);掌握Servlet控制層具體實(shí)現(xiàn);掌握更新數(shù)據(jù)庫數(shù)據(jù)的封裝方法;技能目標(biāo):能應(yīng)用MVC設(shè)計(jì)模式實(shí)現(xiàn)向數(shù)據(jù)庫寫數(shù)據(jù)的功能。在本任務(wù)中通過MVC來實(shí)現(xiàn)商品的添加,即控制器從用戶接受請求,將模型和視圖匹配在一起,共同完成用戶的請求。商品添加時(shí)序圖如下圖所示,管理員向ProductServlet發(fā)送添加商品請求,由ProductServlet獲取商品信息相關(guān)參數(shù),并通過ProductDao完成對數(shù)據(jù)的添加,并將返回的結(jié)果發(fā)送給用戶。實(shí)體類:Product.java數(shù)據(jù)庫操作接口類:ProductDao.java數(shù)據(jù)庫操作實(shí)現(xiàn)類:ProductDaoImpl.java控制類:ProductServlet.java打開ProductDao.java文件,添加如下代碼:publicbooleanadd(Productp);在ProductDao接口中添加商品添加方法add()。1.publicbooleanadd(Productp){2. //TODOAuto-generatedmethodstub3. sql="insertintoproduct_info(code,name,type,brand,pic,num,price,sale,intro)values(?,?,?,?,?,?,?,?,?)";4. try{5. psmt=con.prepareStatement(sql);6. psmt.setString(1,p.getCode());7. psmt.setString(2,p.getName());8. psmt.setString(3,p.getType());9. psmt.setString(4,p.getBrand());10. psmt.setString(5,p.getPic());11. psmt.setDouble(6,p.getNum());12. psmt.setDouble(7,p.getPrice());13. psmt.setDouble(8,p.getSale());添加商品方法的實(shí)現(xiàn)。打開ProductDaoImpl.java文件,在文件中添加如下代碼:14.psmt.setString(9,p.getIntro());15. row=psmt.executeUpdate();16. }catch(SQLExceptione){17. e.printStackTrace();18. }19. returnrow>0?true:false;20.}程序說明:第3行:配置SQL語句插入一條新記錄至商品表product_info;第5-14行:設(shè)置SQL語句參數(shù);第15行:執(zhí)行SQL語句,返回執(zhí)行結(jié)果;第16-18行:異常處理。第19行:如果添加成功則返回true,否則返回false;右擊包c(diǎn)om.digitalweb.servlet,在彈出的菜單中選擇new->servlet,在彈出的對話框中輸入servlet名稱為ProductServlet,設(shè)置如圖所示。創(chuàng)建商品管理控制類ProductServlet。6.點(diǎn)擊“next”按鈕,進(jìn)入到XML生成向?qū)υ捒?,將Servlet/JSPMappingURL路徑修改為“/ProductServlet”,點(diǎn)擊“Finish”,完成文件的創(chuàng)建。自動(dòng)生成代碼如下:38. packagecom.digitalweb.servlet;39. importjava.io.IOException;40. importjava.io.PrintWriter;41. importjavax.servlet.ServletException;42. importjavax.servlet.http.HttpServlet;43. importjavax.servlet.http.HttpServletRequest;44. importjavax.servlet.http.HttpServletResponse;45. publicclassProductServletextendsHttpServlet{46. /**47. *ThedoGetmethodoftheservlet.<br>48. *49. *Thismethodiscalledwhenaformhasitstagvaluemethodequalstoget.50. *51. *@paramrequesttherequestsendbytheclienttotheserver52. *@paramresponsetheresponsesendbytheservertotheclient53. *@throwsServletExceptionifanerroroccurred54. *@throwsIOExceptionifanerroroccurred55. */publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)57. throwsServletException,IOException{58. response.setContentType("text/html");59. PrintWriterout=response.getWriter(); out60. .println("<!DOCTYPEHTMLPUBLIC\"-//W3C//DTDHTML4.01Transitional//EN\">");61. out.println("<HTML>");62. out.println("<HEAD><TITLE>AServlet</TITLE></HEAD>");63. out.println("<BODY>");64. out.print("Thisis");65. out.print(this.getClass());66. out.println(",usingtheGETmethod");67. out.println("</BODY>");68. out.println("</HTML>");69. out.flush();70. out.close();71. }/**73. *ThedoPostmethodoftheservlet.<br>74. *75. *Thismethodiscalledwhenaformhasitstagvaluemethodequalstopost.76. *77. *@paramrequesttherequestsendbytheclienttotheserver78. *@paramresponsetheresponsesendbytheservertotheclient79. *@throwsServletExceptionifanerroroccurred80. *@throwsIOExceptionifanerroroccurred81. */82. publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)83. throwsServletException,IOException{84. response.setContentType("text/html");85. PrintWriterout=response.getWriter(); out.println("<!DOCTYPEHTMLPUBLIC\"-//W3C//DTDHTML4.01Transitional//EN\">");87. out.println("<HTML>");88. out.println("<HEAD><TITLE>AServlet</TITLE></HEAD>");89. out.println("<BODY>");90. out.print("Thisis");91. out.print(this.getClass());92. out.println(",usingthePOSTmethod");93. out.println("</BODY>");94. out.println("</HTML>");95. out.flush();96. out.close();97. }98. }程序說明:第19-37行:處理GET請求的相關(guān)代碼。第45-59行:處理POST請求的相關(guān)代碼。7.修改doGet()方法代碼。刪除第21-33行間代碼,并添加代碼:doPost(request,response);修改后的doGet()代碼如下所示:1.publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)2. throwsServletException,IOException{3. doPost(request,response);4. }8. 修改doPost()方法代碼。刪除第49-59行自動(dòng)生成的代碼,修改doPost()代碼如下:1.publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)2. throwsServletException,IOException{3. response.setContentType("text/html;charset=UTF-8");4. PrintWriterout=response.getWriter();5. ProductDaoImplpdi=newProductDaoImpl();6. StringnextPage="ProductServlet?flag=list";7. HashMap<String,String[]>map=(HashMap<String,String[]>)request.getParameterMap();8. HttpSessionsession=request.getSession();9. booleanflag=true;10. if(map.get("flag")[0].equals("add")){11. Productp=newProduct();12. p.setBrand(map.get("brand")[0]);13. p.setCode(map.get("code")[0]);14. Stringintro=map.get("intro")[0];15. p.setIntro(map.get("intro")[0]);16. p.setName(map.get("name")[0]);17. p.setNum(Integer.parseInt(map.get("num")[0]));18. p.setPic(map.get("pic")[0]);19. p.setPrice(Double.parseDouble(map.get("price")[0]));20. p.setSale(Double.parseDouble(map.get("sale")[0]));21. p.setType(map.get("type")[0]);22. flag=pdi.add(p); 23. }24. if(flag)25. response.sendRedirect(nextPage);26. }<formid="add_news"name="add_news"method="post"action="../ProductServlet">程序說明:action屬性指表單提交時(shí)跳轉(zhuǎn)路徑,因?yàn)楸卷撁嬖赼dmin文件夾下,要跳轉(zhuǎn)至ProductServlet則需要使用“../ProductServlet”。設(shè)置商品添加頁面表單提交跳轉(zhuǎn)路徑。設(shè)置隱藏參數(shù),操作標(biāo)識符flag。<inputtype="hidden"name="flag"value="add">程序說明:
添加隱藏域,當(dāng)表單提交至Servlet時(shí),傳遞參數(shù)flag的值為add,即要求Servlet完成商品添加操作。啟動(dòng)tomcat,運(yùn)行商品添加頁面add_product.html,輸入商品信息后,點(diǎn)擊保存即完成商品的添加。任務(wù)7.3實(shí)現(xiàn)MVC模式下商品信息顯示對于剛剛開始工作的小J,要先從簡單一點(diǎn)的功能上手——實(shí)現(xiàn)MVC模式下商品信息顯示。
商品的列表顯示在電子商務(wù)網(wǎng)站后臺管理中是必不可少的一個(gè)主要界面,除了可以羅列所有商品以外,還可以在它的基礎(chǔ)上進(jìn)一步實(shí)現(xiàn)商品查詢、商品修改、商品刪除功能。在本任務(wù)實(shí)現(xiàn)后臺登錄用戶查看商品信息的功能,該功能使用MVC模式進(jìn)行實(shí)現(xiàn),商品信息管理列表頁面(list_product.jsp)的頁面效果如圖所示。知識目標(biāo):進(jìn)一步掌握MVC模式下數(shù)據(jù)讀取的設(shè)計(jì)與實(shí)現(xiàn);掌握Servlet控制層具體實(shí)現(xiàn);掌握從數(shù)據(jù)庫讀取數(shù)據(jù)的封裝方法;掌握J(rèn)SP顯示層數(shù)據(jù)處理的方法。技能目標(biāo):能應(yīng)用MVC設(shè)計(jì)模式實(shí)現(xiàn)向數(shù)據(jù)庫讀數(shù)據(jù)的功能。本任務(wù)在MVC模式下來實(shí)現(xiàn)商品信息的列表顯示,其中包括模型“Product”、控制器“ProductServlet”和視圖,即商品信息管理頁面“admin/list_product.jsp”。與前一個(gè)任務(wù)中添加商品功能的實(shí)現(xiàn)思路相似,控制器作為模型層與視圖層之間溝通的橋梁,分派用戶請求并選擇恰當(dāng)?shù)囊晥D用以顯示。商品信息顯示的時(shí)序圖如下圖所示,管理員向ProductServlet發(fā)送添加商品請求,由ProductServlet獲取商品信息相關(guān)參數(shù),并通過ProductDao完成對數(shù)據(jù)的添加,并將返回的結(jié)果發(fā)送給用戶。實(shí)體類:Product.java數(shù)據(jù)庫操作接口類:ProductDao.java數(shù)據(jù)庫操作實(shí)現(xiàn)類:ProductDaoImpl.java控制類:ProductServlet.java在“com.digitalweb.model”包中創(chuàng)建Product實(shí)體類,Product類表示商品信息,它的類結(jié)構(gòu)如圖所示。定義數(shù)據(jù)模型—?jiǎng)?chuàng)建Product實(shí)體類。在接口層的ProductDao接口中定義獲取商品列表方法“l(fā)ist()”。打開ProductDao.java文件,添加如下代碼:1.importjava.util.List;2.importcom.digitalweb.model.Product;3.publicinterfaceProductDao{4.……5.publicbooleanList<Product>(Productp);6.……7.}定義數(shù)據(jù)模型—定義接口層方法list()。1.publicclassProductDaoImplextendsSuperOprimplementsProductDao{2. publicbooleanadd(Productp){3. ……4. }5. publicArrayList<Product>list(){6. sql="select*fromproduct_infowherestatus=1";7. ArrayList<Product>list=newArrayList<Product>();8. try{9. psmt=con.prepareStatement(sql);10. rs=psmt.executeQuery();11. while(rs.next()){12. Productp=newProduct();13. p.setBrand(rs.getString("brand"));14. p.setCode(rs.getString("code"));定義數(shù)據(jù)模型—編寫數(shù)據(jù)操作層方法list()。15. p.setId(rs.getInt("id"));16. p.setIntro(rs.getString("intro"));17. p.setName(rs.getString("name"));18. p.setNum(rs.getInt("num"));19. p.setPic(rs.getString("pic"));20. p.setPrice(rs.getDouble("price"));21. p.setSale(rs.getDouble("sale"));22. p.setStatus(1);23. p.setType(rs.getString("type"));24. list.add(p);}}catch(SQLExceptione){27. e.printStackTrace();28. }29. returnlist;30. }31. }在上一任務(wù)創(chuàng)建的ProductServlet的doPost()中,實(shí)現(xiàn)獲取商品列表功能,將數(shù)據(jù)保存至session對象中,具體代碼如下:1. publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)2. throwsServletException,IOException{3. ……4. ProductDaoImplpdi=newProductDaoImpl();5. StringnextPage="ProductServlet?flag=list";6. HashMap<String,String[]>map=(HashMap<String,String[]>)request.getParameterMap();7. HttpSessionsession=request.getSession();8. booleanflag=true;9. if(map.get("flag")[0].equals("add")){10. ……//添加商品11. }12. elseif(map.get("flag")[0].equals("list")){13. session.setAttribute("productList",pdi.list());//調(diào)用ProductDaoImpl類list()方法14. nextPage="admin/list_product.jsp";//頁面跳轉(zhuǎn)15. }}控制層實(shí)現(xiàn)—編寫ProductServlet。1.<tablewidth="100%"border="0"cellspacing="0"cellpadding="0">2. <tr>3. <tdwidth="6%">選擇</td>4. <tdwidth="8%">序號</td>5. <tdwidth="30%">商品名稱</td>6. <tdwidth="10%">商品類型</td>7. <tdwidth="10%">價(jià)格</td>8. <tdwidth="10%">促銷</td>9. <tdwidth="10%">庫存</td>10. <tdwidth="8%">編輯</td>11. <tdwidth="8%">刪除</td>12. </tr>13. <%14. List<Product>productList=(List<Product>)session.getAttribute("productList");15. if(productList!=null){16. for(Productp:productList){17. Productp=productList.get(i);18. %>視圖層設(shè)實(shí)現(xiàn)—編輯商品信息列表list_product.jsp頁面。19.<tr>20. <tdheight="18">21. <inputname="checkbox"type="checkbox"value="checkbox"/>22. </td>23. <tdheight="18"><%=p.getCode()%></td>24. <tdheight="18"><%=p.getName()%></td>26. <tdheight="18"><%=p.getType()%></td>27. <tdheight="18"><%=p.getPrice()%></td>28. <tdheight="18"><%=p.getSale()%></td>29. <tdheight="18"><%=p.getNum()%></td>30. <tdheight="18"><imgsrc="tab/images/update.gif"width="9"height="9"/>[31. <ahref="update_product.jsp?id=<%=p.getId()%>">編輯</a>]</td>32. <tdheight="18"><imgsrc="tab/images/delete.gif"width="9"height="9"/>[33. <ahref="../ProductServlet?flag=delete&id=<%=p.getId()%>">刪除</a>]</td>34. </tr>35. <%}36. }%>37.</table>修改上述HTML代碼中<%%>中的Java代碼,可以將商品信息分頁顯示。Java代碼如下:<%List<Product>productList=(List<Product>)session.getAttribute("productList");intall=0;int
curPage=1;int
pageTotal=0;int
pageCount=6;if(productList!=null){ all=productList.size();
pageTotal=(all%pageCount)==0?all/pageCount:(all/pageCount+1); StringstrCurPage=request.getParameter("page"); if(strCurPage!=null){
curPage=Integer.parseInt(strCurPage); }
intstart=(cur1)*pageCount;
intend=curPage*pageCount>all?all:curPage*pageCount; for(int
i=start;i<end;i++){ Productp=productList.get(i);%>商品信息列表底部的分頁按鈕功能實(shí)現(xiàn)代碼:<tr> <tdwidth="25%"height="29"nowrap="nowrap">共<%=all%>條紀(jì)錄,當(dāng)前第<%=curPage%>/<%=pageTotal%>頁,每頁<%=pageCount%>條紀(jì)錄</td>…… <tablewidth="352"height="20"border="0"cell
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 交通事故私下調(diào)解協(xié)議書
- 個(gè)人土地補(bǔ)償協(xié)議書
- 闌尾結(jié)石病因介紹
- (立項(xiàng)備案申請模板)海砂淡化及機(jī)制砂項(xiàng)目可行性研究報(bào)告參考范文
- 2023年天津市河西區(qū)高考語文三模試卷
- 山東省菏澤市鄄城縣2024-2025學(xué)年七年級上學(xué)期期中生物學(xué)試題(解析版)-A4
- 2023年直流鼓風(fēng)機(jī)項(xiàng)目融資計(jì)劃書
- 護(hù)理資料培訓(xùn)課件 大便標(biāo)本采集相關(guān)知識
- 養(yǎng)老院老人康復(fù)設(shè)施使用管理制度
- 培訓(xùn)過程控制培訓(xùn)課件
- 2024年環(huán)保知識生態(tài)建設(shè)知識競賽-林業(yè)有害生物防治知識競賽考試近5年真題集錦(頻考類試題)帶答案
- 2024年新人教版四年級數(shù)學(xué)上冊《教材練習(xí)1練習(xí)一(附答案)》教學(xué)課件
- 我的教育故事
- 2023-2024學(xué)年人教版高中信息技術(shù)必修一第二章第一節(jié)《解決問題的一般過程和用計(jì)算機(jī)解決問題》教案
- 中學(xué)教職工安全知識測試練習(xí)試題
- 2024商業(yè)地產(chǎn)策劃定位和規(guī)劃設(shè)計(jì)合同書模板
- 玉溪大紅山鐵礦二期北采區(qū)采礦施工組織設(shè)計(jì)
- DB41-T 2704-2024 森林撫育技術(shù)規(guī)程
- 2024-2025學(xué)年全國中學(xué)生天文知識競賽備賽試題庫(含答案)
- 樂理知識考試題庫130題(含答案)
- 2025屆高考語文復(fù)習(xí):辨析并修改病句+課件
評論
0/150
提交評論