第8章 JSP MVC編程電子課件_第1頁(yè)
第8章 JSP MVC編程電子課件_第2頁(yè)
第8章 JSP MVC編程電子課件_第3頁(yè)
第8章 JSP MVC編程電子課件_第4頁(yè)
第8章 JSP MVC編程電子課件_第5頁(yè)
已閱讀5頁(yè),還剩72頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

JSP開發(fā)案例教程第8章JSP

MVC編程本章內(nèi)容概述:MVC編程模式簡(jiǎn)介案例ch8.2_goods:商品管理系統(tǒng)8.18.2小結(jié)與練習(xí)8.4練習(xí)案例:商品分類管理、用戶管理8.3PARTONE8.1MVC編程模式簡(jiǎn)介8.1.1MVC編程模式概述4MVC編程模式,即Model-View-Controller(模型-視圖-控制器)模式,用于應(yīng)用程序的分層開發(fā),其運(yùn)行模式如圖8-1所示。模型Model,代表數(shù)據(jù)對(duì)象和業(yè)務(wù)規(guī)則,它通常帶有業(yè)務(wù)邏輯,在數(shù)據(jù)變化時(shí)能通知視圖進(jìn)行更新。視圖View,代表模型所包含數(shù)據(jù)的可視化??刂破鰿ontroller,作用于模型和視圖,它接收視圖提交的請(qǐng)求,將數(shù)據(jù)流向模型對(duì)象,并在數(shù)據(jù)變化時(shí)可選擇相應(yīng)視圖。它使視圖與模型實(shí)現(xiàn)了代碼分離。概念圖8-1MVC的運(yùn)行模式目的:將M和V實(shí)現(xiàn)代碼分離,從而使同一個(gè)程序可以使用不同的表現(xiàn)形式。C存在的目的則是確保M和V的同步,一旦M改變,V應(yīng)該同步更新。8.1.2MVC編程模式的優(yōu)點(diǎn)5快速的部署MVC分層簡(jiǎn)化了分組開發(fā),不同的開發(fā)人員可分別開發(fā)視圖、控制器和業(yè)務(wù)邏輯,也讓應(yīng)用程序的測(cè)試更加容易。低耦合性視圖層和業(yè)務(wù)層分離,允許只更改視圖層代碼而不用重新編譯模型和控制器代碼;更改一個(gè)應(yīng)用的業(yè)務(wù)流程或者業(yè)務(wù)規(guī)則,通常只需改變MVC的模型層即可。123456高重用性和可適用性采用不同的方式來訪問應(yīng)用程序。較低的生命周期成本MVC使開發(fā)和維護(hù)用戶接口的技術(shù)含量降低??删S護(hù)性分離視圖層和業(yè)務(wù)邏輯層使Web應(yīng)用更易于維護(hù)和升級(jí)。有利于軟件工程化管理由于不同的層、不同的文件各司其職,每一層中不同的應(yīng)用具有某些相同的特征,有利于通過工程化、工具化管理程序代碼。8.1.3MVC編程在JSP中的體現(xiàn)6JSP編程中的MVC,可簡(jiǎn)單理解成模型M對(duì)應(yīng)JavaBean,視圖V對(duì)應(yīng)JSP頁(yè)面,控制器C對(duì)應(yīng)Servlet,三者間的層次關(guān)系如圖8-2所示。圖8-2MVC中的層次關(guān)系Model通常由JavaBean來充當(dāng),實(shí)體類、業(yè)務(wù)邏輯、數(shù)據(jù)操作等都在Model中實(shí)現(xiàn)。JSP頁(yè)面作為視圖層,即表現(xiàn)層,負(fù)責(zé)收集用戶請(qǐng)求,將應(yīng)用的處理結(jié)果、消息等呈現(xiàn)給用戶。Servlet可充當(dāng)控制器角色,它的作用類似于調(diào)度員:將用戶請(qǐng)求發(fā)送給Servlet,Servlet調(diào)用Model來處理用戶請(qǐng)求,并交由JSP頁(yè)來呈現(xiàn)結(jié)果。PARTTWO8.2案例ch8.2_goods:商品管理系統(tǒng)8.2案例ch8.2_goods8工作流程圖

在MySQLWorkbench中創(chuàng)建數(shù)據(jù)庫(kù)db_goods包和文件夾的功能說明樣式文件JSP標(biāo)準(zhǔn)標(biāo)簽庫(kù)JSTL簡(jiǎn)介頁(yè)頭header.jsp和頁(yè)腳footer.jsp用戶登錄商品平鋪式列表頁(yè)商品列表頁(yè)商品圖片管理頁(yè)商品詳情頁(yè)商品詳情–商品圖片管理頁(yè)新添商品的輸入頁(yè)新添商品的執(zhí)行修改商品的輸入頁(yè)修改商品的執(zhí)行刪除商品主要內(nèi)容:8.2.1工作流程圖9圖8-3商品管理系統(tǒng)的工作流程圖商品管理系統(tǒng)的主要功能有用戶登錄、用戶管理、商品管理、分類管理等。系統(tǒng)的工作流程圖如圖8-3所示。角色獨(dú)特功能通用功能管理員admin全部管理功能在登錄之后都能注銷登錄、查看和修改用戶自己的個(gè)人信息普通用戶user商品管理

和分類管理訪客guest10項(xiàng)目的文件列表如圖8-4至8-6所示??梢钥吹剑诸恡ype、用戶user的相關(guān)文件與商品goods的相應(yīng)文件類似。圖8-4項(xiàng)目文件列表圖8-5包src/main/java中的文件列表圖8-6JSP等文件列表8.2.1工作流程圖8.2.2在MySQLWorkbench中

創(chuàng)建數(shù)據(jù)庫(kù)db_goods11商品管理系統(tǒng)數(shù)據(jù)庫(kù)數(shù)據(jù)表db_goodstb_usertb_typetb_goods12表tb_user的字段和數(shù)據(jù),與案例ch7.2_student(學(xué)生管理系統(tǒng))中的tb_user表一致,只是密碼password字段的值采用的是MD5“加密”后的值(為32個(gè)字符)。字段名數(shù)據(jù)類型字段說明userIdINT(11)用戶ID。主鍵,非空,自增長(zhǎng)usernameVARCHAR(45)用戶名。值唯一passwordVARCHAR(45)密碼。32位的MD5值realNameVARCHAR(45)真實(shí)姓名roleVARCHAR(5)用戶角色。管理員admin,普通用戶user,注冊(cè)用戶guesttimeRenewDATETIME更新時(shí)間。默認(rèn)值為當(dāng)前系統(tǒng)時(shí)間CURRENT_TIMESTAMP,即now()8.2.2在MySQLWorkbench中

創(chuàng)建數(shù)據(jù)庫(kù)db_goods13表tb_type的字段和數(shù)據(jù)情況如表8-1以及如圖8-7、8-8所示。字段名數(shù)據(jù)類型字段說明typeIdINT(11)分類ID。主鍵,非空,自增長(zhǎng)typeNameVARCHAR(45)分類名稱。值唯一noteVARCHAR(2000)備注timeRenewDATETIME更新時(shí)間。默認(rèn)值為當(dāng)前系統(tǒng)時(shí)間CURRENT_TIMESTAMP,即now()表8-1數(shù)據(jù)表tb_type的字段圖8-7商品分類表tb_user的字段圖8-8商品分類表tb_user中的數(shù)據(jù)8.2.2在MySQLWorkbench中

