SSH實戰 · 唯唯樂購項目(中)

用戶模塊
三:一級分類的查詢
  1. 創建一級分類表并導入基本數據
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;
  1. 建包及相應的類:
    • com.weiwei.shopping.category
      • action :CategoryAction
      • service :CategoryService:業務層對象?
      • dao :CategoryDao:持久層對象?
      • vo :Category:實體對象 ;Category.hbm.xml:映射文件?
  1. 對Service和DAO進行配置:
    • 在DAO中注入sessionFactory
    • 在Service中注入DAO
  1. 需要在IndexAction中注入一級分類的Service.
    • IndexAction ? 調用 ? CategoryService ? 調用 ? CategoryDao
    • 將一級分類的數據顯示到頁面
    • 將一級分類的數據存入到session中:因為之后很多頁面都會用到。
五:首頁上熱門商品的顯示
  1. 建表:
創建二級分類的表:
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;
  1. 建包及相應的類:
    • com.weiwei.shopping.product
      • action :ProductAction
      • service :ProductService:業務層對象?
      • dao :ProductDao:持久層對象?
      • vo :Product:實體對象 ;Product.hbm.xml:映射文件?
  1. 對Service和DAO進行配置:
    • 在DAO中注入sessionFactory
    • 在Service中注入DAO
  1. 需要在IndexAction中注入商品的Service.
  • IndexAction ?調用 ?ProductService ?調用 ?ProductDao
  • 查詢熱門商品
  • is_hot: 0:不是熱門商品 ?1:是熱門商品;
  • 查詢帶有個數
  • 分頁查詢
  • 將查詢到的數據保存到值棧中
六:首頁上最新商品的顯示
  1. IndexAction? 調用 ? ProductService? 調用 ? ProductDao
  • 查詢最新商品:
  • 按商品上傳日期倒序進行排序 只顯示10個.
  • 將查詢到記錄保存到值棧中:
七:首頁上點擊商品顯示商品詳情
  1. 點擊商品鏈接:
* 傳遞商品id.
  1. 編寫Action:
* 編寫Action類,繼承ActionSupport實現模型驅動接口.
* 編寫一個執行的方法.
  1. 配置Action:
* 在applicationContext.xml中配置Action
* 在struts.xml中配置Action
  1. 在Action中調用Service完成根據ID進行查詢的方法:
* 注入ProductService.
* 完成查詢
  1. 在頁面上顯示相應數據 :
* 頁面轉向
* 修改頁面
* 顯示數據
顯示數據時可以直接通過模型驅動的model對象拿數據。例如:
src="${pageContext.request.contextPath}/<s:property?value="model.image"/>"
<s:property?value="model.shop_price"/>
八:首頁上點擊一級分類,查詢商品列表:(左側一級分類和二級分類關聯查詢)
  1. 創建二級分類的包及類:
    • com.weiwei.shopping.categorysecond
      • action :CategorySecondAction?
      • service :CategorySecondService?
      • dao :CategorySecondDao?
      • vo :CategorySecond?
      • CategorySecond.hbm.xml
  1. 配置一級分類和二級分類的關聯關系:
    • 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>
  1. 點擊一級分類的鏈接:
    • 傳遞一級分類的cid,根據cid查詢所有商品.
  1. 編寫Action:
    • 接收cid:
    • 編寫一個執行的方法:因為再ProductService中已經做了FindAll()方法,所以在這里直接注入ProductService 調用方法,然后返回字符串進行頁面跳轉。
    • 在頁面上用迭代標簽迭代顯示左側分類 ;
    • 關聯查找:直接從session中獲得一級分類的數據,需要在映射文件中配置一級分類上二級分類的集合(lazy="false"?);并且為了數據順序不變,按二級分類的遍號排序顯示(order-by="csid"?)。
九:首頁上點擊一級分類,查詢商品列表:(顯示商品列表)
  1. 查詢商品,帶有分頁顯示商品
    • 回到商品列表頁面
    • 需要查詢:商品集合,當前頁數,總頁數(總記錄數),每頁顯示記錄數.( 將后臺的這些數據帶到頁面上,首選:值棧 )
    • 將這些數據封裝到一個分頁類中。(最后將分頁類保存到值棧中就OK)。
  1. 在工具包中封裝一個PageBean。
  2. 完成查詢:
    • 傳遞當前頁數到ProductAction中,提供set方法;
    • 調用ProductService的FindByPageCid()方法完成查詢;參數:Cid,page;
方法返回的是PageBean;
  1. 配置二級分類和商品關聯關系——類似于一級分類月二級分類的配置。
