JSTL + JSP + Servlet + JavaBean + BeanUtils + FileUpload + JavaMail + DBUtils(JDBC) + C3P0 + MySQL + MyEclipse10+ Tomcat7.0 + JDK6 + Windowsjavascript
MVC 模式css
JavaEE 三層結構 web層 service層 dao層java
DAO 模式node
系統存在如下實體:用戶、商品、訂單、購物車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 "%r" %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