創(chuàng)建數(shù)據(jù)庫(kù)db_goods14表tb_goods中的字段和數(shù)據(jù)情況如表8-2以及如圖8-9、8-10所示。其中字段typeId和typeName的值源自于表tb_type。表8-1數(shù)據(jù)表tb_goods的字段圖8-9商品表tb_goods的字段圖8-10商品表tb_goods中的數(shù)據(jù)字段名數(shù)據(jù)類型字段說明goodsIdINT(11)商品ID。主鍵,非空,自增長(zhǎng)goodsNoVARCHAR(45)商品編碼。值唯一goodsNameVARCHAR(45)商品名稱typeIdINT分類IDtypeNameVARCHAR(45)分類名稱priceFLOAT價(jià)格stockINT庫(kù)存數(shù)量timeSaleDATETIME開始銷售時(shí)間imageVARCHAR(45)商品圖片的文件名detailVARCHAR(10000)商品簡(jiǎn)介timeRenewDATETIME更新時(shí)間。默認(rèn)值為當(dāng)前時(shí)間CURRENT_TIMESTAMP8.2.2在MySQLWorkbench中

創(chuàng)建數(shù)據(jù)庫(kù)db_goods8.2.3包和文件夾的功能說明15導(dǎo)入素材Web項(xiàng)目ch8.2_goods_Ex。項(xiàng)目的包src/main/java中有10個(gè)子包:bean、dao、service、servlet_*(6個(gè))和util,這些包按照用途用于存放相應(yīng)JavaBean類或Servlet類的Java文件,如圖8-5所示。這些包的用途和所包含的類如表8-3所示。圖8-5包src/main/java中的文件列表16包名類的用途包含的類及功能說明bean實(shí)體類3個(gè)實(shí)體類Goods、Type和User,在DAO層、Service層、Servlet層和JSP頁(yè)面中有應(yīng)用dao數(shù)據(jù)訪問層實(shí)現(xiàn)數(shù)據(jù)的增、刪、改、查操作(1)數(shù)據(jù)操作類Db,響應(yīng)DAO層的調(diào)用,對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)執(zhí)行查詢和更新操作,返回操作結(jié)果給DAO層(2)數(shù)據(jù)訪問類GoodsDao、TypeDao和UserDao,響應(yīng)Service層的請(qǐng)求,調(diào)用Db類中的方法,實(shí)現(xiàn)數(shù)據(jù)記錄的增刪改查操作,返回結(jié)果給Service層service業(yè)務(wù)邏輯層實(shí)現(xiàn)業(yè)務(wù)處理業(yè)務(wù)處理類GoodsImageService、GoodsService、LoginService、TypeService和UserService,對(duì)Servlet層傳遞來的表單數(shù)據(jù)或URL參數(shù)進(jìn)行獲取和校驗(yàn),調(diào)用DAO層的方法實(shí)現(xiàn)數(shù)據(jù)的處理,完成業(yè)務(wù)處理后將實(shí)體類對(duì)象存入request,將結(jié)果反饋給Servlet層servlet_*控制器層轉(zhuǎn)發(fā)頁(yè)面請(qǐng)求給業(yè)務(wù)邏輯層,根據(jù)反饋進(jìn)行頁(yè)面跳轉(zhuǎn)servlet_*包總共有6個(gè),每個(gè)包中有若干Servlet類(1)servlet_goods、servlet_type和servlet_user中的Servlet類,先進(jìn)行用戶權(quán)限驗(yàn)證,然后將頁(yè)面請(qǐng)求轉(zhuǎn)發(fā)給Service層,根據(jù)Service層處理的結(jié)果重定向或轉(zhuǎn)發(fā)到相應(yīng)JSP頁(yè)面(2)servlet_image中的Servlet類,調(diào)用GoodsImageService中的方法實(shí)現(xiàn)商品圖片的顯示、上傳或刪除(3)servlet_login中的Servlet類,調(diào)用LoginService中的方法,實(shí)現(xiàn)登錄驗(yàn)證和注銷登錄(4)servlet_verifyCode中的Servlet類,直接生成圖片驗(yàn)證碼util權(quán)限檢查,

MD5“加密”(1)類LoginCheck中的靜態(tài)方法檢查用戶是否登錄,查驗(yàn)用戶的角色級(jí)別是否足夠(2)類MD5中的靜態(tài)方法getMd5(),根據(jù)請(qǐng)求的字符串參數(shù),生成32位摘要值(32個(gè)字符)并返回表8-3包src/main/java中的包8.2.3包和文件夾的功能說明17文件夾src/main/webapp的及其子文件夾按照用途存放相應(yīng)頁(yè)面的*.jsp文件和其他輔助文件,這些子文件夾的用途和所包含的文件如表8-4所示。文件夾子文件說明子文件列表根目錄系統(tǒng)基礎(chǔ)功能的相關(guān)頁(yè)面首頁(yè)index.jsp、登錄頁(yè)login.jsp、用戶功能頁(yè)main.jsp、頁(yè)頭header.jsp和頁(yè)腳footer.jspgoods商品管理的相關(guān)頁(yè)面文件列表list、詳情show、新添add和修改edit商品圖片上傳頁(yè)goodsImageUpload.jsp平鋪式商品列表頁(yè)goodsListLayout.jsp能管理商品圖片的商品詳情頁(yè)goodsShowImageRenew.jsptype分類管理的相關(guān)頁(yè)面文件列表list、詳情show、新添add和修改edituser用戶管理的相關(guān)頁(yè)面文件列表list、詳情show、新添add和修改edit用戶注冊(cè)頁(yè)register.jspcss頁(yè)面的外部樣式文件css.css用于常規(guī)頁(yè)面cssGoodsListLayout.css用于平鋪式列表頁(yè)goodsListLayout.jspcssHeaderFooter.css用于頁(yè)頭header.jsp、頁(yè)腳footer.jspfileUpload上傳的文件fileUpload/goodsImage存放上傳的商品圖片image圖片文件頁(yè)面logo圖片,詳情和修改鏈接的圖標(biāo)UEditor一種由百度推出的開源的富文本編輯器包含一些*.js、*.html、*.css和圖片等文件,在新添商品的輸入頁(yè)goodsAdd.jsp和編輯的輸入頁(yè)goodsEditor.jsp中有應(yīng)用data_數(shù)據(jù)導(dǎo)入導(dǎo)出導(dǎo)入數(shù)據(jù)庫(kù)的SQL腳本導(dǎo)入、導(dǎo)出數(shù)據(jù)庫(kù)的說明db_goods.txt導(dǎo)入導(dǎo)出數(shù)據(jù).txtWEB-INF/libjar庫(kù)文件文件上傳組件,JDBC驅(qū)動(dòng)程序,JSTL標(biāo)簽庫(kù)表8-4src/main/webapp中的子文件夾8.2.3包和文件夾的功能說明8.2.4樣式文件18樣式文件css/css.css與案例ch7.2_student(學(xué)生管理系統(tǒng))中的文件css/css.css所定義的樣式基本相同,本章案例增加了2個(gè)樣式,增加的樣式代碼如下。本案例中的常規(guī)頁(yè)面都引用了此樣式文件。樣式文件css/cssHeaderFooter.css樣式文件css/cssGoodsListLayout.css只應(yīng)用于頁(yè)頭從文件head.jsp和頁(yè)腳從文件footer.jsp。只應(yīng)用于商品平鋪式列表頁(yè)goodsListLayout.jsp。8.2.5JSP標(biāo)準(zhǔn)標(biāo)簽庫(kù)JSTL簡(jiǎn)介19JSTL標(biāo)簽庫(kù),即JSP標(biāo)準(zhǔn)標(biāo)簽庫(kù)(Javaserverpagesstandardedtaglibrary),是由JCP(JavaCommunityProcess)所制定的標(biāo)準(zhǔn)規(guī)范,它主要提供給JavaWeb開發(fā)人員一個(gè)標(biāo)準(zhǔn)通用的標(biāo)簽庫(kù),開發(fā)人員可以利用這些標(biāo)簽取代JSP頁(yè)面上一些簡(jiǎn)單常用的Java代碼,使Java代碼與HTML代碼實(shí)現(xiàn)分離,讓網(wǎng)頁(yè)開發(fā)更符合MVC設(shè)計(jì)理念,從而提高程序的可讀性,降低程序的維護(hù)難度。概念在Web項(xiàng)目中需要使用JSTL標(biāo)簽庫(kù)時(shí),需手動(dòng)將taglibs-standard-impl-1.2.5.jar和

