您好,登錄后才能下訂單哦!
分析需要的功能:
01.用戶注冊(發送激活郵件/JS前臺實現數據校驗/驗證碼)
02.用戶激活
03.用戶登錄(記住用戶名/30天內自動登陸)
04.用戶注銷
05.添加商品(文件上傳)
06.查看商品列表
07.查看商品詳情
08.加入購物車(Cookie *session 數據庫)
09.增刪改查購物車
10.生成訂單(多表設計)
11.訂單查詢(多表查詢)
12.訂單刪除(事務管理/注解+本地線程+動態代理實現事務管理,AOP--面向切面編程)
13.在線支付(體驗調用第三方接口實現特定功能)
14.銷售榜單下載(利用程序生成excel數據/文件下載)
全站亂碼過濾器
自動登錄過濾器
1.只有未登錄的用戶才能自動登錄,2,只有帶了自動登錄cookie的用戶才能自動登錄,3.自動登錄cookie的用戶名密碼正確才能自動登錄4.放行資源
1. 用戶:id 用戶名 密碼 昵稱 郵箱 激活狀態 激活碼 角色 注冊時間
2. 商品:id 商品名稱 商品種類 商品庫存數量 商品單價 圖片url 描述信息
3. 訂單:id 下單時間 收貨地址 支付狀態 訂單金額 用戶編號(外鍵)
4. 訂單項: 訂單id 商品id 購買數量
用戶 1 -- * 訂單 (1個用戶可以有多個訂單 1對多)
商品 * -- *訂單 (1個訂單有多種商品,1種商品被多個訂單購買。 訂單項表保存商品與訂單的多對多的關系)
create database estore;
用戶:create user estore identified by 'estore';
授權:grant all on estore.* to estore;
use estore;
1. 用戶:id 用戶名 密碼 昵稱 郵箱 角色 激活狀態 激活碼 注冊時間
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)
);
3. 訂單:id 訂單金額 收貨地址 支付狀態 下單時間 用戶編號(外鍵)
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)
);
javaee經典三層架構+工廠類實現解耦
包結構:
com.itheima.web
.service
.dao
.util
.domian
.factory
.exception
.test
.filter
.listener
導入第三方jar包
*junit 測試
*JSTL 標準標簽庫//myeclise部署到tomcat的時候,自動把Javaee5的jar包發到webapp應用的lib目錄下了,如果不發布,則自己導入jstl的jar包
beanutils
mysql驅動
c3p0
dbutils
commns-fileupload
配置文件
c3p0-config.xml
config.properties
在tomcat/conf/server.xml中配置
<Host name="www.estore.com" appBase="E:\resource\resource\20140105\Estore">
<Context path="" docBase="E:\resource\resource\20140105\Estore\WebRoot" />
</Host>
在系統-hosts文件中配置C:\Windows\System32\drivers\etc\hosts
127.0.0.1www.estore.com
工廠類實現解耦:1.寫接口 2.配置文件配置 3.工廠類提供方法基于配置文件生成對象
全站亂碼解決
~權限控制
javabean
工具類
1.用戶注冊
index.jsp -- 如果用戶沒有登錄,則提示 歡迎光臨游客 注冊 登錄 如果用戶已經登錄 提示 歡迎回來xxx,注銷
regist.jsp -- 提供注冊表單 (驗證碼/js實現表單校驗)
RegistServlet -- 校驗驗證碼 封裝數據校驗數據 調用Service注冊用戶 重定向到主頁
UserService -- 注冊用戶 檢驗用戶名是否已經存在 如果存在則提示 如果不存在則調用dao中添加用戶的方法添加用戶 發送激活郵件
UserDao -- 添加客戶方法
2.用戶激活:用戶點擊郵箱中的激活鏈接時觸發此Servlet
ActiveServlet:獲取請求參數中的激活碼,調用Service中激活用戶的方法,回到主頁
UserSerivce: 激活用戶 調用dao根據激活碼查找用戶 如果找不到用戶提示激活碼無效 如果用戶已經激活過,則提示不要重復激活 檢查如果激活碼已經超時(24小時)則提示激活碼超時要求重新注冊此時應該刪除此用戶記錄
UserDao: 根據激活碼查找用戶 根據用戶id刪除用戶的方法
3.用戶登錄(記住用戶名 30天內自動登陸)
index.jsp -- 如果用戶沒有登錄,則提示 歡迎光臨游客 注冊 登錄 如果用戶已經登錄 提示 歡迎回來xxx,注銷
login.jsp -- 提供用戶登錄表單輸入用戶名密碼
LoginServlet -- 1.獲取用戶名密碼,2.調用Service中根據用戶名密碼查找用戶的方法 3.檢查用戶的激活狀態,如果沒有激活則提示 4.登錄用戶重定向到主頁
UserService -- 提供根據用戶名 密碼查找用戶的方法 調用dao中對應方法
UserDao -- 提供根據用戶名密碼查找用戶的方法
4.用戶注銷
LogoutServlet
5.添加商品(文件上傳)
index.jsp -- 提供 添加商品addProd.jsp
addProd.jsp -- 提供添加商品的表單,這個表單應該是文件上傳的表單,其中允許上傳商品圖片
AddProdServlet -- 1.實現文件上傳,2.將商品的圖片上傳到服務器中.3.并且向數據庫的商品表中增加一條記錄
Service -- 添加商品
Dao -- 添加商品信息的方法
6.商品列表
index.jsp -- 提供商品列表
ProdListServlet -- 調用Service中查詢所有商品的方法,查到后存入request域帶到頁面展示
prodList.jsp -- 從request域中拿出所有的商品做展示,
利用ImgServlet展示商品的圖片
1.根據id查出商品,2.獲取商品的url,輸出圖片
7.查看商品詳情
在商品列表頁面中點擊圖片時,查看商品的詳情
ProdInfoServlet 根據商品id查詢商品信息,帶到頁面顯示
ProdService 提供根據id查詢商品的方法
ProdDao 提供根據id查詢商品的方法
prodInfo.jsp頁面展示
8.加入購物車
在商品詳細信息頁面中點擊加入購物車,將商品加入購物車
設置session監聽器,在Session創建時,就將cartmap(product,Iteger)加入到session中
AddCartServlet --
根據id查找商品,存入購物車map,如果購物車map中還不存在這個商品,則存入,數量為1,如果已經存在則在原有數量上+1。
商品bean對象需要根據商品id判斷是否為同一個商品,bean中的hashcode,equals方法需要根據id重新生成
cart.jsp -- 遍歷購物車map,遍歷cartmap顯示當前用戶所有的購物車信息
9.刪除購物車
在購物車頁面,中點擊刪除時,觸發
DelCartServlet,根據id找到要刪除的商品后,從購物車map中刪除
10.修改購買數量
在購物車頁面,修改購物數量時觸發,利用js控制輸入的數字必須正整數
ChangeCartServlet,根據id找到要刪除的商品后,修改購物車中商品的數量
11.清空購物車
ClearCartServlet
找到購物車map,清空map
12.生成訂單--事務管理
在購物車中,當購物完成后,用戶點擊 生成訂單
訪問一個addOrder.jsp -- 列出訂單的基本信息,要求用戶輸入收貨地址和支付方式
AddOrderServlet -- 創建Order對象設置基本值,其中Money需要在后臺根據購物車實時計算出來 調用OrderService中生成訂單的方法生成訂單, 清空購物車 回到主頁OrderService -- 中生成訂單的方法,需要進行TransactionManager事務管理--AOP在工廠類中修改service對象的方法+注解
1.在訂單表中插入一條記錄
2.在訂單項表中插入記錄保存此訂單和商品之間的關系
3.從商品表中的庫存數量中扣除購買數量
OrderDao -- 增加訂單的方法 增加訂單項的方法
ProductDao -- 增加扣除商品數量的方法
可以通過預編譯方式和運行期動態代理實現在不修改源代碼的情況下給程序動態統一添加功能的一種技術。AOP實際是GoF設計模式的延續,設計模式孜孜不倦追求的是調用者和被調用者之間的解耦,提高代碼的靈活性和可擴展性,AOP可以說也是這種目標的一種實現。
主要功能
日志記錄,性能統計,安全控制,事務處理,異常處理等等
主要意圖
將日志記錄,性能統計,安全控制,事務處理,異常處理等代碼從業務邏輯代碼中劃分出來,通過對這些行為的分離,我們希望可以將它們獨立到非指導業務邏輯的方法中,進而改變這些行為的時候不影響業務邏輯的代碼。
面向切面編程案例--事務管理
注釋--給人看的提示信息就叫做注釋 // /**/ /** */
注解--給程序看的提示信息就叫做注解 @xxxxx(...)
java中提供的原生的注解:
@Override: 限定重寫父類方法, 該注解只能用于方法
@Deprecated: 用于表示某個程序元素(類, 方法等)已過時
@SuppressWarnings: 抑制編譯器警告.
@interface 定義一個注解
定義出來的注解可以被元注解修飾,確定其基本的特性:
@Retention: 只能用于修飾一個 Annotation 定義, 用于指定該 Annotation 可以保留的域
RetentionPolicy.SOURCE: 編譯器直接丟棄這種策略的注釋
RetentionPolicy.CLASS: 編譯器將把注解記錄在 class 文件中. 當運行 Java 程序時, JVM 不會保留注解. 這是默認值
RetentionPolicy.RUNTIME:編譯器將把注釋記錄在 class 文件中. 當運行 Java 程序時, JVM 會保留注解. 程序可以通過反射獲取該注釋
@Target:指定注解用于修飾類的哪個成員
@Documented: 用于指定被該元 Annotation 修飾的 Annotation 類將被 javadoc 工具提取成文檔.
@Inherited: 被它修飾的 Annotation 將具有繼承性.如果某個類使用了被 @Inherited 修飾的 Annotation, 則其子類將自動具有該注解
屬性的定義類似于在接口中定義一個方法
String name();
String addr() default "xxx";
如果注解中只有一個屬性并且名字為value,則在定義注解時可以直接寫值而省略value= 部分
反射注解:
通過反射注解,來確定某個類方法屬性上是否有注解從而控制程序的流轉.
--希望在Service和dao中都不用操心事務,是否管理事務只需要在Service接口中的方法上寫或不寫 @Tran就可以控制了
ThreadLocal + 注解 實現事務管理
工廠類+動態代理 實現面向切面編程
利用動態代理,使dao中不需要區分是否開啟過事務
13.訂單查詢
--存在bug,生成訂單之后,直接點擊查詢訂單報錯You can't operate on a closed Connection!!!將訂單查詢的方法放在事務當中,就沒有了bug.
在index.jsp主頁中 提供 訂單查詢
OrderListServlet 獲取當前客戶的用戶號,調用Service中查詢指定用戶訂單的方法,查詢出這個用戶所有訂單,存入request域,帶到頁面顯示
OrderService 提供根據用戶id查詢訂單的方法
OrderDao 提供根據用戶id查詢訂單的方法
orderList.jsp 展示所有訂單
訂單號 ok
用戶名稱 --- 用戶表中查
訂單金額 ok
支付狀態 ok
收貨地址 ok
下單時間 ok
------------------------------------------------------
商品名稱 購買數量 單價 總金額 --------------------------------訂單項 表 商品表
------------------------------------------------------
海爾冰箱1 999 999
美的筆記本1 888 888
....
...
------------------------------------------------------
14.訂單刪除
在訂單列表 對于未支付的訂單 提供 訂單刪除
DelOrderServlet 獲取訂單id 調用service中根據訂單id刪除訂單的方法,刪除后再重新回到訂單列表頁面
OrderService 提供根據訂單id刪除訂單的方法 將訂單相關商品的庫存數量加回去 刪除訂單項表中的記錄 刪除訂單記錄 -- 事務控制
OrderDao中提供根據訂單編號刪除訂單項和 訂單的方法
ProdDao中提供修改庫存數量的方法
刪除步驟:
1.prodao.addPnum(product_id,buynum)
2.orderdao.delOrderItemByOrederId(order_id)
3.orderdao.delOrderById(order_id)
15.在線支付
(在真正的開發中,一些功能可能不是我們自己開發的,而是調用第三方接口來實現)
在訂單列表頁面 對于未支付的訂單 提供 在線支付
pay.jsp 頁面中選擇要支付的銀行
PayServlet 準備訪問易寶所需要的所有的參數,將這些參數保存到request域中,再轉發到confirm.jsp頁面
confirm.jsp 將request域中的所有訪問易寶的參數取出,組織表單 提交到易寶
CallBackServlet處理支付完成后的回調
16.銷售榜單下載:
管理員可能需要查看商品銷售的數據--
多表查詢
csv格式的文件 poi技術
文件下載
index.jsp中提供銷售榜單下載連接
SaleListServlet 調用Service中查詢銷售榜單的方法 將查詢到的銷售榜單組織成csv格式的文件后提供下載
OrderService 查詢銷售榜單
OrderDao 查詢銷售榜單:查詢所有已支付訂單找對應的訂單項信息找到銷售出去的商品,做一個銷售數量的sum()操作
select products.id prod_id,products.name prod_name,sum(orderitem.buynum ) sale_num
from orders ,orderitem ,products
where
orders.id=orderitem.order_id
and
orderitem.product_id=products.id
and
orders.paystate = 1
group by products.id
order by sale_num desc;
商品編號 商品名稱 總銷售數量
1 xxx100
2 yyy10
17.權限控制
web.xml中,權限控制的過濾器的映射關系在自動登錄過濾器之后
WEB-INF文件夾下admin.txt文件規定只允許管理員訪問的uri
/addProd.jsp 添加商品
/AddprodServlet
/SaleListServlet 銷售榜單下載
WEB-INF文件夾下user.txt文件規定只允許普通用戶訪問的uri
/addOrder.jsp生成訂單
/cart.jsp顯示購物車
/confirm.jsp在線支付-確認支付
/orderList.jsp顯示訂單列表
/pay.jsp在線支付-支付頁面
/AddCartServlet添加購物車
/ChangeCartServlet修改購物車
/ClearCartServlet清空購物車
/DelCartServlet刪除購物車中的選項
/DelOrderServlet刪除訂單
/OrderListServlet訂單列表
/PayServlet在線支付
PrivilegeFilter implements Filter
init
讀取上面兩個文件,類變量中保存2個list,存儲從文件讀到的uri。
doFilter
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
String uri = req.getRequestURI();
1.管理員和普通用戶都可以訪問的資源,直接放行(登錄,注冊,主頁,注銷,商品列表)
判斷用戶是否登錄
2.只允許管理員訪問的資源,
3.只允許用戶訪問的資源
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。