項目:《JavaWeb圖書管理系統視頻》--代碼修復還能夠運行起來

1. 系統設計--項目效果圖請看最後面

1技術選型 (系統架構)

JSTL + JSP + Servlet + JavaBean + BeanUtils + FileUpload + JavaMail + DBUtils(JDBC) + C3P0 +  MySQL + MyEclipse10+ Tomcat7.0 + JDK6  + Windowsjavascript

MVC 模式css

JavaEE 三層結構   web層   service層   daojava

DAO 模式node

2數據庫設計

系統存在如下實體:用戶、商品、訂單、購物車mysql

 

項目跑起來 過程:一、講課雖然是myeclipse  由於不熟悉,這個項目是兼容eclipse的,導入jsp-api.jar  servlet-api.jar【通常在tomcat 的 lib中】web

  

二、導入數據庫到mysql中,設定鏈接數據庫 配置文件 /bookEstore/src/c3p0-config.xml中正則表達式

三、有中文亂碼,解決不了, 部分是字符串後面的 "  亂碼了,手動添加; 算法

四、 用jdk 1.7 能夠跑,不用手動更改什麼設定sql

五、運行,發現圖片 flash 不少資源顯示不出來,按照老師課程設定 本地 http://www.bookEstore.com就能夠訪問工程問題不成功,放棄;數據庫

    將代碼中 搜索有http://www.bookEstore.com 的地方都替換爲${pageContext.request.contextPath }/     包括css js  的路徑 ,

六、 運行完美顯示 ,就是有亂碼,蛋疼。

 

的一點理解:

一、關於在瀏覽器上直接輸入  http://www.bookEstore.com就能夠訪問工程問題

         1.在tomcat/conf/server.xml文件中配置一個虛擬主機
            <Host name="www.bookEstore.com"  appBase="D:\j2eeWorkspaces\bookEstore"
                unpackWARs="true" autoDeploy="true">       
                <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
                   prefix="localhost_access_log." suffix=".txt"
                   pattern="%h %l %u %t &quot;%r&quot; %s %b" />
                 
                <Context path="" docBase="D:\j2eeWorkspaces\bookEstore\WebRoot"/>                  
          </Host>
          
        2.須要在C:\Windows\System32\drivers\etc路徑下查找一個配置文件hosts
            在這個文件中配置
            127.0.0.1       www.bookEstore.com         
        3.能夠在server.xml文件中
            <Engine name="Catalina" defaultHost="www.bookEstore.com">

二、經過 index 首頁 簡單語句 跳轉到指定頁面:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<jsp:forward page="/product"></jsp:forward>

三、forEach中 得到 每一行的 id

<c:forEach items="${ps}" var="p" varStatus="vs">

 <c:if test="${vs.count%5==0}">

四、跨行佈局 表格 下圖是6行2列

  colspan是跨列,rowspan是跨行

<table align="center">
        <tr>
            <td rowspan="5"><img src="http://www.bookEstore.com/${p.imgurl_s}">
            </td>
            <td>商品名稱:${p.name}</td>
        </tr>

        <tr>
            <td>商品價格:${p.price}</td>
        </tr>
        <tr>
            <td>商品類別:${p.category}</td>
        </tr>
        <tr>
            <td>商品數量:${p.pnum}</td>
        </tr>
        <tr>
            <td>商品描述:${p.description}</td>
        </tr>

        <tr>
            <td colspan="2" align="right">
            <img
                src="${pageContext.request.contextPath}/images/buy.bmp"
                onclick="addProductToCart('${p.id}')"></td>
        </tr>
    </table>

 五、添加購物車 有技巧

// 添加商品到購物車
    public void add(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 1.獲得要添加到購物車中的商品的id
        String id = request.getParameter("id");

        // 2.根據id查找商品
        try {
            Product p = new ProductServiceImpl().findById(id);

            // 3.獲得購物車
            HttpSession session = request.getSession();
            Map<Product, Integer> cart = (Map<Product, Integer>) session
                    .getAttribute("cart");

            if (cart == null) {// 若是cart不存在,說明是第一次購物.
                cart = new HashMap<Product, Integer>();
            }
            // 判斷購物車中是否有要添加商品。
            Integer count = cart.put(p, 1);//注意map的用法
            if (count != null) {
                // 說明有嗎
                cart.put(p, count + 1);
            }

            session.setAttribute("cart", cart);

        } catch (SQLException e) {
            e.printStackTrace();
        }

        response.sendRedirect(request.getContextPath() + "/index.jsp");
    }

