用戶模塊
三:一級分類的查詢
- 創建一級分類表并導入基本數據
CREATE TABLE `category` (
`cid` int(11) NOT NULL AUTO_INCREMENT,
`cname` varchar(255) DEFAULT NULL,
PRIMARY KEY (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
- 建包及相應的類:
- com.weiwei.shopping.category
- action :CategoryAction
- service :CategoryService:業務層對象?
- dao :CategoryDao:持久層對象?
- vo :Category:實體對象 ;Category.hbm.xml:映射文件?
- com.weiwei.shopping.category
- 對Service和DAO進行配置:
- 在DAO中注入sessionFactory
- 在Service中注入DAO
- 需要在IndexAction中注入一級分類的Service.
- IndexAction ? 調用 ? CategoryService ? 調用 ? CategoryDao
- 將一級分類的數據顯示到頁面
- 將一級分類的數據存入到session中:因為之后很多頁面都會用到。
五:首頁上熱門商品的顯示
- 建表:
創建二級分類的表:
CREATE TABLE `categorysecond` (
`csid` int(11) NOT NULL AUTO_INCREMENT,
`csname` varchar(255) DEFAULT NULL,
`cid` int(11) DEFAULT NULL,
PRIMARY KEY (`csid`),
KEY `FK936FCAF21DB1FD15` (`cid`),
CONSTRAINT `FK936FCAF21DB1FD15` FOREIGN KEY (`cid`) REFERENCES `category` (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=41 DEFAULT CHARSET=utf8;
創建商品表:
CREATE TABLE `product` (
`pid` int(11) NOT NULL AUTO_INCREMENT,
`pname` varchar(255) DEFAULT NULL,
`market_price` double DEFAULT NULL,
`shop_price` double DEFAULT NULL,
`image` varchar(255) DEFAULT NULL,
`pdesc` varchar(255) DEFAULT NULL,
`is_hot` int(11) DEFAULT NULL,
`pdate` datetime DEFAULT NULL,
`csid` int(11) DEFAULT NULL,
PRIMARY KEY (`pid`),
KEY `FKED8DCCEFB9B74E02` (`csid`),
CONSTRAINT `FKED8DCCEFB9B74E02` FOREIGN KEY (`csid`) REFERENCES `categorysecond` (`csid`)
) ENGINE=InnoDB AUTO_INCREMENT=80 DEFAULT CHARSET=utf8;
- 建包及相應的類:
- com.weiwei.shopping.product
- action :ProductAction
- service :ProductService:業務層對象?
- dao :ProductDao:持久層對象?
- vo :Product:實體對象 ;Product.hbm.xml:映射文件?
- com.weiwei.shopping.product
- 對Service和DAO進行配置:
- 在DAO中注入sessionFactory
- 在Service中注入DAO
- 需要在IndexAction中注入商品的Service.
- IndexAction ?調用 ?ProductService ?調用 ?ProductDao
- 查詢熱門商品
- is_hot: 0:不是熱門商品 ?1:是熱門商品;
- 查詢帶有個數
- 分頁查詢
- 將查詢到的數據保存到值棧中
六:首頁上最新商品的顯示
- IndexAction? 調用 ? ProductService? 調用 ? ProductDao
- 查詢最新商品:
- 按商品上傳日期倒序進行排序 只顯示10個.
- 將查詢到記錄保存到值棧中:
七:首頁上點擊商品顯示商品詳情
- 點擊商品鏈接:
* 傳遞商品id.
- 編寫Action:
* 編寫Action類,繼承ActionSupport實現模型驅動接口.
* 編寫一個執行的方法.
- 配置Action:
* 在applicationContext.xml中配置Action
* 在struts.xml中配置Action
- 在Action中調用Service完成根據ID進行查詢的方法:
* 注入ProductService.
* 完成查詢
- 在頁面上顯示相應數據 :
* 頁面轉向
* 修改頁面
* 顯示數據
顯示數據時可以直接通過模型驅動的model對象拿數據。例如:
src="${pageContext.request.contextPath}/<s:property?value="model.image"/>"
<s:property?value="model.shop_price"/>
八:首頁上點擊一級分類,查詢商品列表:(左側一級分類和二級分類關聯查詢)
- 創建二級分類的包及類:
- com.weiwei.shopping.categorysecond
- action :CategorySecondAction?
- service :CategorySecondService?
- dao :CategorySecondDao?
- vo :CategorySecond?
- CategorySecond.hbm.xml
- com.weiwei.shopping.categorysecond
- 配置一級分類和二級分類的關聯關系:
- Category.xml
?<!-- 配置一個二級分類的集合?? 按照編號進行排序? 懶加載默認是true,為了不延遲改為false-->
??? ??????<set?order-by="csid"?name="categorySeconds"?lazy="false">
??? ??????????<key?column="cid"></key>
??? ??????????<one-to-many?class="com.weiwei.shopping.categorysecond.vo.CategorySecond"/>
??? ??????</set>
- CategorySecond.hbm.xml
? ? ? ? ?? <!--
? ? ? ? ? ? 相對于一級分類,二級分類是many的一端 :在二級分類中配置many-to-one
? ? ? ? ? ? name:實體類中的屬性
? ? ? ? ? ? column:表中的外鍵字段
??? ?????? -->
??? ???????<many-to-one?name="category"?class="com.weiwei.shopping.category.vo.Category"?column="cid"></many-to-one>
- 點擊一級分類的鏈接:
- 傳遞一級分類的cid,根據cid查詢所有商品.
- 編寫Action:
- 接收cid:
- 編寫一個執行的方法:因為再ProductService中已經做了FindAll()方法,所以在這里直接注入ProductService 調用方法,然后返回字符串進行頁面跳轉。
- 在頁面上用迭代標簽迭代顯示左側分類 ;
- 關聯查找:直接從session中獲得一級分類的數據,需要在映射文件中配置一級分類上二級分類的集合(lazy="false"?);并且為了數據順序不變,按二級分類的遍號排序顯示(order-by="csid"?)。
九:首頁上點擊一級分類,查詢商品列表:(顯示商品列表)
- 查詢商品,帶有分頁顯示商品
- 回到商品列表頁面
- 需要查詢:商品集合,當前頁數,總頁數(總記錄數),每頁顯示記錄數.( 將后臺的這些數據帶到頁面上,首選:值棧 )
- 將這些數據封裝到一個分頁類中。(最后將分頁類保存到值棧中就OK)。
- 在工具包中封裝一個PageBean。
- 完成查詢:
- 傳遞當前頁數到ProductAction中,提供set方法;
- 調用ProductService的FindByPageCid()方法完成查詢;參數:Cid,page;
方法返回的是PageBean;
- 配置二級分類和商品關聯關系——類似于一級分類月二級分類的配置。
注意:在頁面上從值棧中、模型驅動取PageBean不用加#;從session中取值需要加#.
十:商品分類頁面根據二級分類ID查詢商品
- 點擊二級分類鏈接:
- 傳遞csid
- 傳遞page=1
- 編寫Action :
- 接收csid:
- 接收page
- 調用Service完成查詢:
- 封裝成PageBean
- 在頁面中進行顯示
購物車模塊
一:創建表、包結構及映射文件。
二:將商品添加進購物車
- 封裝購物車對象
- Cart:購物車對象
- CartItem的集合
- total:總計 = 小計相加
- 功能:
- 將購物項添加到購物車
- 從購物車中移出購物項
- 清空購物車
-
?????/*功能1:將購物項添加到購物車*/
?????public?void?addCart(CartItem?cartItem){
??????????/*判斷購物車中是否已經存在該購物項
?????????? * ??存在:
?????????? * ???????數量增加
?????????? * ???????總計 = 總計 + 購物項小計
?????????? * 不存在:
?????????? * ???????向map中添加購物項
?????????? * ???????總計 = 總計 + 購物項小計
?????????? * */
??????????//獲得商品id
??????????Integer?pid?=?cartItem.getProduct().getPid();
??????????//判斷購物車中是否存在該購物項:
??????????if(map.containsKey(pid)){
??????????????//存在
??????????????//獲取原來的購物項
??????????????CartItem?OcartItem?=?map.get(pid);
??????????????OcartItem.setCount(OcartItem.getCount()?+?cartItem.getCount());
??????????}?else?{
??????????????//不存在
??????????????map.put(pid,?cartItem);
??????????}
??????????//設置總計的值
??????????total?+=?cartItem.getSubtotal();
?????}
- CartItem:購物項
- Product:商品信息
- count:購買某種商品的數量
- subtotal:購買某種商品的小計=單價*數量(Product.shop_price*count)
?提示:(1)set集合每添加一個順序就會變化:所以購物車中不用set;若只為顯示購物車,則用list集合就足夠了,但是為了能夠刪除商品,我們選擇用map集合,通過key可以刪除選中商品。
(2)通過JS提交表單:document.getElementById("表單ID").submit();
(3)在購物車中顯示商品:${pageContext.request.contextPath}/<s:property?value="#cartItem.product.image":在頁面上從值棧中取PageBean不用加#;從session中取值需要加#.
三:清空購物車
- 在CartAction中:
- 獲得購物車
- 調用clearCart()方法
- 在頁面上:
- 用struts迭代標簽判斷
- 若購物車為空則不顯示相關按鈕、表單
- 若不為空則顯示表單、相關商品
- 用struts迭代標簽判斷
- 在CartAction中:
四:移出購物項
- 點擊頁面的移出鏈接,傳入pid
- 在CartAction中:
- 獲得購物車
- 調用removeCart()方法
注意:
session序列化的異常。
session銷毀三種情況:
(1)服務器超時:30分鐘;
(2)服務器非正常關閉:如從控制臺直接關tomcat(點stop是正常關閉,啟動會拋序列化異常)

(3)手動調用session的銷毀方法(如本項目中的退出功能);
所以讓實體類實現序列化接口就解決了:
/*實現序列化的接口,以免服務器拋未序列化異常*/
public?class?Cart?implements?Serializable{···}
訂單模塊
一:建表:數據庫設計模塊已完成;
二:創建訂單模塊的包、類:
- com.weiwei.shopping.order
- action :OrderAction?
- service :OrderService?
- dao :OrderDao?
- vo :
- Order?
- Order.hbm.xml
- OrderItem
- OrderItem.hbm.xml
三:配置:
- applicationContext.xml
- 配置映射
- OrderAction ? 調用 ? OrderService ? 調用 ? OrderDao
- 實現提交訂單時頁面的跳轉:修改我的購物車頁面的提交按鈕鏈接,再編寫OrderAction、配置struts.xml
四:訂單頁面數據生成并顯示
- 生成訂單
- 保存訂單的數據
- 在頁面中顯示訂單數據
- 通過模型驅動的對象將數據傳遞到頁面.(原理還是值棧)
- 我的訂單
- 根據用戶的uid查詢當前用戶的所有的訂單
五:付款
- 在線付款原理圖:

本項目采用第二種方式。
- 在線付款流程分析

- 本項目付款功能流程
- 跳轉到頁面:根據訂單的oid查詢訂單.
- 在頁面中對其進行付款
- 付款功能的實現
- 在線支付的方式
- 在線支付
- 與第三方支付公司對接:(易寶)
- 在線支付的流程
- 付款功能代碼實現
- 修改訂單數據:(收貨人,地址,電話)
- 完成付款的功能