taglibs-standard-spec-1.2.5.jar這兩個(gè)庫(kù)文件添加到文件夾src/main/webapp/WEB-INF/lib,這兩個(gè)類庫(kù)文件在Apache官方網(wǎng)站能下載到。在網(wǎng)頁(yè)中使用JSTL標(biāo)簽庫(kù)時(shí),需在頁(yè)面開頭位置應(yīng)用taglib標(biāo)簽庫(kù)指令<%@taglibprefix="c"uri="/jsp/jstl/core"%>聲明標(biāo)簽庫(kù),標(biāo)簽庫(kù)的前綴prefix通常聲明為c,并需指明標(biāo)簽庫(kù)的格式規(guī)范uri。在網(wǎng)頁(yè)代碼中使用的JSTL標(biāo)簽是類似<c:*>…</c:*>的標(biāo)簽,常見的標(biāo)簽有判斷語(yǔ)句<c:if>、循環(huán)語(yǔ)句<c:forEach>和賦值語(yǔ)句<c:set>等。8.2.6頁(yè)頭header.jsp和頁(yè)腳footer.jsp20打開頁(yè)頭文件header.jsp,修改代碼,代碼如下。打開頁(yè)腳文件footer.jsp,其代碼可無需修改。頁(yè)頭、頁(yè)腳在用戶登錄頁(yè)面中的預(yù)覽效果如圖8-11所示。8.2.7用戶登錄21商品管理系統(tǒng)中用戶登錄頁(yè)面使用了圖片驗(yàn)證碼、AJAX技術(shù)和使用JavaScript代碼進(jìn)行網(wǎng)頁(yè)跳轉(zhuǎn),登錄頁(yè)的預(yù)覽效果如圖8-11所示。圖8-11用戶登錄頁(yè)以MVC分層開發(fā)模式實(shí)現(xiàn)用戶登錄功能,涉及以下7個(gè)類和2個(gè)網(wǎng)頁(yè),其中字體紅色的類和網(wǎng)頁(yè)需修改:servlet_verifyCode.VerifyCodeNumCharutil.Md5bean.Userdao.Dbdao.UserDaoservice.LoginServiceservlet_login.LoginDologin.jspmain.jsp22操作2:備好字符“加密”類Md5在包util中創(chuàng)建類Md5.java,其主要代碼如下。代碼中的“加密”方法getMd5(Stringstr)能根據(jù)傳入的字符串參數(shù)str,“加密”后返回32位(有些MD5方法返回16位)的字符。此MD5類在用戶登錄驗(yàn)證、新添用戶和修改用戶密碼時(shí)都有使用。注:平常我們說應(yīng)用MD5加密某些字符或文件,并不是真正的加密,其實(shí)是使用MD5摘要算法獲取其32位的摘要字符串,“加密”后是無法還原的。而普通的加密軟件對(duì)內(nèi)容進(jìn)行加密后,是可以還原的。MD5算法在編程開發(fā)中通常用于校驗(yàn)輸入的密碼是否與原來的一致。操作1:備好圖片驗(yàn)證碼Servlet類VerifyCodeNumChar此Servlet類與本書6.5.5小節(jié)所創(chuàng)建的類相同,能直接生成由數(shù)字和大寫字母組成的4位驗(yàn)證碼圖片。8.2.7用戶登錄23操作3:修改登錄頁(yè)面login.jsp在網(wǎng)站根目錄中打開用戶登錄頁(yè)login.jsp,修改代碼,其主要代碼如下。代碼中的第20行引入了頁(yè)頭從文件header.jsp。代碼第43行引入了頁(yè)腳從文件footer.jsp。在代碼第37行,使用EL表達(dá)式${msg}輸出在request中保存的消息msg,在注銷登錄時(shí)有應(yīng)用。在代碼第8行,引入了jQuery框架的js文件。圖8-11用戶登錄頁(yè)8.2.7用戶登錄24操作4:修改用戶功能頁(yè)main.jsp用戶成功登錄后將打開用戶功能頁(yè)main.jsp,該網(wǎng)頁(yè)根據(jù)在session中保存的對(duì)象myUser中的用戶角色級(jí)別role,顯示不同的功能鏈接,打開main.jsp,修改代碼,其代碼如下。圖8-12管理員的用戶功能頁(yè)8.2.7用戶登錄25操作5:備好數(shù)據(jù)操作類Db類文件Db.java存放在包dao中,此文件與本書第7章所應(yīng)用的類文件Db.java幾乎相同,只是代碼第9行的數(shù)據(jù)庫(kù)名改成了db_goods。該數(shù)據(jù)操作類能根據(jù)參數(shù)中的SQL語(yǔ)句和其他參數(shù)值,對(duì)數(shù)據(jù)表中記錄實(shí)現(xiàn)增刪改查操作。操作6:備好用戶實(shí)體類User用戶數(shù)據(jù)在MVC各層之間傳輸時(shí),是以用戶對(duì)象user或用戶對(duì)象列表userList的形式傳輸?shù)?,所以要?shí)現(xiàn)用戶登錄和用戶管理等功能,需要用到用戶實(shí)體類User。打開商品實(shí)體類文件bean/Goods.java,其主要代碼如下。8.2.7用戶登錄26操作7:修改用戶數(shù)據(jù)訪問類UserDao登錄驗(yàn)證時(shí),需要根據(jù)輸入的用戶名和“加密”后的密碼去查詢tb_user表,即需要用到用戶數(shù)據(jù)訪問層的JavaBean類UserDao,調(diào)用UserDao中的查詢數(shù)據(jù)的方法queryByUsernameAndPassword(),以判斷所輸入的用戶名和密碼是否正確。打開dao/UserDao.java,修改代碼,其部分主要代碼如下。用戶數(shù)據(jù)訪問類UserDao能響應(yīng)用戶登錄業(yè)務(wù)處理類LoginService的請(qǐng)求,調(diào)用數(shù)據(jù)操作類Db中的方法完成數(shù)據(jù)的查詢操作,并將生成的User對(duì)象user反饋給LoginService。如果登錄失敗,則返回的user對(duì)象為null,并且將相關(guān)提示信息保存到request對(duì)象。如果登錄成功,則讀取tb_user表中userId和role字段的值,并給user對(duì)象的userId、username和role屬性賦值,最后返回user對(duì)象。8.2.7用戶登錄27操作8:修改用戶登錄業(yè)務(wù)處理類LoginService用戶登錄業(yè)務(wù)處理類LoginService能響應(yīng)控制層Servlet類LoginDo的請(qǐng)求,進(jìn)行業(yè)務(wù)處理和向UserDao發(fā)起數(shù)據(jù)訪問的請(qǐng)求,并將業(yè)務(wù)處理的執(zhí)行結(jié)果反饋給Servlet類LoginDo。打開service/LoginService.java,修改代碼,其主要代碼如下。在代碼第18~37行,獲取輸入的值并對(duì)值進(jìn)行數(shù)據(jù)校驗(yàn)。在代碼第39~50行,判斷輸入的驗(yàn)證碼是否與生成圖片驗(yàn)證碼時(shí)保存在session中的值相同。在代碼第52~66行,先調(diào)用Md5類中的方法getMd5(username+password+salt)生成“新”的密碼,然后調(diào)用UserDao類中的方法判斷所輸入的用戶名和密碼是否正確。如果user對(duì)象不為null,則表示通過登錄驗(yàn)證,將user對(duì)象存入session,并返回true給Servlet類LoginDo。8.2.7用戶登錄28操作9:修改用戶登錄控制層Servlet類LoginDo打開servlet_login/LoginDo.java,修改代碼,其主要代碼如下??刂茖拥牡卿涷?yàn)證Servlet類LoginDo能響應(yīng)瀏覽器的請(qǐng)求,調(diào)用業(yè)務(wù)處理類LoginService中的方法