注意:在頁面上從值棧中、模型驅動取PageBean不用加#;從session中取值需要加#.
:商品分類頁面根據二級分類ID查詢商品
  1. 點擊二級分類鏈接:
    • 傳遞csid
    • 傳遞page=1
  1. 編寫Action :
    • 接收csid:
    • 接收page
  1. 調用Service完成查詢:
    • 封裝成PageBean
  1. 在頁面中進行顯示
購物車模塊
一:創建表、包結構及映射文件。
二:將商品添加進購物車
  1. 封裝購物車對象
  • 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迭代標簽判斷
        • 若購物車為空則不顯示相關按鈕、表單
        • 若不為空則顯示表單、相關商品
四:移出購物項
    • 點擊頁面的移出鏈接,傳入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查詢訂單.
    • 在頁面中對其進行付款
  • 付款功能的實現
    • 在線支付的方式
    • 在線支付
    • 與第三方支付公司對接:(易寶)
    • 在線支付的流程
    • 付款功能代碼實現
    • 修改訂單數據:(收貨人,地址,電話)
    • 完成付款的功能

轉載于:https://www.cnblogs.com/panweiwei/p/6245743.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373157.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373157.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373157.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

播放2 –模塊,插件有什么區別?

關于Play 2模塊和插件似乎有些混亂。 我想這是因為兩者經常是同義詞。 在Play&#xff08;兩個版本-1和2&#xff09;中&#xff0c;存在明顯的差異。 在本文中&#xff0c;我將介紹什么是插件&#xff0c;如何在Java和Scala中實現插件&#xff0c;以及如何從模塊導入插件。 外…

Linux多線程貝葉斯建樹教程,建樹經驗.doc

建樹經驗分子進化樹構建及數據分析的簡介mediocrebeing, rodger, lylover, klaus, oldfish, yzwpf一、引言開始動筆寫這篇短文之前&#xff0c;我問自己&#xff0c;為什么要寫這樣的文章&#xff1f;寫這樣的文章有實際的意義嗎&#xff1f;我希望能夠解決什么樣的問題&#x…

Android的IPC機制(一)——AIDL的使用

綜述 IPC(interprocess communication)是指進程間通信&#xff0c;也就是在兩個進程間進行數據交互。不同的操作系統都有他們自己的一套IPC機制。例如在Linux操作系統中可以通過管道、信號量、消息隊列、內存共享、套接字等進行進程間通信。那么在Android系統中我們可以通過Bin…

python學習筆記(python介紹)

為什么要學python&#xff1f; python和shell的比較&#xff0c;和PHP、和JAVA比較 運維開發只是用到python的很小一部分 python在一些知名公司的應用&#xff1a; 谷歌&#xff1a;python的創始人原來在谷歌工作。 CIA&#xff1a;美國中情局網站用python開發的 NASA&#xff…

Netty:透明地使用SPDY和HTTP

大多數人已經從谷歌那里聽說過SPDY&#xff0c;該協議被提議作為老化的HTTP協議的替代品。 Web服務器是瀏覽器正在緩慢地實現該協議&#xff0c;并且支持正在增長。 在最近的文章中&#xff0c;我已經寫過SPDY的工作方式以及如何在Jetty中啟用SPDY支持。 由于Netty&#xff08;…

selenium 等待頁面加載完成

一、隱形加載等待&#xff1a; file:///C:/Users/leixiaoj/Desktop/test.html 該頁面負責創建一個div <html> <head><title>Set Timeout</title><style>.red_box {background-color: red; width 20%; height:100px; border: none;}</style&…

linux nfsnobody用戶,處理CentOS 5.5 x64 配置NFS服務過程中nfsnobody用戶造成的問題

4、我們編譯一下這個NFS的配置文件。[rootNFS /]# vi /etc/exports/share 192.168.60.0/24(rw,sync,all_squash,root_squash) (我們允許這個共享對192.168.60.0/24網段可讀可寫&#xff0c;且將所有訪問者包括root的身份都改為nfsnobody)[rootNFS /]# /etc/init.d/nfs resta…

計算機語言

軟件&#xff1a;是一系列按照特定順序組織的計算機數據和指令的集合。一般來講軟件被劃分為系統軟件、應用軟件和介于這兩者之間的中間件。 系統軟件 系統軟件是各類操作系統&#xff0c;如windows、Linux、UNIX等&#xff0c;還包括操作系統的補丁程序及硬件驅動程序&#xf…

Apache Shiro第2部分–領域,數據庫和PGP證書

這是致力于Apache Shiro的系列文章的第二部分。 我們從簡單的不安全Web應用程序開始了上一部分 。 完成后&#xff0c;該應用程序具有基本的身份驗證和授權。 用戶可以登錄和注銷。 所有網頁和按鈕均已分配和實施訪問權限。 授權和身份驗證數據都已存儲在靜態配置文件中。 正如…