六、.查看購物車中商品

當點擊查看購物車中商品時,會跳轉到一個jsp頁面,購物車是存儲在session中的,
那麼在jsp頁面上就能夠直接獲得session中的商品信息.

jsp中學會標籤庫,jstl  

訂單查詢操做:

訂單的取消與支付:

訂單的取消與支付
    1.支付操做
        使用了在線支付操做   epay第三方支付平臺.
        
        在顯示訂單頁面上showOrder.jsp頁面,顯示訂單信息中,包含了當前支付狀態。
        會顯示  "已支付"  "未支付",若是是未支付,會有一個鏈接訪問pay.jsp頁面,
        並將當前訂單的id,以及當前訂單的金額傳遞到pay.jsp頁面。
        
        1.在pay.jsp頁面上能夠選擇銀行,表單提交時,將訂單編號,金額,以及銀行,提交到OnlinepayServlet中。
        2.在OnlinePayServlet中完成請求參數封裝.
        3.第三方支付,會根據你提交的請求參數   p8_Url 向這個路徑發送信息,
        4.能夠指定p8_url爲CallbackServlet,那麼咱們在servlet中就能夠獲得支付結果信息
        5.經過判斷信息是否正確,以及r9_BType=1  r9_BType=2 能夠知道,是否支付成功
        6.當判斷支付成功後,咱們要修改訂單的狀態。
            1.在orders表中有一個字段  paystate=0 表明未支付,咱們支付成功後,要修改訂單的狀態。
                paystat=1  這個表明訂單已對付.
                
            2.修改訂單狀態要根據訂單編號修改,在返回的支付結果信息中r6_Order,它就表明了
              咱們的訂單編號。                
    ---------------------------------------------
    2.訂單取消
        在顯示訂單的頁面上,會提供一個刪除訂單的鏈接。
        
        1.錄取消訂單時,這個超鏈接會攜帶當前訂單的編號傳遞到服務器端.
            <a href="${pageContext.request.contextPath}/order?method=del&id=${order.id}">取消訂單</a>
        2.這個鏈接會訪問OrderServlet,而且 method=del  id=訂單編號
            
        3.OrderServlet中會根據傳遞method判斷執行取消訂單操做,會根據id知道要刪除哪個訂單.
            
        4.刪除訂單注意事項
            1.刪除訂單要將orders表中數據刪除---根據id刪除.
            2.須要刪除orderItem表中數據
            3.須要修改商品的數量  也就是說須要對products表進行update操做.
            
            代碼:
                1.根據訂單id在orderitem表中查詢出相關的商品信息.
                2.修改商品信息
                3.刪除訂單項信息
                4.刪除訂單.
            以上操做,也須要進行事務控制。

 

 

 

忽然疑問:

一、登陸成功後爲何要將用戶存到session中?

// 登陸成功後,將用戶存儲到session中.
request.getSession().invalidate();
request.getSession().setAttribute("user", user);

二、 feild 域,「username」這樣就傳一個參數進去了嗎?  還有正則表達式?

//驗證用戶名
var flag1=checkNull("username");