loginDo(),最后根據(jù)返回的boolean值,決定返回給登錄頁(yè)login.jsp是要在頁(yè)面顯示的消息(登錄失敗時(shí)),還是含網(wǎng)頁(yè)跳轉(zhuǎn)URL的信息(登錄成功時(shí))。至此,用戶登錄功能所涉及的2個(gè)頁(yè)面(login.jsp、main.jsp),和7個(gè)類(VerifyCodeNumChar、Md5、bean.User、Db、UserDao、LoginService、LoginDo)都已準(zhǔn)備完成,可測(cè)試用戶登錄功能,登錄成功后將跳轉(zhuǎn)到用戶功能頁(yè)main.jsp,如圖8-12所示。8.2.7用戶登錄29操作10:備好用戶退出登錄Servlet類Logout包servlet_login中的Servlet類Logout,用于用戶退出登錄,其主要代碼如下。操作11:備好用戶權(quán)限檢查的類LoginCheck包util中的JavaBean類LoginCheck中的3個(gè)方法分別用于檢查用戶是否登錄,判斷用戶是否為管理員admin或user角色用戶,以及判斷是否為管理員或用戶自己(查看、修改用戶信息時(shí)),其主要代碼如下。8.2.7用戶登錄8.2.8商品平鋪式列表頁(yè)30要實(shí)現(xiàn)商品平鋪式列表功能,涉及以下8個(gè)類和1個(gè)網(wǎng)頁(yè),其中字體紅色的類和網(wǎng)頁(yè)需修改:bean.Goodsdao.Dbdao.GoodsDaoservice.GoodsServicebean.Typedao.TypeDaoservice.TypeServiceservlet_goods.GoodsListLayoutgoods/goodsListLayout.jsp圖8-13商品平鋪式列表商品平鋪式列表的測(cè)試效果如圖8-13所示。31操作1:備好商品實(shí)體類Goods打開商品實(shí)體類文件bean/Goods.java,其主要代碼如下。操作2:修改商品數(shù)據(jù)訪問類GoodsDao打開商品實(shí)體類文件bean/GoodsDao.java,修改代碼,其部分主要代碼如下。8.2.8商品平鋪式列表頁(yè)32操作3:修改商品業(yè)務(wù)處理類GoodsService打開類文件service/GoodsService.java,修改代碼,其部分主要代碼如下。第29~35行的代碼是有關(guān)批量刪除記錄的。在代碼的第148~152行,如果session中有消息msg,則與request中的消息msg合并,刪除session中的消息msg,最后將合并后的msg保存到request對(duì)象。當(dāng)在商品詳情頁(yè)刪除商品時(shí),會(huì)將消息msg保存到session,然后以重定向的形式跳轉(zhuǎn)到商品平鋪式列表頁(yè)。由于是重定向,所以需通過session臨時(shí)傳遞一下消息。方法queryAll()的業(yè)務(wù)邏輯是:根據(jù)控制層Servlet類GoodsListLayout的搜索請(qǐng)求或分頁(yè)請(qǐng)求,調(diào)用goodsDao.queryCount()獲得記錄總數(shù)并生成頁(yè)碼鏈接,接著調(diào)用goodsDao.queryAll()獲取該頁(yè)的記錄列表,最后將消息msg、搜索內(nèi)容search、已顯示的記錄數(shù)countShowed、頁(yè)碼鏈接page和商品對(duì)象列表goodsList都存入request對(duì)象,用于在商品平鋪式列表頁(yè)goodsListLayout.jsp以EL表達(dá)式方式顯示出來。由方法queryAll()的代碼可知,其業(yè)務(wù)邏輯的實(shí)現(xiàn)代碼,與案例ch7.2_student(學(xué)生管理系統(tǒng))的學(xué)生管理頁(yè)studentAdmin.jsp中的Java代碼類似。8.2.8商品平鋪式列表頁(yè)33操作4:修改商品平鋪式列表的控制層Servlet類GoodsListLayout打開Servlet類文件servlet_goods/GoodsListLayout.java,修改代碼,其主要代碼如下。第30~31行的代碼用于獲取商品分類對(duì)象列表,用于在頁(yè)面顯示在分類下拉列表控件的選項(xiàng)中。此時(shí)先將這兩行代碼注釋掉,在操作6~操作9中再來實(shí)現(xiàn)商品分類下拉列表控件。在代碼第27~28行,創(chuàng)建商品業(yè)務(wù)處理對(duì)象goodsService,調(diào)用其queryAll(request)方法生成商品對(duì)象列表等信息,然后以轉(zhuǎn)發(fā)形式跳轉(zhuǎn)到網(wǎng)頁(yè)goods/goodsListLayout.jsp,以在頁(yè)面顯示商品列表。8.2.8商品平鋪式列表頁(yè)34操作5:修改商品平鋪式列表頁(yè)goodsListLayout.jsp打開網(wǎng)頁(yè)goods/goodsListLayout.jsp,修改代碼,其代碼如下。代碼的第19~26行,用JSTL循環(huán)標(biāo)簽<c:forEach>生成了分類下拉列表的選項(xiàng),由于JSTL標(biāo)簽的友好特性,此循環(huán)不注釋掉,即使typeList對(duì)象列表在request對(duì)象中尚不存在,程序也不會(huì)報(bào)錯(cuò),只是此循環(huán)不會(huì)執(zhí)行。在代碼第38行和第70行使用了類似于if語(yǔ)句的JSTL條件標(biāo)簽<c:if>,在代碼第43行和第61行使用了類似于foreach遍歷循環(huán)語(yǔ)句的JSTL循環(huán)標(biāo)簽<c:forEach>。在代碼第48行,應(yīng)用img的onerror事件,當(dāng)圖片加載失敗時(shí),例如圖片不存在,則更改為顯示“無圖片”圖片noImage.png。在代碼第50行,類樣式goodsName能在商品名稱字符過多時(shí),隱藏后面的字符并以三個(gè)點(diǎn)表示。8.2.8商品平鋪式列表頁(yè)35操作6:備好商品分類實(shí)體類Type打開商品分類實(shí)體類文件bean/Type.java,其主要代碼如下。8.2.8商品平鋪式列表頁(yè)36操作7:備好商品分類數(shù)據(jù)訪問類TypeDao打開商品分類數(shù)據(jù)訪問類文件dao/TypeDao.java,其部分主要代碼如下。8.2.8商品平鋪式列表頁(yè)37操作8:修改商品分類業(yè)務(wù)處理類TypeService打開商品分類業(yè)務(wù)處理類文件service/TypeService.java,修改代碼,其代碼如下。第23行的代碼中,最后兩個(gè)參數(shù)分別代表開始讀取的記錄的序號(hào)和讀取的記錄總數(shù),分別設(shè)為0和9999,即讀取前9999條記錄,由于表tb_type中沒有9999條記錄,就相當(dāng)于讀取了所有的記錄。8.2.8商品平鋪式列表頁(yè)38操作9:實(shí)現(xiàn)商品分類下拉列表修改商品平鋪式列表頁(yè)goodsListLayout.jsp的代碼,實(shí)現(xiàn)商品分類下拉列表。瀏覽商品平鋪式列表頁(yè)的網(wǎng)址是http://localhost:8080/ch8.2_goods/GoodsListLayout,是由Servlet類GoodsListLayout在調(diào)用GoodsService中的方法之后,以轉(zhuǎn)發(fā)方式應(yīng)用goodsListLayout.jsp頁(yè)來顯示商品列表。如果直接預(yù)覽商品平鋪式列表頁(yè)goodsListLayout.jsp,由于在request對(duì)象或session對(duì)象中并無商品對(duì)象列表goodsList、頁(yè)碼等信息,所以,頁(yè)面中并不會(huì)顯示商品列表、頁(yè)碼等信息,且由于路徑問題也未能成功應(yīng)用CSS樣式文件和顯示logo圖片,但由于在頁(yè)面代碼中應(yīng)用的是JSTL標(biāo)簽和EL表達(dá)式,所以也不會(huì)報(bào)代碼錯(cuò)誤,如圖8-14所示。圖8-14直接預(yù)覽商品平鋪式列表頁(yè)goodsListLayout.jsp圖8-13商品平鋪式列表8.2.8商品平鋪式列表頁(yè)398.2.9商品列表頁(yè)商品平鋪式列表頁(yè)主要是方便游客或注冊(cè)用戶(guest角色)瀏覽、購(gòu)買商品用的,當(dāng)角色為admin或user級(jí)別的用戶在登錄系統(tǒng)后,在用戶功能頁(yè)點(diǎn)擊“商品列表”鏈接,在打開的商品列表頁(yè)中,將能對(duì)商品進(jìn)行新添、修改和刪除的操作,預(yù)覽效果如圖8-15所示。圖8-15商品列表頁(yè)要實(shí)現(xiàn)商品列表功能,主要涉及以下8個(gè)類和1個(gè)網(wǎng)頁(yè),其中字體紅色的類和網(wǎng)頁(yè)需修改:bean.Goodsdao.Dbdao.GoodsDaoservice.GoodsServicebean.Typedao.TypeDaoservice.TypeServiceservlet_goods.GoodsListgoods/goodsList.jsp40操作1:修改商品列表的控制層Servlet類GoodsList打開servlet_goods/GoodsList.java,修改代碼,其主要代碼如下。8.2.9商品列表頁(yè)41操作2:修改商品列表頁(yè)goodsList.jsp打開網(wǎng)頁(yè)goods/goodsList.jsp,修改代碼,其代碼如下。代碼修改完后,可以測(cè)試商品列表中的商品瀏覽功能了。操作3:修改商品數(shù)據(jù)訪問類GoodsDao打開類文件dao/GoodsDao.java,修改代碼,其主要代碼如下。8.2.9商品列表頁(yè)42操作4:修改商品業(yè)務(wù)處理類GoodsService在商品業(yè)務(wù)處理類GoodsService中,與商品批量刪除有關(guān)的代碼有兩部分。在queryAll()方法中,如果第29~35行的判斷語(yǔ)句代碼被注釋掉了,則將注釋取消,讓其能執(zhí)行。這段代碼的業(yè)務(wù)邏輯是:如果在請(qǐng)求request中監(jiān)測(cè)到用戶按下了刪除按鈕,則獲取所勾選的商品記錄復(fù)選框的值,得到goodsId數(shù)組,然后調(diào)用本類中621~692行的deleteByGoodsIdLot()方法,實(shí)現(xiàn)商品記錄的批量刪除。修改deleteByGoodsIdLot()方法的代碼,其代碼如下。至此,可以測(cè)試商品列表中的批量刪除功能了。8.2.9商品列表頁(yè)438.2.10商品圖片管理頁(yè)要實(shí)現(xiàn)商品圖片的管理功能,主要涉及到的類和網(wǎng)頁(yè)主要有:包service中的類GoodsImageService,包servlet_image中的類GoodsImageUpload、GoodsImageUploadDo、GoodsImageDeleteDo,以及網(wǎng)頁(yè)goods/goodsImageUpload.jsp。(1)包service中的業(yè)務(wù)邏輯層類GoodsImageService有5個(gè)方法方法getImageTag()能生成商品圖片的圖片標(biāo)簽“<img>”和圖片鏈接,便于在圖片上傳頁(yè)goodsImageUpload.jsp中顯示圖片和鏈接。方法getImageTagAndLink()能生成商品圖片的圖片標(biāo)簽“<img>”、圖片鏈接和管理鏈接,便于在圖片上傳頁(yè)顯示圖片和管理鏈接。該方法名對(duì)應(yīng)有2個(gè)重載的方法。方法imageUploadDo()實(shí)現(xiàn)了上傳圖片和調(diào)用goodsDao.editImage()方法更新表tb_goods中字段image的值。方法imageDeleteDo()實(shí)現(xiàn)了刪除圖片和調(diào)用goodsDao.editImage()方法更新表tb_goods中字段image的值。44(2)包servlet_image中有3個(gè)控制層的Servlet類類GoodsImageUpload中的業(yè)務(wù)流程是:先進(jìn)行用戶權(quán)限判斷,調(diào)用GoodsImageService類中的getImageTagAndLink()方法生成圖片標(biāo)簽和圖片鏈接,最后以轉(zhuǎn)發(fā)形式跳轉(zhuǎn)到網(wǎng)頁(yè)goods/goodsImageUpload.jsp。類GoodsImageUploadDo中的業(yè)務(wù)流程是:先進(jìn)行用戶權(quán)限判斷,調(diào)用GoodsImageService類中的imageUploadDo()方法實(shí)現(xiàn)上傳圖片和更新數(shù)據(jù)庫(kù),最后以轉(zhuǎn)發(fā)形式跳轉(zhuǎn)到網(wǎng)頁(yè)goods/goodsImageUpload.jsp。類GoodsImageDeleteDo中的業(yè)務(wù)流程是:先進(jìn)行用戶權(quán)限判斷,調(diào)用GoodsImageService類中的imageDeleteDo()方法實(shí)現(xiàn)刪除圖片和更新數(shù)據(jù)庫(kù),最后以重定向形式跳轉(zhuǎn)到圖片上傳頁(yè)GoodsImageUpload。8.2.10商品圖片管理頁(yè)45(3)在商品圖片管理頁(yè)goods/goodsImageUpload.jsp上有商品圖片、管理鏈接、文件域和提交按鈕等內(nèi)容,能對(duì)商品圖片進(jìn)行上傳、更換和刪除的管理操作。圖8-16商品圖片管理頁(yè)(在內(nèi)聯(lián)框架中)8.2.10商品圖片管理頁(yè)468.2.11商品詳情頁(yè)商品詳情頁(yè)的大致業(yè)務(wù)流程是:根據(jù)goodsId到商品表tb_goods中查詢?cè)撋唐酚涗?,然后將?shù)據(jù)在商品詳情網(wǎng)頁(yè)goodsShow.jsp中顯示出來,商品詳情頁(yè)的測(cè)試效果如圖8-17所示。圖8-17商品詳情頁(yè)要實(shí)現(xiàn)商品詳情功能,涉及以下5個(gè)類和1個(gè)網(wǎng)頁(yè),其中字體紅色的類和網(wǎng)頁(yè)需修改:bean.Goodsdao.Dbdao.GoodsDaoservice.GoodsServiceservlet_goods.GoodsShowgoods/goodsShow.jsp47操作1:修改商品數(shù)據(jù)訪問類GoodsDao打開類文件dao/GoodsDao.java,修改方法queryByGoodsId()的代碼,其代碼如下。8.2.11商品詳情頁(yè)48操作2:修改商品業(yè)務(wù)處理類GoodsService打開類文件service/GoodsService.java,修改方法queryByGoodsId()的代碼,其代碼如下。代碼的業(yè)務(wù)流程是,首先從request對(duì)象中獲取由地址欄參數(shù)傳遞的goodsId,對(duì)goodsId進(jìn)行有效性驗(yàn)證,然后調(diào)用GoodsDao中的方法queryByGoodsId()獲得Goods對(duì)象goods,最后將對(duì)象goods保存到request對(duì)象。在代碼的第196~200行,如果session中有消息msg,則將此msg與request中的消息msg合并,刪除session中的消息msg,最后將合并后的msg保存到request對(duì)象。當(dāng)新添商品和修改商品成功時(shí),會(huì)將消息msg保存到session,然后以重定向的形式跳轉(zhuǎn)到商品詳情頁(yè)。由于是重定向,所以需通過session臨時(shí)傳遞一下消息。8.2.11商品詳情頁(yè)49操作3:修改商品詳情的控制層Servlet類GoodsShow代碼的業(yè)務(wù)流程是,先檢查用戶權(quán)限,接著創(chuàng)建對(duì)象goodsService,調(diào)用其queryByGoodsId()方法,最后以轉(zhuǎn)發(fā)形式跳轉(zhuǎn)到網(wǎng)頁(yè)goods/goodsShow.jsp,以在網(wǎng)頁(yè)中顯示商品詳情。代碼第32~45行的業(yè)務(wù)流程是,將對(duì)象goods的image屬性值,以參數(shù)形式傳入方法getImageTag(),得到商品圖片的“<img>”標(biāo)簽等信息,然后將信息賦值給對(duì)象goods的image屬性,最后將對(duì)象goods存入request對(duì)象,用于在商品詳情頁(yè)顯示商品圖片。其實(shí)就是將image的值按一定的要求做了下處理。本來此業(yè)務(wù)處理應(yīng)該放在業(yè)務(wù)層GoodsService中,但考慮到方法goodsService.queryByGoodsId()還被其他的Servlet類調(diào)用,也為了簡(jiǎn)便(不再另外創(chuàng)建一個(gè)方法或給方法添加一個(gè)參數(shù)),就將該業(yè)務(wù)流程放在了以上代碼中。打開類文件servlet_goods/GoodsShow.java,修改代碼,其主要代碼如下。8.2.11商品詳情頁(yè)50操作4:修改商品詳情頁(yè)goodsShow.jsp打開網(wǎng)頁(yè)goods/goodsShow.jsp,修改代碼,其主要代碼如下。代碼修改完之后可測(cè)試商品詳情功能。圖8-17商品詳情頁(yè)8.2.11商品詳情頁(yè)518.2.12商品詳情-商品圖片管理頁(yè)操作1:修改控制層Servlet類GoodsShowImageRenew打開類文件servlet_goods/GoodsShowImageRenew.java,修改代碼,其主要代碼如下。圖8-18商品詳情–商品圖片管理頁(yè)52操作2:創(chuàng)建商品詳情–商品圖片管理頁(yè)goodsShowImageRenew.jsp在goods文件夾中打開goodsShow.jsp,將其另存為goodsShowImageRenew.jsp,其需要修改的代碼如下。8.2.12商品詳情-商品圖片管理頁(yè)8.2.13新添商品的輸入頁(yè)53新添商品的輸入頁(yè)goodsAdd.jsp與商品詳情頁(yè)goodsShow.jsp的頁(yè)面結(jié)構(gòu)類似,但不需要顯示商品數(shù)據(jù),增加了文本框、隱藏域、提交按鈕等表單控件,需要有商品分類對(duì)象列表typeList以顯示在分類下拉列表控件中,內(nèi)嵌了商品圖片管理頁(yè)以上傳商品圖片,引入了富文本編輯器UEditor以輸入商品的簡(jiǎn)介內(nèi)容,增加了JavaScript代碼以實(shí)現(xiàn)AJAX技術(shù)。新添商品的輸入頁(yè)的測(cè)試效果如圖8-19所示。圖8-19新添商品的輸入頁(yè)要實(shí)現(xiàn)新添的輸入頁(yè)功能,主要涉及以下5個(gè)類和1個(gè)網(wǎng)頁(yè),其中字體紅色的類和網(wǎng)頁(yè)需修改:bean.Typedao.Dbdao.TypeDaoservice.TypeServiceservlet_goods.GoodsAddgoods/goodsAdd.jsp54操作1:修改新添商品輸入的Servlet類GoodsAdd打開servlet_goods/GoodsAdd.java,修改代碼,其主要代碼如下。UUID(UniversallyUniqueIdentifier)稱為通用唯一識(shí)別碼,或通用唯一標(biāo)識(shí)。推出UUID的目的是讓分布式系統(tǒng)中的元素都能有唯一的識(shí)別信息,例如為數(shù)據(jù)庫(kù)中的每條記錄做唯一標(biāo)識(shí)。UUID是基于當(dāng)前時(shí)間、計(jì)數(shù)器和硬件標(biāo)識(shí)(通常為網(wǎng)卡的MAC地址)等數(shù)據(jù)計(jì)算生成的。UUID是由一組32位數(shù)的16進(jìn)制數(shù)字所構(gòu)成,理論上有32的16次方個(gè)不同的值,可視作不會(huì)重復(fù)的字符串。一個(gè)UUID值的例子是:54cdfe94-d256-42ea-a0bf-0bc5c9ace9ef8.2.13新添商品的輸入頁(yè)55操作2:修改新添商品的輸入頁(yè)goodsAdd.jsp打開goods/goodsAdd.jsp,修改代碼,其主要代碼如下。代碼第39~41行,應(yīng)用JSTL循環(huán)標(biāo)簽<c:forEach>在下拉列表中顯示商品分類的選擇項(xiàng)。在代碼第71~72行,應(yīng)用iframe內(nèi)聯(lián)框架將商品管理頁(yè)嵌入到網(wǎng)頁(yè)中。iframe的src中的參數(shù)goodsId的值是臨時(shí)的商品ID(goodsUUID)。圖片文件上傳時(shí)是以商品ID為文件名保存在服務(wù)器中的,而新添商品時(shí),還沒有商品記錄,也就沒有商品ID,所以新添商品時(shí)在商品管理頁(yè)中上傳圖片時(shí),就用這個(gè)臨時(shí)的商品ID(goodsUUID)作為圖片的文件名。代碼第73行的隱藏域的值也是臨時(shí)的商品ID(goodsUUID)。商品記錄新添到數(shù)據(jù)庫(kù)后,需要將已上傳的圖片文件的文件名由臨時(shí)的商品ID重命名為新記錄的商品ID。在代碼第79行和第134~142行,應(yīng)用了富文本編輯器UEditor來輸入商品簡(jiǎn)介的內(nèi)容。UEditor最早是百度公司推出的,后貢獻(xiàn)給了開源組織,它能讓用戶像使用Word一樣進(jìn)行比較復(fù)雜的圖文排版。在代碼第134行和第135行,分別引入了UEditor所需的JavaScript配置文件和源代碼文件。第137~141行的代碼創(chuàng)建UE對(duì)象ue,對(duì)id為“detail”的控件(在代碼第79行)進(jìn)行初始化并在頁(yè)面顯示富文本編輯器。在代碼第107行使用ue.getContent()來獲取在富文本編輯器中所輸入的內(nèi)容。8.2.13新添商品的輸入頁(yè)56要在富文本編輯器中插入圖片,可以在其他的瀏覽器選項(xiàng)卡或窗口中復(fù)制所需圖片,然后在富文本編輯器中使用快捷鍵Ctrl+V進(jìn)行粘貼,圖片就會(huì)顯示在編輯器中,之后還可以調(diào)整圖片的大小、位置等。也可以單擊富文本編輯器左上角的“HTML”按鈕,將編輯器的輸入框切換成源代碼形式,然后修改或設(shè)置圖片的地址、大小等,這樣就可以將圖片地址更改為本網(wǎng)站根目錄src/main/webapp子文件夾中的圖片地址。如圖8-20中的富文本編輯器將顯示兩張logo圖片,第一張是直接復(fù)制加粘貼后的,得到的是圖片的絕對(duì)路徑;第二張是將粘貼之后的網(wǎng)址修改成了“image/logoGoods1.png”,得到的圖片路徑是本網(wǎng)站中的相對(duì)路徑。圖8-20富文本編輯器中的圖片路徑8.2.13新添商品的輸入頁(yè)8.2.14新添商品的執(zhí)行57在新添商品的輸入頁(yè)輸入商品信息,單擊“提交”按鈕,將商品信息新添到數(shù)據(jù)庫(kù),新添商品成功后跳轉(zhuǎn)到該商品的詳情頁(yè),并在頁(yè)面下邊顯示新添記錄成功的消息,測(cè)試效果如圖8-21所示。圖8-21新添商品成功要實(shí)現(xiàn)新添商品的執(zhí)行功能,主要涉及以下7個(gè)類,其中字體紅色的類需修改或創(chuàng)建:bean.Goodsdao.Dbdao.GoodsDaoservice.GoodsServicebean.Typedao.TypeDaoservlet_goods.GoodsAddDo58操作1:修改商品數(shù)據(jù)訪問類GoodsDao打開dao/GoodsDao.java,修改代碼,其要修改的代碼如下。方法addGoods()將商品數(shù)據(jù)新添到表tb_goods中并返回新記錄的ID。方法existByGoodsNo()判斷在表tb_goods中是否已經(jīng)存在所輸入的商品編碼的記錄。8.2.14新添商品的執(zhí)行59操作2:修改商品業(yè)務(wù)處理類GoodsServiceaddGoods(),實(shí)現(xiàn)了新添商品信息,其業(yè)務(wù)流程是:獲取所輸入的商品信息并進(jìn)行有效性驗(yàn)證;調(diào)用方法goodsDao.existByGoodsNo()判斷在商品記錄中是否已存在所輸入的商品編碼;調(diào)用方法typeDao.queryByTypeId()判斷所選擇的分類在分類記錄中是否存在,如果存在,則獲取所返回的分類對(duì)象type的typeName的屬性值;根據(jù)輸入的商品信息創(chuàng)建商品對(duì)象goods;調(diào)用方法goodsDao.addGoods()將所對(duì)象goods的數(shù)據(jù)新添到數(shù)據(jù)表tb_goods,并得到新記錄的goodsId;然后將已上傳的商品圖片用新的goodsId重命名,更新數(shù)據(jù)表中該商品對(duì)應(yīng)記錄的字段image的值;如果以上操作全部成功,則將消息msg存入session,此消息將在商品詳情頁(yè)中顯示;最后返回goodsId。打開service/GoodsService.java,修改代碼,其要修改的代碼如下。8.2.14新添商品的執(zhí)行60操作3:創(chuàng)建新添商品的執(zhí)行Servlet類GoodsAddDo在包servlet_goods中新建新添商品執(zhí)行Servlet類GoodsAddDo,其代碼與Servlet類GoodsList.java中的代碼比較接近,可復(fù)制過來稍加修改,其最后的主要代碼如下。圖8-17商品詳情頁(yè)8.2.14新添商品的執(zhí)行8.2.15修改商品的輸入頁(yè)61修改商品的輸入頁(yè)goodsEdit.jsp與新添商品的輸入頁(yè)goodsAdd.jsp的非常類似,但需要在頁(yè)面顯示商品的信息。修改商品輸入的測(cè)試效果如圖8-22所示。圖8-22修改商品的輸入頁(yè)要實(shí)現(xiàn)商品的修改輸入頁(yè)列表功能,主要涉及以下8個(gè)類和1個(gè)網(wǎng)頁(yè),其中字體紅色的類和網(wǎng)頁(yè)需創(chuàng)建:bean.Goodsdao.Dbdao.GoodsDaoservice.GoodsServicebean.Typedao.TypeDaoservice.TypeServiceservlet_goods.GoodsEditgoods/goodsEdit.jsp62操作1:創(chuàng)建修改商品輸入的Servlet類GoodsEdit在包servlet_goods中新建修改商品輸入的Servlet類GoodsEdit,其代碼與Servlet類servlet_goods.GoodsAdd中的代碼非常類似,可復(fù)制過來稍加修改,其最后的主要代碼如下。主要業(yè)務(wù)邏輯是:根據(jù)goodsId查詢?cè)撋唐返挠涗浬蓪?duì)象goods,同時(shí)也生成分類對(duì)象列表typeList,這些數(shù)據(jù)將顯示在頁(yè)面goodsEdit.jsp中。8.2.15修改商品的輸入頁(yè)63操作2:創(chuàng)建修改商品的輸入頁(yè)goodsEdit.jsp在代碼第15行和第100行,添加了JSTL標(biāo)簽<c:if>。在代碼第142~47行,添加了在下拉列表中選中某選項(xiàng)的代碼。在代碼第80行的位置,沒有隱藏域控件。在代碼第118行的位置,沒有獲取隱藏域控件的值的代碼。在代碼第121行,url的值有變化。在代碼第125行的位置,沒有g(shù)oodsUUID鍵值對(duì)。在文件夾webapp/goods中,將goodsAdd.jsp另存為goodsEdit.jsp,還可以參考goodsShow.jsp中的代碼,稍作修改,goodsEdit.jsp最后的主要代碼如下。圖8-22修改商品的輸入頁(yè)8.2.15修改商品的輸入頁(yè)61修改商品的執(zhí)行與新添商品的執(zhí)行在實(shí)現(xiàn)邏輯方面非常類似,可以借用部分代碼。修改商品輸入的測(cè)試效果如圖8-22所示。圖8-22修改商品的輸入頁(yè)要實(shí)現(xiàn)修改商品的執(zhí)行功能,主要涉及以下7個(gè)類,其中字體紅色的類需修改:bean.Goodsdao.Dbdao.GoodsDaoservice.GoodsServicebean.Typedao.TypeDaoservlet_goods.GoodsEditDo8.2.16修改商品的執(zhí)行64操作1:修改商品數(shù)據(jù)訪問類GoodsDao方法editGoods()實(shí)現(xiàn)了將修改后的商品數(shù)據(jù)更新到表tb_goods,并將更新記錄的條數(shù)count返回打開dao/GoodsDao.java,修改代碼,修改后的部分代碼如下。繼續(xù)修改GoodsDao.java的代碼,修改后的部分代碼如下。方法existByGoodsNoExptId()的業(yè)務(wù)邏輯是檢查是否存在商品編碼相同而與ID不同的商品記錄,是為了確保修改后的商品編碼與已有的其他商品的編碼都不相同。8.2.16修改商品的執(zhí)行65操作2:修改商品業(yè)務(wù)處理類GoodsService更新商品信息的方法editGoods()的業(yè)務(wù)邏輯是:獲取商品ID并進(jìn)行校驗(yàn),獲取表單輸入值并進(jìn)行數(shù)據(jù)校驗(yàn),檢查當(dāng)前商品記錄是否還存在,檢查所輸入的商品編碼是否與已存在商品記錄的商品編碼相同,檢查所選擇的分類記錄是否還存在,然后創(chuàng)建商品對(duì)象goods并給其屬性賦值,然后調(diào)用類GoodsDao當(dāng)中的editGoods()方法執(zhí)行記錄更新,根據(jù)返回值count將是否修改成功的布爾值返回。如果修改成功,還將消息msg存入session,此消息將在商品詳情頁(yè)中顯示出來。打開dao/GoodsService.java,修改代碼,修改后的部分代碼如下。8.2.16修改商品的執(zhí)行66操作3:創(chuàng)建修改商品執(zhí)行的Servlet類GoodsEditDo在包servlet_goods中創(chuàng)建Servlet類GoodsEditDo.java,其絕大部分代碼與GoodsAddDo.java中的代碼相同。GoodsEditDo.java最后的主要代碼如下。8.2.16修改商品的執(zhí)行8.2.17刪除商品67批量刪除商品記錄的功能在商品列表頁(yè)中已經(jīng)實(shí)現(xiàn)。這里所要實(shí)現(xiàn)的刪除商品功能,是指在商品詳情頁(yè)goodsShow.jsp中點(diǎn)擊“刪除”鏈接,刪除該商品記錄,然后跳轉(zhuǎn)到商品列表Servlet地址GoodsList,并在頁(yè)面的下方顯示“刪除記錄成功?!钡南?,測(cè)試效果如圖8-23所示。圖8-23刪除商品成功要實(shí)現(xiàn)商品的刪除功能,主要涉及以下5個(gè)類,其中字體紅色的類需修改:bean.Goodsdao.Dbdao.GoodsDaoservice.GoodsServiceservlet_goods.GoodsDeleteDo68操作1:修改商品數(shù)據(jù)訪問類GoodsDao打開dao/GoodsDao.java,修改代碼,修改后的部分代碼如下。8.2.17刪除商品69操作2:修改商品業(yè)務(wù)處理類GoodsService打開dao/GoodsService.java,修改代碼,修改后的部分代碼如下。方法deleteByGoodsId()的業(yè)務(wù)邏輯是:獲取商品ID并進(jìn)行校驗(yàn),獲取表單輸入值并進(jìn)行輸入數(shù)據(jù)校驗(yàn),調(diào)用方法goodsDao.queryByGoodsId()檢查當(dāng)前商品記錄是否還存在,調(diào)用方法goodsDao.queryByGoodsId()刪除該商品記錄,并將是否刪除成功的boolean值返回,同時(shí)將消息msg存入session對(duì)象。8.2.17刪除商品70操作3:創(chuàng)建刪除商品執(zhí)行的Servlet類GoodsDeleteDo在包servlet_goods中創(chuàng)建Servlet類GoodsDeleteDo.java,其絕大部分代碼與其他的Servlet

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論