js中變量作用域的小理解

一&#xff1a;變量作用域 在js代碼中每個變量都是有自己的作用域的&#xff0c;js中不像C語言有塊級作用域的概念&#xff0c;取而代之的是函數作用域&#xff0c;看如下代碼&#xff1a; var scope"global"; function init(){ alert(scope);var scope "local…

安卓linux開機畫面,Android系統的開機畫面顯示過程分析(1)

好幾個月都沒有更新過博客了&#xff0c;從今天開始&#xff0c;老羅將嘗試對Android系統的UI實現作一個系統的分析&#xff0c;也算是落實之前所作出的承諾。提到Android系統的UI&#xff0c;我們最先接觸到的便是系統在啟動過程中所出現的畫面了。Android系統在啟動的過程中&…

如果你的NavigationDrawer里面的Item沒有響應,Drawer不能左滑關閉

如果你的NavigationDrawer里面的Item沒有響應&#xff0c;Drawer不能左滑關閉&#xff0c;應該是因為你沒有把主要內容放在DrawerLayout標簽下的第一位。 The main content view (the FrameLayout above) must be the first child in the DrawerLayout because the XML order i…

JAXB和未映射的屬性

JAXB&#xff08;JSR-222&#xff09;是例外配置&#xff0c;這意味著存在默認映射應用于域對象。 這意味著有時您需要顯式排除字段/屬性。 在本文中&#xff0c;我將討論如何使用XmlTransient或XmlAccessorType&#xff08;XmlAccessType.NONE&#xff09;以及何時使用每個選項…

sublime text3 使用SVN插件

Simon在項目中經常使用SVN&#xff0c;每次都要切換提交&#xff0c;很麻煩&#xff0c;有了這個SVN插件就很方便了&#xff0c;使用快捷方式提交&#xff0c;更新。 安裝: Ctrl Shift P 調用出Sublime Text的包管理工具&#xff0c;輸入TortoiseSVN&#xff0c;回車進行安裝…

c語言空格有什么作用,空格在c語言中怎么表示 C語言中的空格字符怎么表示

c語言中表示空格的是什么代碼&#xff1f;分析如下&#xff1a; 不是所有字符都需要轉義的&#xff0c;空格直接就敲空格&#xff0c;或者使用ASCII碼值賦值為32。 空格沒有轉義字符。合法轉義字符如下&#xff1a;\a 響鈴(BEL) 、\b 退格(BS)、\f 換頁(FF)、\n 換行(LF)、\r 回…

二維數組實現八皇后問題

之前關八皇后的問題全部使用的是一維數組進行實現(http://www.cnblogs.com/SeaSky0606/p/4604955.html)&#xff0c;現改一種數據存儲方式&#xff0c;按照8x8的二維棋盤存儲皇后。基本邏輯不變&#xff0c;可參見如下代碼&#xff1a; #include<cstdio> #include<alg…

Java的深度:通過協方差暴露的API泄漏

Java有時可能非常棘手&#xff0c;特別是在API設計中。 讓我們看一個非常有趣的展示柜。 jOOQ強烈地將API與實現分開。 所有API都在org.jooq包中&#xff0c;并且是公共的。 大多數實現都在org.jooq.impl包和package-private中。 只有工廠和一些專用的基礎實現是公開的。 這允許…

StringMVC 中如何做數據校驗

步驟一&#xff1a;引入四個jar包 步驟二&#xff1a;注冊類型轉換器 <context:component-scan base-package"cn.happy.controller"></context:component-scan><!-- 配置驗證器 --><bean id"myvalidator" class"org.springframe…

ibm+x3650+m4+linux+raid驅動,IBM X3650M4陣列卡驅動下載

ibm X3650M4raid陣列卡驅動適合安裝windowsserver2008,windowsserver2008R2,系統問題&#xff0c;服務器問題&#xff0c;可以聯系我們也可以到5分享論壇發帖求助。IBM System x3650 M4服務器是一款應用最為廣泛的2U機架服務器&#xff0c;支持Xeon E5-2600機架服務器的所有產品…

為什么在Java 6上Math.round(0.499999999999999917)舍入為1

總覽 錯誤表示錯誤和算術舍入錯誤有兩種類型&#xff0c;它們在浮點計算中很常見。 在此簡單示例中&#xff0c;這兩個錯誤組合在一起&#xff0c;在Java 6中Math.round&#xff08;0.4999999999999999999917&#xff09;舍入為1。 表示錯誤 浮點數是以2為底的格式&#xff0c…