版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1環(huán)境和框架搭建1工程框架搭建1.1創(chuàng)建工程estore-ssm創(chuàng)建web工程,名為estore-ssm,javaee版本選擇6.0。1.2加入依賴包為工程加入依賴包,如下:1.3工程src組織結(jié)構(gòu)src組織結(jié)構(gòu)和之前的練習(xí)類似,請(qǐng)按照下面的組織結(jié)構(gòu)創(chuàng)建包、文件夾、接口、類和各種配置文件。其中,配置文件可以從之前的項(xiàng)目中拷貝,之后稍加修改即可。cn.estore包下面分5個(gè)子包c(diǎn)n.estore包下面分5個(gè)子包1.4頁(yè)面資源組織結(jié)構(gòu)請(qǐng)按照下面組織創(chuàng)建文件夾和文件,其中(1)common中的文件均提供,直接拷貝即可,之后再修改其中的各種鏈接pages里面放頁(yè)面,其下分cart、product、customer、order文件夾分別存放相應(yīng)模塊的頁(yè)面(2)resources提供,直接拷貝即可pages里面放頁(yè)面,其下分cart、product、customer、order文件夾分別存放相應(yīng)模塊的頁(yè)面index.jsp系統(tǒng)首頁(yè)resources里放資源文件,分css,images,js三個(gè)文件夾images里面分兩個(gè)文件夾,一個(gè)放商品圖片,一個(gè)放系統(tǒng)圖標(biāo)common里面放上側(cè),左側(cè),下側(cè)的固定頁(yè)面,以及登錄和商品搜索等固定頁(yè)面index.jsp系統(tǒng)首頁(yè)resources里放資源文件,分css,images,js三個(gè)文件夾images里面分兩個(gè)文件夾,一個(gè)放商品圖片,一個(gè)放系統(tǒng)圖標(biāo)common里面放上側(cè),左側(cè),下側(cè)的固定頁(yè)面,以及登錄和商品搜索等固定頁(yè)面WEB-INF下面放Spring-mvc的配置文件和web.xmlWEB-INF下面放Spring-mvc的配置文件和web.xml2配置文件2.1applicationContext-dao.xmlDao層的配置文件和之前的極其類似,只需把之前的dao層配置文件拷貝過(guò)來(lái)修改即可,修改的位置見(jiàn)紅線處。掃描的包是cn.estore.dao配置mybatis的mapper接口自動(dòng)掃描配置mybatis的sqlSeesionfactory配置數(shù)據(jù)源加載數(shù)據(jù)庫(kù)屬性文件掃描的包是cn.estore.dao配置mybatis的mapper接口自動(dòng)掃描配置mybatis的sqlSeesionfactory配置數(shù)據(jù)源加載數(shù)據(jù)庫(kù)屬性文件2.2applicationContext-service.xmlService層的配置就是啟動(dòng)service層的組件掃描,如下:2.3applicationContext-tx.xml事務(wù)的配置,和之前一樣。2.4perties連接的數(shù)據(jù)庫(kù)名稱要換成estore的數(shù)據(jù)庫(kù)名。2.5mybatis-config.xml(1)啟動(dòng)駝峰式命名映射,啟動(dòng)后,表中的字段a_xyz_mn會(huì)和實(shí)體類中的屬性aXyzMn自動(dòng)匹配,在寫(xiě)sql語(yǔ)句的時(shí)候就不用寫(xiě)很多“as別名”了。但是實(shí)體類的屬性在命名時(shí)要小心檢查,如果名字取的不對(duì),將無(wú)法映射到表字段上,會(huì)導(dǎo)致select的結(jié)果不對(duì)。(2)為domain包的里的類定義別名。Product類的別名為product,Customer類的別名是customer。2.6web.xmlWeb.xml文件中的內(nèi)容和之前的差異如下:(1)添加了一個(gè)welcome-file(2)將servlet的名稱改成了estore(3)將servlet處理的url擴(kuò)展名改成了.do2.7estore-servlet.xml由于servlet的名字為estore,因此springmvc的配置文件名默認(rèn)為estore-servlet.xml。文件中配置兩項(xiàng):(1)啟動(dòng)web層的組件掃描(2)配置springmvc的視圖解析器,前綴、后綴。由于頁(yè)面都放在pages文件夾下,前綴配成/pages/,后綴是.jsp。2首頁(yè)和商品搜索1運(yùn)行效果1.1首頁(yè)首頁(yè)顯示全部商品,分頁(yè)。1.2商品搜索按照商品名進(jìn)行模糊查詢,對(duì)查詢結(jié)果分頁(yè),下圖是根據(jù)“鞋”查詢的結(jié)果。2首頁(yè)布局系統(tǒng)首頁(yè)index.jsp(已提供)貼到pages文件夾下。首頁(yè)采用div布局,頁(yè)面代碼如下。在css的作用下會(huì)呈現(xiàn)上、左、中、下的效果。其中的“中部”即id為“content”的div將根據(jù)用戶不同的操作,動(dòng)態(tài)呈現(xiàn)不同的頁(yè)面。除了個(gè)別情況下的頁(yè)面整體刷新,絕大部分情況下,頁(yè)面僅有content–div更換內(nèi)容。將使用ajax局部刷新技術(shù)。例如:用戶點(diǎn)擊“搜索”時(shí),content-div“顯示按商品名進(jìn)行模糊查詢的結(jié)果。用戶點(diǎn)擊“注冊(cè)”時(shí),content-div“顯示注冊(cè)表單。3顯示全部商品和商品搜索的思路(1)首頁(yè)和商品搜索結(jié)果頁(yè)面均是對(duì)查詢結(jié)果進(jìn)行顯示,因此使用同一個(gè)頁(yè)面showProducts.jsp展示。(2)依靠search參數(shù)區(qū)分是首頁(yè),還是商品搜索,如果search參數(shù)是空,則查詢所有商品,如果不是空,則是模糊查詢。(3)查詢所有商品和“搜索”,均先查詢count(*),記下頁(yè)數(shù)、總記錄數(shù)(頁(yè)面需要顯示這些數(shù)據(jù),查一次就行了)。然后轉(zhuǎn)發(fā)給showProductList方法。(4)showProductList方法,根據(jù)頁(yè)號(hào)計(jì)算此次查詢的起始記錄號(hào),進(jìn)行分頁(yè)查詢?!皊elect*fromtb_productlimita,5”表示查詢tb_product表,從第a個(gè)記錄開(kāi)始取5條記錄。將查詢結(jié)果組織成list,存儲(chǔ)在request中,轉(zhuǎn)發(fā)給showProducts.jsp頁(yè)面顯示。(5)showProducts.jsp頁(yè)面遍歷list,顯示在頁(yè)面中。當(dāng)用戶點(diǎn)“上一頁(yè)”“下一頁(yè)”時(shí),將新頁(yè)號(hào)提交到showProductList方法,再次查詢下一組數(shù)據(jù)。4動(dòng)態(tài)更新content–div內(nèi)容的思路所有請(qǐng)求均通過(guò)調(diào)用js函數(shù)來(lái)提交,使用ajax從服務(wù)器取得數(shù)據(jù),設(shè)置到div中,參考示例如下:functionshowAllProducts(){ $.ajax({ url:'showAllProducts.do',//查詢所有商品 type:'get', success:function(responseText){//responseText里存儲(chǔ)的是查詢到的所有商品頁(yè)面 $('#content').html(responseText); //將所有商品頁(yè)面嵌入divcontent中 } }); }5Product實(shí)體類Product實(shí)體類和tb_product表對(duì)應(yīng),注意該類的屬性命名,由于啟動(dòng)了mybatis駝峰映射,字段名是a_xyz_mn,屬性名必須叫做aXyzMn,寫(xiě)完后請(qǐng)仔細(xì)核對(duì)。Set和get方法請(qǐng)自行生成。6ProductDao接口ProductDao包含三個(gè)方法:(1)根據(jù)商品名、起始記錄號(hào)、記錄數(shù)進(jìn)行查詢,如果沒(méi)有商品名,查詢所有商品(2)按照商品id,查詢商品(3)根據(jù)商品名進(jìn)行查詢,返回記錄數(shù),如果沒(méi)有商品名,查詢所有商品數(shù)量這個(gè)映射文件對(duì)應(yīng)的接口7Product.xml這個(gè)映射文件對(duì)應(yīng)的接口模糊查詢的第二種寫(xiě)法返回從第start個(gè)記錄開(kāi)始的limit條記錄如果用戶名不為空,添加模糊查詢條件接口里的方法名模糊查詢的第二種寫(xiě)法返回從第start個(gè)記錄開(kāi)始的limit條記錄如果用戶名不為空,添加模糊查詢條件接口里的方法名8ProductService接口包含三個(gè)方法,和dao里的三個(gè)方法對(duì)應(yīng)。9ProductServiceImpl類ProductServiceImpl類實(shí)現(xiàn)ProductService接口,注意為其加@Service注解,以及自動(dòng)注入ProductDao。11ProductController類每頁(yè)記錄數(shù)可以自行調(diào)整每頁(yè)記錄數(shù)可以自行調(diào)整將查詢中的商品列表存在request中,showProducts頁(yè)面可以取得。將查詢中的商品列表存在request中,showProducts頁(yè)面可以取得。Base元素可以設(shè)置頁(yè)面中所有相對(duì)路徑的基準(zhǔn),href中的el表達(dá)式表示web應(yīng)用的根目錄。本例中就是/estore-ssm/。Base可以作用在超鏈接、圖片、css鏈接,js鏈接,表單提交路徑等位置。(jsp中的include,forward等不適用)加上這句后,免去了到處寫(xiě)絕對(duì)路徑的麻煩。文檔中使用相對(duì)路徑只要相對(duì)于應(yīng)用根目錄寫(xiě)就行了,而且不會(huì)出現(xiàn)相對(duì)路徑疊加問(wèn)題。查詢所有商品和商品搜索的請(qǐng)求均進(jìn)入此方法,先算記錄數(shù)和總頁(yè)數(shù)轉(zhuǎn)發(fā)到showProductList.do,將頁(yè)數(shù)和總記錄數(shù)傳過(guò)去,頁(yè)號(hào)為1商品搜索的search表單項(xiàng)傳過(guò)來(lái),如果為空,則是查詢所有商品12index.jsBase元素可以設(shè)置頁(yè)面中所有相對(duì)路徑的基準(zhǔn),href中的el表達(dá)式表示web應(yīng)用的根目錄。本例中就是/estore-ssm/。Base可以作用在超鏈接、圖片、css鏈接,js鏈接,表單提交路徑等位置。(jsp中的include,forward等不適用)加上這句后,免去了到處寫(xiě)絕對(duì)路徑的麻煩。文檔中使用相對(duì)路徑只要相對(duì)于應(yīng)用根目錄寫(xiě)就行了,而且不會(huì)出現(xiàn)相對(duì)路徑疊加問(wèn)題。查詢所有商品和商品搜索的請(qǐng)求均進(jìn)入此方法,先算記錄數(shù)和總頁(yè)數(shù)轉(zhuǎn)發(fā)到showProductList.do,將頁(yè)數(shù)和總記錄數(shù)傳過(guò)去,頁(yè)號(hào)為1商品搜索的search表單項(xiàng)傳過(guò)來(lái),如果為空,則是查詢所有商品為index.jsp補(bǔ)充幾個(gè)js函數(shù),詳見(jiàn)注釋。13web.xml的welcome頁(yè)面Web.xml配置起始頁(yè)面為index.do,用戶輸入:8080/estore-ssm時(shí),會(huì)提交到:8080/estore-ssm/index.do。首頁(yè)展示流程如下:index.do由ProductController的index方法處理,跳轉(zhuǎn)到index.jsp。index.jsp頁(yè)面加載后($(document).ready),調(diào)用js函數(shù)showAllProducts,提交請(qǐng)求'showAllProducts.do',查詢所商品,結(jié)果嵌入div。14商品搜索表單商品搜索findProductsByName.jsp,表單提交到j(luò)s函數(shù)searchProducts,由ajax發(fā)送請(qǐng)求,表單本身不直接提交。查詢結(jié)果顯示在div(不完全刷新index.jsp)。查詢關(guān)鍵字表單項(xiàng)search,js里會(huì)按id取值,作為url的參數(shù)查詢關(guān)鍵字表單項(xiàng)search,js里會(huì)按id取值,作為url的參數(shù)15head欄“首頁(yè)”超鏈接“首頁(yè)”超鏈接提交到j(luò)s函數(shù)showAllProducts(),查詢所有商品,結(jié)果顯示在div(不完全刷新index.jsp)。16商品展示頁(yè)面showProducts.jspshowProducts.jsp已提供,將其貼到webRoot/pages/product文件夾下。16.1jsp頁(yè)面開(kāi)頭引入jstl標(biāo)簽庫(kù)showProducts.jsp頁(yè)面的html部分已經(jīng)給出,功能實(shí)現(xiàn)自己補(bǔ)充,jsp文件中的java代碼將全部由el和jstl實(shí)現(xiàn)。引入jstl標(biāo)簽庫(kù)引入jstl標(biāo)簽庫(kù)16.2查詢結(jié)果展示先判斷查詢結(jié)果是不是空的,如果是空的,提示用戶。如果不是空,使用forEach循環(huán),每一件商品的畫(huà)一行,顯示商品的各項(xiàng)信息。${productList}表示取出某一范圍中名稱為productList的屬性值。如果沒(méi)有指定哪一個(gè)范圍的productList,所以它會(huì)依序從Page、Request、Session、Application范圍查找。假如途中找到productList,就直接回傳,不再繼續(xù)找下去,但是假如全部的范圍都沒(méi)有找到時(shí),就回傳null。如果想明確指定從request中取屬性,可以使用${requestScope.productList}如果想明確指定從session中取屬性,可以使用${sessionScope.productList}如果productList長(zhǎng)度為0,提示沒(méi)有符合條件的商品如果productList長(zhǎng)度為0,提示沒(méi)有符合條件的商品顯示商品的名字,商品圖片名要拼接到img路徑中。如果discount是0,顯示市場(chǎng)價(jià)(原價(jià))。如果是1,顯示市場(chǎng)價(jià)(原價(jià))和銷售價(jià)(現(xiàn)價(jià)),對(duì)productList列表進(jìn)行循環(huán),每次取出一個(gè)商品對(duì)象,命名為product顯示商品的名字,商品圖片名要拼接到img路徑中。如果discount是0,顯示市場(chǎng)價(jià)(原價(jià))。如果是1,顯示市場(chǎng)價(jià)(原價(jià))和銷售價(jià)(現(xiàn)價(jià)),對(duì)productList列表進(jìn)行循環(huán),每次取出一個(gè)商品對(duì)象,命名為product16.3分頁(yè)導(dǎo)航分頁(yè)導(dǎo)航欄,從請(qǐng)求參數(shù)中取出總頁(yè)數(shù)、總記錄數(shù)、當(dāng)前頁(yè)號(hào)顯示在頁(yè)面上。點(diǎn)擊“下一頁(yè)”時(shí)將頁(yè)號(hào)+1,點(diǎn)擊“上一頁(yè)”時(shí)將頁(yè)號(hào)-1,調(diào)用js函數(shù)nextAndPrevious。調(diào)用js函數(shù)nextAndPrevious,傳遞4個(gè)參數(shù)這里用的都是${param.***},后面介紹了${param.***}和${***}的區(qū)別,請(qǐng)仔細(xì)閱讀調(diào)用js函數(shù)nextAndPrevious,傳遞4個(gè)參數(shù)這里用的都是${param.***},后面介紹了${param.***}和${***}的區(qū)別,請(qǐng)仔細(xì)閱讀${param.pageNum}和${pageNum}的區(qū)別如下:(1)${pageNum}相當(dāng)于:request.getAttribute(“pageNum”);//以request存儲(chǔ)屬性為例session.getAttribute(“pageNum”);//以session存儲(chǔ)屬性為例使用下面語(yǔ)句放入的屬性都可以使用${pageNum}取出:request.addAttribute(“pageNum”,20);session.addAttribute(“pageNum”,20);controller里的:modelAndView.addObject(“pageNum”,20);(2)${param.pageNum}相當(dāng)于request.getParamter(“pageNum”);如果是請(qǐng)求url里帶的參數(shù)(get或者post),均可以通過(guò)${param.pageNum}取出,例如showProductList.do?pageNum=5或者表單里有名為pageName的表單項(xiàng),提交時(shí),也是請(qǐng)求參數(shù)。17測(cè)試瀏覽器輸入:8080/estore-ssm,進(jìn)入首頁(yè),測(cè)試分頁(yè)效果輸入任意商品名進(jìn)行查詢,查詢到結(jié)果、查詢不到結(jié)果均要測(cè)試。點(diǎn)擊“首頁(yè)”回到首頁(yè)。3用戶登錄和退出1運(yùn)行效果2代碼和頁(yè)面架構(gòu)3Customer實(shí)體類3CustomerDao和Customer.xml映射文件CustomerDao添加一個(gè)方法,按照用戶名和密碼查詢用戶,返回用戶對(duì)象。4CustomerService和CustomerServiceImpl在類上設(shè)置啟用事務(wù),只讀。類里的方法,沒(méi)有設(shè)置事務(wù)的,默認(rèn)使用類的設(shè)置。需要增刪改的方法,重新設(shè)置事務(wù)的readOnly在類上設(shè)置啟用事務(wù),只讀。類里的方法,沒(méi)有設(shè)置事務(wù)的,默認(rèn)使用類的設(shè)置。需要增刪改的方法,重新設(shè)置事務(wù)的readOnly5CustomerController類6index.jsp為index.jsp添加彈出消息框的語(yǔ)句。和第5節(jié)結(jié)合,也可以統(tǒng)一用一個(gè)“message”存儲(chǔ)提示消息,不一定要分兩個(gè)。登錄提交時(shí)并未采用ajax提交請(qǐng)求,而是直接提交,因?yàn)榈卿洺晒蟛荒苤凰⑿轮袇^(qū),要完全刷新index.jsp,否則“successLogin.jsp”不會(huì)刷新(除非再寫(xiě)代碼刷新左下角區(qū)域)。退出功能也是。7login.jsp的提交地址登錄提交時(shí)并未采用ajax提交請(qǐng)求,而是直接提交,因?yàn)榈卿洺晒蟛荒苤凰⑿轮袇^(qū),要完全刷新index.jsp,否則“successLogin.jsp”不會(huì)刷新(除非再寫(xiě)代碼刷新左下角區(qū)域)。退出功能也是。提交地址,去CustomerController類找匹配的@RequestMapping。表單提交前先驗(yàn)證不空提交地址,去CustomerController類找匹配的@RequestMapping。表單提交前先驗(yàn)證不空8為successLogin.jsp頁(yè)面添加登錄成功信息9為left.jsp頁(yè)面添加條件判斷為left.jsp頁(yè)面添加條件判斷,如果用戶未登錄,包含登錄窗口login,如果用戶已經(jīng)登錄,包含登錄信息窗口successLogin。10為showProducts.jsp添加判斷代碼為showProducts頁(yè)面添加判斷代碼,未登錄時(shí)提示不能查看詳情,登錄后提供查看超鏈接。查看詳情,可以按照商品id查詢商品信息,再轉(zhuǎn)到商品詳情頁(yè)面,也可以將當(dāng)前的商品信息直接傳到詳情頁(yè)面去。11用戶退出(1)為successLogin頁(yè)面的退出登錄添加超鏈接,如下:(2)為CustomerController添加logout方法:12測(cè)試登錄和退出4用戶注冊(cè)1運(yùn)行效果數(shù)據(jù)填滿之后點(diǎn)提交,下面兩種情況均只替換中部div內(nèi)容:數(shù)據(jù)填滿之后點(diǎn)提交,下面兩種情況均只替換中部div內(nèi)容:用戶名被占用,提示用戶,回注冊(cè)頁(yè)面(div填充register.jsp頁(yè)面)如果沒(méi)有被占用,向tb_customer表中插入一行用戶信息,回首頁(yè)(div填充所有商品頁(yè)面)2CustomerDaoCustomerDao添加兩個(gè)方法,一個(gè)用來(lái)查詢用戶名是否被占用,另一個(gè)向tb_customer表中插入新新用戶信息。(如有別的想法,dao類和映射文件請(qǐng)自行修改)對(duì)應(yīng)的customer.xml文件的sql映射請(qǐng)自行補(bǔ)充。3CustomerService和CustomerServiceImpl分別添加兩個(gè)方法,和上節(jié)兩個(gè)方法對(duì)應(yīng),自行補(bǔ)充。CustomerServiceImpl類中,需要更改數(shù)據(jù)表的方法上(insertNewCustomer方上),加下面事務(wù)注解:@Transactional(isolation=Isolation.REPEATABLE_READ,propagation=Propagation.REQUIRED,readOnly=false)4CustomerController類(1)添加方法用于跳轉(zhuǎn)到注冊(cè)頁(yè)面,方法頭如下,內(nèi)容自行補(bǔ)充:(2)添加方法,在注冊(cè)表單提交時(shí)調(diào)用。用于驗(yàn)證用戶名是否存在,如果不存在,向用戶表中插入新用戶信息,方法頭如下:調(diào)用service的××方法,判斷用戶名是否已經(jīng)被占用if(用戶名被占用){存儲(chǔ)錯(cuò)誤提示信息返回register.jsp}else{調(diào)用service的××方法,向用戶表中插入新用戶信息存儲(chǔ)成功提示信息返回showAllProduct}提示信息如何在兩個(gè)頁(yè)面中取出,并顯示,請(qǐng)參考登錄時(shí)的錯(cuò)誤提示信息。5index.jsp為index.jsp添加js函數(shù),一個(gè)用于跳轉(zhuǎn)到注冊(cè)頁(yè)面,一個(gè)用戶提交注冊(cè)表單。6“注冊(cè)”超鏈接和注冊(cè)表單(1)點(diǎn)擊“注冊(cè)”超鏈接時(shí)(在login.jsp上),調(diào)用js函數(shù)register,將register.jsp頁(yè)面嵌入div。(2)注冊(cè)頁(yè)面為register.jsp(已經(jīng)提供),將其貼到pages/customer文件夾下。注冊(cè)表單提交時(shí),調(diào)用js函數(shù)checkUserAndInsert提交請(qǐng)求,并將結(jié)果嵌入div。結(jié)果有可能是注冊(cè)表單自己(如果用戶名重復(fù)),也有可能是所有商品頁(yè)面(如果成功),根據(jù)controller的邏輯決定返回頁(yè)面。7測(cè)試測(cè)試注冊(cè)成功和失敗,觀察數(shù)據(jù)表數(shù)據(jù)。5查看商品詳情1運(yùn)行效果2商品詳情頁(yè)面商品詳情頁(yè)面showProductById.jsp已經(jīng)提供,貼到webRoot/pages/product文件夾中,內(nèi)容參考運(yùn)行效果圖,自行補(bǔ)充。3ProductController添加方法為ProductController添加方法,查詢商品詳情,跳轉(zhuǎn)到商品詳情頁(yè)面。4index.jsp點(diǎn)擊“查看商品詳情”超鏈接,跳轉(zhuǎn)到下面的函數(shù),提交請(qǐng)求,將結(jié)果顯示在div中。6.1商品加入購(gòu)物車1運(yùn)行效果2tb_cart_item表設(shè)計(jì)下表請(qǐng)自行創(chuàng)建。3CartItem類在domain包中創(chuàng)建CartItem實(shí)體類,類的屬性和tb_cart_item表字段對(duì)應(yīng),以及對(duì)應(yīng)的get,set方法。注意:駝峰命名!4CartItemDao類在dao包中創(chuàng)建CartItemDao接口,添加三個(gè)方法,分別用于:(1)判斷某用戶的購(gòu)物車是否已經(jīng)存在某商品。(2)向購(gòu)物車表中插入一條記錄(用戶要加入的商品是第一次加入)(3)更改購(gòu)物車的某商品數(shù)量(用戶要加入的商品已經(jīng)在其購(gòu)物車中)5CartItem.xml映射文件在resources/mappers文件中創(chuàng)建CartItem.xml文件,按照dao中的需求添加三個(gè)sql映射。請(qǐng)自行完成。6CartItemService接口和CartItemServiceImpl類(1)service包中創(chuàng)建CartItemService接口,CartItemService接口中創(chuàng)建一個(gè)方法,如下:(2)serviceImpl包中創(chuàng)建CartItemServiceImpl類,實(shí)現(xiàn)CartItemService接口的addToCart方法,邏輯如下:調(diào)用dao的get××××()方法,判斷用戶是否已經(jīng)加過(guò)此商品if(已經(jīng)加過(guò)此商品){查詢出的購(gòu)物車條目對(duì)象數(shù)量+1調(diào)用dao的modify××方法,更新該購(gòu)物車條目數(shù)量}else{調(diào)用dao的insert××方法,向購(gòu)物車表插入新加入的商品信息}注意:dao的依賴注入!事務(wù)注解!7CartItemServiceController類在web包中創(chuàng)建CartItemServiceController類,處理“/cart”的請(qǐng)求。創(chuàng)建方法:@RequestMapping("/addCart")publicModelAndViewaddCart(HttpSessionsession,CartItemcartItem){取出session中的用戶對(duì)象,取出用戶對(duì)象的id號(hào)將用戶id設(shè)置到cartItem對(duì)象上調(diào)用service的addCart方法。設(shè)置“成功加入購(gòu)物”消息,跳轉(zhuǎn)回顯示商品詳情頁(yè)面。}8為“放入購(gòu)物車”添加鏈接地址<ahref="javascript:addCart(參數(shù)自定);">放入購(gòu)物車</a>Js函數(shù)addCart()請(qǐng)參考之前的功能自行完成,功能:調(diào)用/cart/addCart.do,將商品id,商品名、數(shù)量固定為1,商品價(jià)格當(dāng)參數(shù)。幾種思路提示:(1)直接把4個(gè)值當(dāng)addCart函數(shù)的參數(shù),傳到addCart函數(shù)內(nèi)使用,拼接成url,或者{參數(shù)名:參數(shù)值}。(2)把4個(gè)值存在隱藏表單里,addCart函數(shù)中使用$('#表單id).serialize()。9測(cè)試頁(yè)面操作,直接查看購(gòu)物車數(shù)據(jù)表,看數(shù)據(jù)是否正確。6.2查看購(gòu)物車1運(yùn)行效果2CartItemDao接口和CartItem.xml為CartItemDao接口添加方法為CartItem.xml添加對(duì)應(yīng)的sql映射,自行完成。3CartItemService和CartItemServiceImpl添加相應(yīng)方法自行完成。4CustomerController類添加方法@RequestMapping("/showCart") publicModelAndViewshowCart(HttpSessionsession){從session中獲得用戶對(duì)象,獲得用戶id調(diào)用service的××方法,查詢這個(gè)用戶的購(gòu)物車將查詢結(jié)果list存放在model中跳轉(zhuǎn)到showCart.jsp}5“查看購(gòu)物車”超鏈接為“查看購(gòu)物車”超鏈接添加href="javascript:showCart();”Js函數(shù)showCart()請(qǐng)自行添加,功能:提交cart/showCart.do請(qǐng)求,結(jié)果填充到div。6showCart.jsp頁(yè)面ShowCart.jsp已經(jīng)提供,請(qǐng)拷貝到webRoot/pages/cart文件夾中?;舅悸罚喝绻樵兊降膌ist長(zhǎng)度是0,顯示“您的購(gòu)物車是空的”。如果有商品,將商品顯示成表格,請(qǐng)根據(jù)運(yùn)行圖片自行完成。從1—n的序號(hào)和累加總價(jià)的提示<c:setvalue="0"var="totalPrice"/>//定義變量totalPrice,值是0<c:setvalue="1"var="i"/>//定義變量i,值是1<c:forEachitems="${cart}"var="cartItem">。。。。。。<c:setvalue="${i+1}"var="i"/>//變量i++//為總價(jià)重新賦值<c:setvalue="${totalPrice+cartItem.price*cartItem.quantity}"var="totalPrice"/></c:forEach>7測(cè)試查看購(gòu)物車6.3修改數(shù)量、刪除商品、清空1運(yùn)行效果在商品數(shù)量文本框中直接修改,根據(jù)鍵盤(pán)動(dòng)作提交。如果數(shù)量改成0,直接刪除此條目在商品數(shù)量文本框中直接修改,根據(jù)鍵盤(pán)動(dòng)作提交。如果數(shù)量改成0,直接刪除此條目2CartItemDao接口和CartItem.xml為CartItemDao接口添加兩個(gè)方法,用于刪除購(gòu)物車條目和清空購(gòu)物車。注意:修改數(shù)量方法,之前已經(jīng)寫(xiě)過(guò)了。CartItem.xml映射請(qǐng)自行補(bǔ)充。3CartItemService接口和CartItemServiceImpl類(1)為CartItemService接口添加方法(2)為CartItemServiceImple添加方法publicintmodifyQuantity(CartItemcartItem){if(cartItem的數(shù)量是0){調(diào)用dao的remove***方法,刪除條目}else{調(diào)用dao的modify***方法,修改指定條目的quantity}}(3)為CartItemServiceImple添加方法clearCart,直接調(diào)用dao的clearCart即可。4CartItemController類添加下面方法 //修改數(shù)量(修改和刪除統(tǒng)一) @RequestMapping("/modifyQuantity") publicStringmodifyQuantity(CartItemcartItem){ 調(diào)用service的modify***方法(可能是刪,可能是改數(shù)量) 返回顯示購(gòu)物的頁(yè)面 }@RequestMapping("/clearCart") publicStringclearCart(HttpSessionsession){調(diào)用service的clear××方法返回顯示購(gòu)物的頁(yè)面}5頁(yè)面動(dòng)作(1)為showCart添加下面js函數(shù),函數(shù)接受要修改的購(gòu)物車條目id和新數(shù)量(可能是0)。提交到cart/modifyQuantity.do,修改后返回的showCart頁(yè)面嵌入div。(2)清空購(gòu)物的js,先請(qǐng)用戶確認(rèn)要清空,然后再提交請(qǐng)求。(3)為商品數(shù)量的input,添加事件處理,調(diào)用上面的js函數(shù)。onKeyUp="modifyQuantity('${cartItem.cartItemId}',this.value)"(4)清空購(gòu)物車超鏈接到clear()函數(shù)。6測(cè)試6.4添加用戶登錄攔截器1作用為了防止用戶在未登錄時(shí)訪問(wèn)跟購(gòu)物車和訂單有關(guān)的操作,添加攔截器對(duì)發(fā)往上述模塊的請(qǐng)求進(jìn)行攔截,如果發(fā)現(xiàn)用戶尚未登錄,打回首頁(yè),讓用戶登錄。2創(chuàng)建LoginInterceptor創(chuàng)建包erceptor,其下創(chuàng)建類LoginInterceptor。檢查請(qǐng)求,取出session中的用戶對(duì)象,如果不是null,返回true,請(qǐng)求放過(guò)。如果是null,提示用戶,返回首頁(yè),返回false檢查請(qǐng)求,取出session中的用戶對(duì)象,如果不是null,返回true,請(qǐng)求放過(guò)。如果是null,提示用戶,返回首頁(yè),返回false3配置攔截路徑打開(kāi)estore-servlet.xml,添加下面配置,攔截發(fā)往cart的請(qǐng)求,order的請(qǐng)求(還沒(méi)有做到),orderItem的請(qǐng)求(還沒(méi)有做到),查看商品詳情的請(qǐng)求。在estore-servlet.xml頭部增加三個(gè)名稱空間。7.1跳轉(zhuǎn)到收銀結(jié)賬頁(yè)面1運(yùn)行效果1、總金額從購(gòu)物車頁(yè)面?zhèn)鬟^(guò)來(lái)2、用戶名、實(shí)名、電話均從session中的用戶對(duì)象中取得3、為空項(xiàng),自行填寫(xiě)1、總金額從購(gòu)物車頁(yè)面?zhèn)鬟^(guò)來(lái)2、用戶名、實(shí)名、電話均從session中的用戶對(duì)象中取得3、為空項(xiàng),自行填寫(xiě)3CartItemServiceController類添加一個(gè)跳轉(zhuǎn)到收銀臺(tái)的方法: //去收銀臺(tái) @RequestMapping("/cartCheckout") publicStringcartCheckout(){ return"cart/cartCheckOut"; }4“去收銀臺(tái)結(jié)賬”超鏈接和js自行完成5測(cè)試7.2提交訂單1運(yùn)行效果數(shù)據(jù)填滿后點(diǎn)擊“提交“數(shù)據(jù)填滿后點(diǎn)擊“提交“2實(shí)現(xiàn)思路和流程生成訂單號(hào)向訂單表中插入數(shù)據(jù)(1條)向訂單明細(xì)表中插入數(shù)據(jù)(1-n條)--刪除當(dāng)前用戶的購(gòu)物車條目。(1)訂單表訂單表的數(shù)據(jù)基本來(lái)源于“收銀結(jié)賬”頁(yè)面。兩項(xiàng)除外:訂單號(hào)和創(chuàng)建時(shí)間,這兩項(xiàng)在插入訂單信息前根據(jù)系統(tǒng)時(shí)間生成。只要在“收銀”頁(yè)面提交時(shí),從表單信息中取出數(shù)據(jù),加上生成的訂單號(hào),即可作為插入訂單表的數(shù)據(jù)來(lái)源。(2)訂單明細(xì)表和購(gòu)物車表訂單明細(xì)表中的商品id,商品名、單價(jià)、數(shù)量均來(lái)源于購(gòu)物車表。訂單號(hào)是生成訂單時(shí)根據(jù)時(shí)間生成的,每個(gè)訂單和其訂單明細(xì)通過(guò)訂單號(hào)關(guān)聯(lián)。從購(gòu)物車表中取出當(dāng)前用戶的購(gòu)物車條目,加上生成的訂單號(hào),即可作為訂單明細(xì)的數(shù)據(jù)來(lái)源。購(gòu)物車表訂單明細(xì)表購(gòu)物車表訂單明細(xì)表3Order和OrderItem實(shí)體類在domain包中創(chuàng)建Order和OrderItem實(shí)體類,對(duì)應(yīng)tb_order和tb_order_item表。4OrderDao和Order.xmlOrder.xml請(qǐng)自行完成5OrderItemDao和OrderItem.xml一個(gè)訂單的訂單明細(xì)可能超過(guò)一條,方法的參數(shù)是購(gòu)物車條目list和訂單號(hào)由于要執(zhí)行n據(jù)insert,而不只是一句,而且同一個(gè)訂單的訂單明細(xì)使用相同的訂單號(hào)。在insert映射里,使用for-each遍歷cart參數(shù),每個(gè)條目執(zhí)行一句insert,每個(gè)訂單明細(xì)的訂單號(hào)均來(lái)源于參數(shù)orderId。6CartItemService接口和CartItemServiceImpl類由于該功能是訂單模塊和購(gòu)物車模塊的交接,所以業(yè)務(wù)層寫(xiě)在了Cart里,完成此功能要訪問(wèn)購(gòu)物車,訂單和訂單明細(xì)表,因此要訪問(wèn)三個(gè)dao。(1)為CartItemService添加方法。(2)為CartItemServiceImpl類注入OrderDao和OrderItemDao(3)為CartItemServiceImpl類添加方法。 7CartItemServiceController添加方法://生成訂單 @RequestMapping("/cartToOrder") publicModelAndViewcartToOrder(HttpSessionsession,Orderorder){ 取得當(dāng)前用戶id調(diào)用Service的cartToOrder方法,返回值為訂單號(hào) 將訂單號(hào)存儲(chǔ)在model中跳轉(zhuǎn)回購(gòu)物車頁(yè)面 }8為購(gòu)物車頁(yè)面添加提示語(yǔ)句為購(gòu)物車頁(yè)面添加提示語(yǔ)句,彈出“提交訂單成功,訂單號(hào)是×××××”的提示。9為“收銀結(jié)賬”頁(yè)面的表單補(bǔ)充onsubmit通過(guò)調(diào)用js函數(shù),請(qǐng)求cart/cartToOrder.do,將表單內(nèi)容當(dāng)參數(shù)。10測(cè)試8查看訂單和訂單明細(xì)1運(yùn)行效果DeliverySign是0表示未出貨,是1表示已經(jīng)出貨DeliverySign是0表示未出貨,是1表示已經(jīng)出貨2OrderDao3OrderItemDao4OrderController和OrderItemController的轉(zhuǎn)發(fā)點(diǎn)擊“查看訂單明細(xì)”時(shí),先按訂單號(hào)查訂單,存儲(chǔ)訂單數(shù)據(jù)。然后將請(qǐng)求轉(zhuǎn)發(fā)到訂單明細(xì)查詢,根據(jù)訂單號(hào)查訂單明細(xì),存儲(chǔ)明細(xì)信息,最后轉(zhuǎn)到訂單明細(xì)頁(yè)面展示。架構(gòu)和大致流程如下:@Controller@RequestMapping("/order")publicclassOrderController{…@RequestMapping(value="/showOrderDetails")publicModelAndViewshowOrderDetails(HttpSessionsession,StringorderId){ 按照訂單號(hào)查訂單信息,并存儲(chǔ)在model中 轉(zhuǎn)發(fā)到:orderItem/showOrderDetails.do }}@Controller@RequestMapping("/orderItem")publicclassOrderItemController{ 。。。 @RequestMapping(value="/showOrderDetails") publicModelAndViewshowOrderDetails(StringorderId){ 按照訂單號(hào)查訂單明細(xì),并存儲(chǔ)在model中 跳轉(zhuǎn)到orderDetailList.jsp頁(yè)面 }}9使用mybaits逆向工程改寫(xiě)Mybatis提供一個(gè)工具,可以由數(shù)據(jù)表自動(dòng)生成實(shí)體類、接口和sql映射文件等。我們的改寫(xiě)過(guò)程由下面幾步組成:(1)使用mybatis-generator生成逆向工程,即由數(shù)據(jù)表自動(dòng)生成實(shí)體類、dao接口、**mapper.xml映射文件。(2)用生成的實(shí)體類、dao接口、**mapper.xml替換原來(lái)estore-ssm工程中的對(duì)應(yīng)部分。(3)有了自動(dòng)生成的一套代碼之后,我們就要利用生成的dao接口和example類來(lái)執(zhí)行數(shù)據(jù)表的增刪改查。因此要修改serviceImpl中的相應(yīng)代碼。(4)由于自動(dòng)生成的實(shí)體類和我們自己寫(xiě)的實(shí)體類某些數(shù)據(jù)類型不同,例如:bit型,我們自己寫(xiě)的時(shí)候用的int型,生成的實(shí)體類用的Boolean型。訪問(wèn)這部分?jǐn)?shù)據(jù)的頁(yè)面el表達(dá)式要做些修改。1改寫(xiě)準(zhǔn)備由于馬上用逆向工程生成的代碼和配置文件替換原有estore-ssm的mybaits部分。大家可以選擇下面兩種操作方式(選其一)。(1)不再創(chuàng)建新工程,而是在estore-ssm工程上直接改寫(xiě)。如果采用此方式,請(qǐng)先estore-ssm工程復(fù)制一份,備份到硬盤(pán)某位置,待會(huì)兒改寫(xiě)的時(shí)候,有些部分可以參考下原來(lái)的實(shí)現(xiàn)方式。(2)創(chuàng)建一個(gè)estore-ssm工程的副本,在其上修改。如果采用此方式,則重新創(chuàng)建一個(gè)新的web工程,換個(gè)名字,把原來(lái)estore-ssm中工程中的所有java文件、頁(yè)面文件、配置文件、資源等一切拷貝到新web工程中。2使用mybatis-generator生成逆向工程2.1創(chuàng)建Java工程并導(dǎo)入mybatis-generatorjar包創(chuàng)建一個(gè)Java工程,名字自定,我們用這個(gè)工程來(lái)生成逆向。導(dǎo)入兩個(gè)jar包(mysql驅(qū)動(dòng)和mybatis-generator-core)如下:2.2編寫(xiě)配置文件生成逆向工程需要一個(gè)配置文件,該配置文件將指明:如何從數(shù)據(jù)表生成實(shí)體類、映射文件、**Dao接口,可以指定這些自動(dòng)生成的文件的名字、位置等。該文件已經(jīng)提供,但是需要依據(jù)情況做一些修改。為了讓生成的各種文件替換到原工程之后,代碼錯(cuò)誤和改動(dòng)最小化,配置文件修改準(zhǔn)則如下:(1)自動(dòng)生成的實(shí)體類的包名、類名和原estore-ssm的實(shí)體類包、類名完全一致。(2)自動(dòng)生成的**Dao接口的包名、接口名和原estore-ssm的**Dao包和接口完全一致。(3)自動(dòng)生成的****.xml,sql映射文件放置位置同原estore-ssm的映射文件放置位置完全一致。將generatorConfig.xml文件貼到src文件夾下,依照下面截圖,根據(jù)實(shí)際情況修改參數(shù),請(qǐng)仔細(xì)閱讀準(zhǔn)則和參數(shù)含義。生成的實(shí)體類所屬的包名!這里改成和estore-ssm實(shí)體類同包,這樣生成的實(shí)體類復(fù)制到estore-ssm里才不會(huì)報(bào)錯(cuò)。連接mysql數(shù)據(jù)庫(kù)的驅(qū)動(dòng)類名、連接字符串、用戶名、密碼生成的實(shí)體類所屬的包名!這里改成和estore-ssm實(shí)體類同包,這樣生成的實(shí)體類復(fù)制到estore-ssm里才不會(huì)報(bào)錯(cuò)。連接mysql數(shù)據(jù)庫(kù)的驅(qū)動(dòng)類名、連接字符串、用戶名、密碼生成的***Dao接口的位置這里改成和estore-ssm的**Dao.xml同一位置,這樣生成的接口覆蓋到estore-ssm之后,相關(guān)的配置文件就不用改了。生成的***mapper.xml文件的位置這里改成和estore-ssm的**Mapper.xml同一位置,這樣配置文件覆蓋到estore-ssm之后,相關(guān)的配置文件就不用改了。生成的***Dao接口的位置這里改成和estore-ssm的**Dao.xml同一位置,這樣生成的接口覆蓋到estore-ssm之后,相關(guān)的配置文件就不用改了。生成的***mapper.xml文件的位置這里改成和estore-ssm的**Mapper.xml同一位置,這樣配置文件覆蓋到estore-ssm之后,相關(guān)的配置文件就不用改了。這幾句設(shè)置了將哪些數(shù)據(jù)表生成逆向的文件,設(shè)置了5張表(商品、用戶、訂單、訂單明細(xì)、購(gòu)物車)domainObjectName這幾句設(shè)置了將哪些數(shù)據(jù)表生成逆向的文件,設(shè)置了5張表(商品、用戶、訂單、訂單明細(xì)、購(gòu)物車)domainObjectName用來(lái)指定生成的實(shí)體類類名mapperName用來(lái)指定這張表對(duì)于的**Dao接口名實(shí)體類名和**Dao接口名字如果不指定,會(huì)默認(rèn)為T(mén)bProduct,TbProductMapper(以tb_product表為例)本例將名字指定為和estore-ssm中的實(shí)體類和××Dao接口同名,是為了生成的文件覆蓋到estore-ssm之后改動(dòng)最??!2.3生成逆向工程的代碼運(yùn)行下面代碼(代碼中有讀配置文件的語(yǔ)句,文件路徑依據(jù)實(shí)際情況調(diào)整),將生成各種逆向工程中的各種文件。運(yùn)行完之后刷新一下現(xiàn)有的工程,就能看到生成的東西。importjava.io.File;importjava.util.ArrayList;importjava.util.List;importorg.mybatis.generator.api.MyBatisGenerator;importorg.mybatis.generator.config.Configuration;importorg.mybatis.generator.config.xml.ConfigurationParser;importernal.DefaultShellCallback;publicclassTest{ publicstaticvoidmain(String[]args)throwsException{ Listwarnings=newArrayList(); booleanoverwrite=true; //指定逆向工程配置文件 FileconfigFile=newFile("generatorConfig.xml"); ConfigurationParsercp=newConfigurationParser(warnings); Configurationconfig=cp.parseConfiguration(configFile); DefaultShellCallbackcallback=newDefaultShellCallback(overwrite); MyBatisGeneratormyBatisGenerator=newMyBatisGenerator(config, callback,warnings); myBatisGenerator.generate(null); }}2.4生成結(jié)果生成的***.xml,sql映射文件請(qǐng)核對(duì)一下映射文件的位置是否和estore-ssm一致生成的實(shí)體類、每個(gè)實(shí)體類對(duì)應(yīng)的example類(該類可以用來(lái)構(gòu)造復(fù)雜的條件)使用的時(shí)候再介紹。請(qǐng)核對(duì)一下實(shí)體類的包、類名是否和estore-ssm一致生成的**Dao接口請(qǐng)核對(duì)一下包、接口名是否和estore-ssm一致生成的***.xml,sql映射文件請(qǐng)核對(duì)一下映射文件的位置是否和estore-ssm一致生成的實(shí)體類、每個(gè)實(shí)體類對(duì)應(yīng)的example類(該類可以用來(lái)構(gòu)造復(fù)雜的條件)使用的時(shí)候再介紹。請(qǐng)核對(duì)一下實(shí)體類的包、類名是否和estore-ssm一致生成的**Dao接口請(qǐng)核對(duì)一下包、接口名是否和estore-ssm一致3將逆向生成的文件替換到estore-ssm工程(或其副本工程)中我使用了副本工程,名為estore-ssm
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 單車租賃合同范本
- 一般農(nóng)村建房合同范本
- 公路運(yùn)輸代理合同范本
- 《虛弱老年人瑜伽鍛煉方案設(shè)計(jì)與實(shí)施研究》
- 工程合伙做生意合同范本
- 《南瓜多糖與人參皂苷或蘆丁的聯(lián)合體外抗氧化研究》
- 《技能主導(dǎo)類對(duì)抗性項(xiàng)目(籃球、網(wǎng)球、武術(shù))運(yùn)動(dòng)員一般認(rèn)知能力的研究》
- 《我國(guó)壽險(xiǎn)公司經(jīng)營(yíng)效率的測(cè)度研究》
- 《“營(yíng)改增”背景下上海建工集團(tuán)稅負(fù)研究》
- 鋼結(jié)構(gòu)物運(yùn)輸合同三篇
- 太陽(yáng)能制氫的能量轉(zhuǎn)換、儲(chǔ)存及利用系統(tǒng)
- 呼吸衰竭搶救流程
- 運(yùn)用數(shù)學(xué)知識(shí)解決高中物理問(wèn)題的探索
- 國(guó)開(kāi)電大本科工程數(shù)學(xué)(本)在線形考(形成性考核作業(yè)4)試題及答案
- 外研版四年級(jí)英語(yǔ)上冊(cè) (We are going to visit Hainan)教學(xué)課件
- 卓有成效的管理者解讀
- 崗位之間工作銜接配合的安全與職業(yè)衛(wèi)生事項(xiàng)
- 外來(lái)施工人員入廠工作流程
- 感染性疾病臨床診療規(guī)范2021版
- 堆垛機(jī)安裝指南演示文稿
- 退休歡送會(huì)上本人感人講話稿(5篇)
評(píng)論
0/150
提交評(píng)論