//非空操做
function checkNull(field){
var reg = /^\s*$/; //表明0個或多個空白符
var value = document.getElementById(field).value;

三、勾選記住用戶名,難到勾選了 就得到請求參數了嗎

<td colspan="2"><input type="checkbox"
name="remember" value="on" />記住用戶 <input
type="checkbox" name="autologin" value="on" />自動登錄</td>

String saveUsername = request.getParameter("remember");

四、點擊添加到購物車後,js中這樣就跳轉

<script type="text/javascript">
function addProductToCart(id) {
location.href = "${pageContext.request.contextPath}/cart?method=add&id=" + id;
}
</script>

 ====

 

圖書商城
1.功能分析
一、用戶註冊
二、用戶登陸
三、添加商品(CURD)
四、商品查看-- 列表查詢
五、商品詳情頁面
六、將商品添加購物車
七、查看購物車
八、修改購物車
九、生成訂單
十、訂單查看(取消)
十一、在線支付
12.下載銷售榜單

遊客(未登陸): 註冊、登錄、商品查看 
商城註冊用戶 : 商品查看、添加商品到購物車、購物車管理、生成訂單、訂單管理、在線支付 
管理員 : 添加商品、商品管理、查看訂單 、榜單查看(導出)

2.系統設計

1技術選型 (系統架構)
JSTL + JSP + Servlet + JavaBean + BeanUtils + FileUpload + JavaMail + DBUtils(JDBC) + C3P0 +  MySQL + MyEclipse10+ Tomcat7.0 + JDK6  + Windows 
MVC 模式
JavaEE 三層結構   web層   service層   dao層
DAO 模式 

2數據庫設計
系統存在如下實體:用戶、商品、訂單、購物車
購物車不放入數據庫 (Session或者Cookie實現) 
用戶表
create table users (
   id int primary key auto_increment,
   username varchar(40),
   password varchar(100),
   nickname varchar(40),
   email varchar(100),
   role varchar(100) ,
   state int , 
   activecode varchar(100),
   updatetime timestamp  );
商品表
create table products(
   id varchar(100) primary key , 
   name varchar(40), 
   price double,
   category varchar(40),
   pnum int ,
   imgurl varchar(100),
   description varchar(255));
訂單表
create table orders(
   id varchar(100) primary key,
   money double,
   receiverinfo varchar(255),
   paystate int, 
   ordertime timestamp,
   user_id int , 
   foreign key(user_id) references users(id)
);

用戶與訂單之間存在 一對多關係 : 在多方添加一方主鍵做爲外鍵 
訂單和商品之間存在 多對多關係 : 建立第三張關係表,引入兩張表主鍵做爲外鍵 (聯合主鍵)
訂單項
create table orderitem(
   order_id varchar(100),  
   product_id varchar(100),
   buynum int , 
   primary key(order_id,product_id), 
   foreign key(order_id) references orders(id), 
   foreign key(product_id) references products(id)
);

設置數據庫環境
數據庫 :create database estoresystem

3 工程環境搭建和網站部署
1) 導入jar包 
導入mysql驅動  mysql driver / mysql-connector-java-5.0.8-bin.jar 
導入c3p0  c3p0/c3p0-0.9.1.2.jar  將c3p0-config.xml 複製src下  將DataSourceUtils複製 cn.itcast.estore.utils 
----- 配置c3p0-config.xml數據庫鏈接參數 導入dbutils apache commons\dbutils\commons-dbutils-1.4.jar 導入beanutils commons-beanutils-1.8.3.jar commons-logging-1.1.1.jar 導入fileupload commons-fileupload-1.2.1.jar commons-io-1.4.jar 導入javamail mail.jar 導入jstl jstl.jar standard.jar 2) 創建package結構 按照JavaEE 三層結構 cn.itcast.estore.web.servlet cn.itcast.estore.web.filter cn.itcast.estore.web.listener cn.itcast.estore.service cn.itcast.estore.dao cn.itcast.estore.domain cn.itcast.estore.utils 3) domain類編寫 4) 工程發佈 將bookEstore項目配置虛擬主機,以頂級域名方式進行發佈 1) 將工程根目錄 bookEstore目錄 配置虛擬主機目錄 ---- 配置conf/server.xml
<Host name="www.bookEstore.com" appBase="myeclipse下的工程路徑" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> </Host> 2) 將工程目錄下WebRoot 目錄,配置缺省web應用 <Host name="www.estore.com" appBase=" myeclipse下的工程路徑" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Context path="" docBase="WebRoot" /> </Host> 3) 將www.estore.com 虛擬主機配置缺省虛擬主機 ----- 可以用ip直接訪問主機 <Engine name="Catalina" defaultHost="www.estore.com"> 4) 修改本機域名解析文件 hosts ---- c:\windows\system32\drivers\etc 添加 127.0.0.1 www.bookEstore.com 3.功能實現 1用戶註冊 一、 功能一: 用戶註冊 (技術點:驗證碼技術 、激活郵件技術) 1) 一次性驗證碼 原理:在生成驗證碼Servlet程序中,將生成驗證碼保存Session中,用戶提交驗證碼 與 保存在Session驗證碼進行比較,若是相同,請求合法 2) 註冊表單 JS校驗 考慮JS校驗是否能夠抽取成框架 3) 處理form亂碼問題 ---- 通用get post 亂碼過濾器 4) 密碼 MD5 加密 5) 激活郵件發送 6) 配置通用錯誤處理頁面web.xml <error-page> <error-code>500</error-code> <location>/500.jsp</location> </error-page> <error-page> <error-code>404</error-code> <location>/404.jsp</location> </error-page> 500.jsp 顯示錯誤的信息 404.jsp 自動刷新跳轉回主頁面 2用戶登陸 原理:用戶輸入正確用戶名和密碼,登錄成功,用戶信息將會被保存Session對象中。 ------ 記住用戶名和密碼 、自動登錄 1) 登錄表單中,添加記住用戶名 和 自動登錄功能 2) 登錄過程當中判斷 帳戶是否激活 3) 在login.jsp 顯示記住用戶名 在username 的input項中添加 value="${cookie.username.value}" 在勾選自動登錄 checkbox 添加 4) 登錄後註銷功能 註銷Session 3用戶自動登陸過濾器 自動登錄功能 對系統全部頁面有效 (例如訪問index.jsp list_product.jsp info_product.jsp 這些頁面在訪問時都將執行自動登錄 ) * 對於登錄相關頁面不會執行自動登錄邏輯 (login.jsp 、LoginServlet 、InvalidateServlet ) 1) 判斷該請求頁面是否須要自動登錄 2) 是否已經登錄 3) 是否含有自動登錄cookie 4) 自動登錄 5) 在LoginServlet 添加對於沒有勾選記住用戶名和自動登錄 處理代碼 !!!!!!! 6) 在退出功能 InvalidateServlet 清除自動登錄信息 4商品添加 文件上傳三個注意事項 1) input輸入框 必須有name屬性 2) 表單form 必須post提交方式 3) 設置form的enctype 爲 multipart/form-data 表單提交時,校驗分爲兩種 : 客戶端校驗 、服務器端校驗 ------ 只有服務器端校驗才能確保數據準確 商品圖片上傳到服務器端後,保存在哪一個目錄 ??? 必須直接在WebRoot下及其除WEB-INF、META-INF 子目錄外 通常狀況下,一張表對應Domain類 --- DAO類 ---- Service類 5商品列表查看 列表中顯示原圖,由於原圖比較大,頁面加載很是緩慢 ,頁面佈局不會很美觀 ---------------- 縮略圖 * Java中經過圖形界面技術,生成小圖 在Product類中添加 getImgurl_s方法,用來獲取縮略圖路徑 6商品詳細信息查看 經過在列表中點擊 商品圖片或者商品名稱 進入詳情查看頁面 7添加商品到購物車 購物車對象,不保存在數據庫中,使用Session來保存用戶購物車數據 保存購物車對象 Map<Product,Integer> key 商品對象 value 商品購買數量 流程 :添加商品到購物車流程,點擊添加到購物車,將商品id傳遞Servlet ,從Session中取出購物車對象,
判斷商品是否已經在購物車中,若是不在添加商品到購物車數量 1 ,在購物車取出原有數量+1 1) 若是Map的key是一個自定義對象,重寫 hashcode和equals 2) 若是商品不在購物車中,須要根據商品 id 查詢商品全部信息,添加購物車 3) 添加商品到購物車 Session中信息在服務器正常關閉時,會被序列化到硬盤中 ---- Product實現 Serializable接口 完成序列化 8顯示與修改購物車數據 購物車信息保存在Session中,不須要去查詢數據庫,將Session中信息顯示出來 1) 在購物車中顯示總價 2) 購物車修改 : 清空購物車 : request.getSession().removeAttribute("cart"); 刪除購物車中單項商品 : cart.remove(product) ; 注意:刪除一項後,判斷購物車是否爲空,若是爲空 移除購物車對象 * 刪除確認功能 寫法一:直接在href中 觸發js函數,詢問用戶是否確認,若是確認,location.href 發起刪除請求 -----
<a href="javasript:confirmDel();" >...</a> 寫法二:<a href="/delCart?id=xx" onclick="confirmDel(); "></a> 在連接中添加 onclick事件 ,詢問用戶是否確認,若是用戶取消,經過JS阻止href事件提交 阻止href默認事件 : e.preventDefault() ---- 必須支持事件 FF支持、IE不支持 IE阻止href默認事件 function confirmDel(e){ // 詢問用戶是否確認 var isConfirm = window.confirm("商品不要了嗎?多好的商品啊!"); if(!isConfirm){ // 用戶選擇取消,阻止 a 標籤 默認事件 href發生 if(e&&e.preventDefault){ // e對象存在,preventDefault方法存在 ---- 火狐瀏覽器 e.preventDefault(); }else{ // 不支持e對象,或者沒有preventDefault方法 ---- IE window.event.returnValue = false; } } } 修改購物車中商品購買數量 ---- JavaScript 控制購物數量修改 9訂單生成 重點: 1) 向orders表插入訂單信息後,同時須要向orderitem表插入 訂單中每項數據 2) 多表插入 (數據完整性問題) --- 事務管理 3) 訂單生成後 ,商品數量更新減小 10訂單列表查詢與取消 管理查詢訂單 --- 全部人訂單信息 普通用戶 ---- 只能查詢本身的訂單 在訂單生成後,查看訂單列表 、也能夠經過index.jsp 進入訂單查看頁面 重點:查詢訂單時,同時查詢訂單項目信息 1) 查詢訂單基本信息時,查詢下單用戶暱稱和用戶名 在Order類中 添加 用戶的 username 和 nickname字段 select orders.*,users.username,users.nickname from orders,users where orders.user_id = users.id; 2) 查詢訂單項信息時,查詢商品的名稱和單價 在OrderItem類中 添加商品的name和price 字段 select orderitem.*,products.name,products.price from orderitem,products where orderitem.produtct_id = products.id and orderitem.order_id = ? 訂單取消 : 刪除訂單表信息時,同時刪除訂單項信息 (訂單項信息依賴 訂單信息 ,必須先刪除訂單項) 注意事項 1) 能夠取消未支付的訂單,若是訂單已經支付,將沒法取消 2) 管理員不能取消任何用戶未支付訂單,普通用戶只能取消 本身的未支付的訂單 取消訂單進行事務管理 :刪除訂單項、刪除訂單、恢復商品數量 11訂單在線支付 1) 網站進行支付,根據易寶支付接口請求規範,生成易寶須要數據,將數據提交到易寶指定網址 https://www.yeepay.com/app-merchant-proxy/node * 在提交支付請求給易寶,須要將請求中數據,使用易寶提供密鑰和算法進行加密,得到數字簽名 hmac碼 ,將hmac碼發送給易寶 2) 易寶會鏈接銀行,進行支付 3) 支付後,瀏覽器會以重定向方式訪問 網站回調程序,易寶在收到銀行轉帳後,會以Socket方式通知網站 * 在瀏覽器重定向通知後,提供給用戶支付成功顯示頁面 (不要去修改訂單狀態) * 在網站收到易寶點對點通知後,回覆易寶success,修改訂單狀態 數字簽名原理:將數據 使用密鑰和算法加密後 得到數字簽名hmac,將數據和數字簽名hmac一塊兒發送給易寶,易寶採用一樣密鑰和算法對數據進行加密得到數字簽名hmac,比較請求中數字簽名hmac與加密後得到數字簽名hmac是否一致,若是一致 簽名hmac有效 (數據沒有被篡改 ) 流程入口: 未支付訂單能夠進行支付,管理員不容許支付 在線支付 1) pay.jsp 銀行選擇頁面 2) OnlinePayServlet 準備易寶支付參數 * 提供密鑰和算法 商家編號 真實的 將PaymentUtil 複製 utils包 , 將 merchantInfo.properties 複製 src * responseURL 支付成功後 回調地址 ,該地址會收到 瀏覽器重定向和服務器點對點兩次通知 ,確保該地址 能夠被易寶訪問 (estore項目必需要配置缺省虛擬主機) 將OnlinePayServlet準備易寶參數,傳遞JSP 確認 3) confirm.jsp 經過form的隱藏域 提交參數給易寶網址 https://www.yeepay.com/app-merchant-proxy/node 4) CallbackServlet 回調程序 收到瀏覽器重定向和服務器點對點兩個通知 瀏覽器重定向,顯示支付成功,不要修改訂單狀態 服務器點對點,修改訂單狀態,回覆success 12銷售榜單導出功能 得到商品銷售狀況,須要查詢orderitem表 ------- 統計已支付訂單項內容 1) 榜單中存在哪些信息?(已支付訂單中商品) 商品信息 products表 銷售數量 orderitem表 訂單支付狀況 orders表 select * from products,orderitem,orders where products.id = orderitem.product_id and orderitem.order_id = orders.id ; 進行商品分組查詢 group by select products.* , sum(orderitem.buynum) totalSaleNum from products,orderitem,orders where products.id = orderitem.product_id and orderitem.order_id = orders.id and orders.paystate = 1 group by products.id order by totalSaleNum desc; 2) 榜單文件是什麼格式? 導出Excel 使用 POI類庫 csv 格式文件 , 逗號分隔文件 1) 信息當中有,在兩端加 雙引號 2) 信息當中有" 在以前加雙引號 轉義 文件下載 設置Content-Type、Content-Disposition 頭信息 文件流輸出 (輸出文件內容) Excel 默認讀取字符集gbk
相關文章
相關標籤/搜索