兩天搞定一個項目 Java Web MVC 網絡商城教程+源代碼
最近自學做了一個網絡商城將以下是代碼和教程
環境搭建–數據庫設計–頁面設計—後臺設計
本項目使用的jdk版本是
運行項目前需要先配置好mysql和Redis,mysql的SQL語句下面有原碼,Redis需要自己建立連接
Redis的配置流程在Java Web 網絡商城案例演示八(首頁分類查詢)當中有
源代碼下載 | 下載 |
---|---|
Java Web 網絡商城案例演示一、(環境搭建) | 跳轉 |
Java Web 網絡商城案例演示二、(jsp頁面搭建) | 跳轉 |
Java Web 網絡商城案例演示三、(註冊頁面功能實現) | 跳轉 |
Java Web 網絡商城案例演示四、(向郵箱發送信息功能的實現)郵箱服務器的搭建,java Web發送郵件 | 跳轉 |
Java Web 網絡商城案例演示五(用戶激活) | 跳轉 |
Java Web 網絡商城案例演示六(用戶,登錄,退出) | 跳轉 |
Java Web 網絡商城案例演示七(自動登錄,記住用戶名,抽取公共頁面) | 跳轉 |
Java Web 網絡商城案例演示八(首頁分類查詢) | 跳轉 |
Java Web 網絡商城案例演示九(首頁熱門商品和最新商品顯示) | 跳轉 |
Java Web 網絡商城案例演示十(商品詳情) | 跳轉 |
Java Web 網絡商城案例演示十一(商品分頁) | 跳轉 |
Java Web 網絡商城案例演示十二(查詢類別下的商品信息) | 跳轉 |
Java Web 網絡商城案例演示十三(抽取購物車模塊,實現購物車功能) | 跳轉 |
Java Web 網絡商城案例演示十四(設計訂單表) | 跳轉 |
Java Web 網絡商城案例演示十五 訂單詳情功能(提交訂單支付界面) | 跳轉 |
Java Web 網絡商城案例演示十六 訂單詳情功能(支付功能的實現使用易付寶) | 跳轉 |
Java Web 網絡商城案例演示十七 權限過濾器 | 跳轉 |
Java Web 網絡商城案例演示十八 關於HTML frameset 框架的使用 和dtree組件 | 跳轉 |
Java Web 網絡商城案例演示十九 管理員(查詢全部分類信息,添加分類信息,刪除分類信息) | 跳轉 |
Java Web 網絡商城案例演示二十 管理員 查詢全部商品信息 上傳商品信息 添加商品 | 跳轉 |
Java Web 網絡商城案例演示二十一 利用工廠模式解耦(適用於不同數據庫的配置) | 跳轉 |
Java Web 網絡商城案例演示二十二 管理員查詢訂單 | 跳轉 |
Java Web 網絡商城案例演示二十三 管理員界面異步顯示訂單詳情 修改訂單狀態 | 跳轉 |
一、數據庫建立
分析以及創建數據庫
-- 創建數據庫
drop database if exists `store_40`;
create database `store_40`;
-- 使用數據庫
use store_40;
-- 1.1 創建用戶表
CREATE TABLE `user` (
`uid` varchar(32) NOT NULL, #用戶編號
`username` varchar(20) DEFAULT NULL, #用戶名
`password` varchar(20) DEFAULT NULL, #密碼
`name` varchar(20) DEFAULT NULL, #暱稱
`email` varchar(30) DEFAULT NULL, #電子郵箱
`telephone` varchar(20) DEFAULT NULL, #電話
`birthday` date DEFAULT NULL, #生日
`sex` varchar(10) DEFAULT NULL, #性別
`state` int(11) DEFAULT 0, #狀態:0=未激活,1=已激活
`code` varchar(64) DEFAULT NULL, #激活碼
PRIMARY KEY (`uid`)
) ;
-- 1.2 初始化用戶默認數據
INSERT INTO `user` VALUES ('373eb242933b4f5ca3bd43503c34668b','ccc','ccc','aaa','[email protected]','15723689921','2015-11-04','男',0,'9782f3e837ff422b9aee8b6381ccf927bdd9d2ced10d48f4ba4b9f187edf7738'),('3ca76a75e4f64db2bacd0974acc7c897','bb','bb','張三','[email protected]','15723689921','1990-02-01','男',0,'1258e96181a9457987928954825189000bae305094a042d6bd9d2d35674684e6'),('62145f6e66ea4f5cbe7b6f6b954917d3','cc','cc','張三','[email protected]','15723689921','2015-11-03','男',0,'19f100aa81184c03951c4b840a725b6a98097aa1106a4a38ba1c29f1a496c231'),('c95b15a864334adab3d5bb6604c6e1fc','bbb','bbb','老王','[email protected]','15712344823','2000-02-01','男',0,'71a3a933353347a4bcacff699e6baa9c950a02f6b84e4f6fb8404ca06febfd6f'),('f55b7d3a352a4f0782c910b2c70f1ea4','aaa','aaa','小王','[email protected]','15712344823','2000-02-01','男',1,NULL);
-- 2.1 創建分類表
CREATE TABLE `category` (
`cid` varchar(32) NOT NULL,
`cname` varchar(20) DEFAULT NULL, #分類名稱
PRIMARY KEY (`cid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 2.2 初始化分類默認數據
INSERT INTO `category` VALUES ('1','手機數碼'),('172934bd636d485c98fd2d3d9cccd409','運動戶外'),('2','電腦辦公'),('3','傢俱家居'),('4','鞋靴箱包'),('5','圖書音像'),('59f56ba6ccb84cb591c66298766b83b5','aaaa'),('6','母嬰孕嬰'),('afdba41a139b4320a74904485bdb7719','汽車用品');
-- 3.1 創建商品表
CREATE TABLE `product` (
`pid` varchar(32) NOT NULL,
`pname` varchar(50) DEFAULT NULL, #商品名稱
`market_price` double DEFAULT NULL, #市場價
`shop_price` double DEFAULT NULL, #商城價
`pimage` varchar(200) DEFAULT NULL, #商品圖片路徑
`pdate` date DEFAULT NULL, #上架時間
`is_hot` int(11) DEFAULT NULL, #是否熱門:0=不熱門,1=熱門
`pdesc` varchar(255) DEFAULT NULL, #商品描述
`pflag` int(11) DEFAULT 0, #商品標記:0=未下架(默認值),1=已經下架
`cid` varchar(32) DEFAULT NULL, #分類id
PRIMARY KEY (`pid`),
KEY `product_fk_0001` (`cid`),
CONSTRAINT `product_fk_0001` FOREIGN KEY (`cid`) REFERENCES `category` (`cid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 3.2 初始化商品默認數據
INSERT INTO `product` VALUES ('1','適用小米note m4小米4c小米3手機屏幕總成寄修維修單獨換外屏觸摸',1399,1299,'products/1/c_0001.jpg','2015-11-02',1,'小米 4c 標準版 全網通 白色 移動聯通電信4G手機 雙卡雙待',0,'1'),('10','華爲 Ascend Mate7',2699,2599,'products/1/c_0010.jpg','2015-11-02',1,'華爲 Ascend Mate7 月光銀 移動4G手機 雙卡雙待雙通6英寸高清大屏,纖薄機身,智能超八核,按壓式指紋識別!!選擇下方“移動老用戶4G飛享合約”,無需換號,還有話費每月返還!',0,'1'),('11','vivo X5Pro',2399,2298,'products/1/c_0014.jpg','2015-11-02',1,'移動聯通雙4G手機 3G運存版 極光白【購機送藍牙耳機+藍牙自拍杆】新升級3G運行內存·雙2.5D弧面玻璃·眼球識別技術',0,'1'),('12','努比亞(nubia)My 布拉格',1899,1799,'products/1/c_0013.jpg','2015-11-02',0,'努比亞(nubia)My 布拉格 銀白 移動聯通4G手機 雙卡雙待【嗨11,下單立減100】金屬機身,快速充電!布拉格相機全新體驗!',0,'1'),('13','華爲 麥芒4',2599,2499,'products/1/c_0012.jpg','2015-11-02',1,'華爲 麥芒4 晨曦金 全網通版4G手機 雙卡雙待金屬機身 2.5D弧面屏 指紋解鎖 光學防抖',0,'1'),('14','vivo X5M',1899,1799,'products/1/c_0011.jpg','2015-11-02',0,'vivo X5M 移動4G手機 雙卡雙待 香檳金【購機送藍牙耳機+藍牙自拍杆】5.0英寸大屏顯示·八核雙卡雙待·Hi-Fi移動KTV',0,'1'),('15','Apple iPhone 6 (A1586)',4399,4288,'products/1/c_0015.jpg','2015-11-02',1,'Apple iPhone 6 (A1586) 16GB 金色 移動聯通電信4G手機長期省纔是真的省!點擊購機送費版,月月送話費,月月享優惠,暢享4G網絡,就在聯通4G!',0,'1'),('16','華爲 HUAWEI Mate S 臻享版',4200,4087,'products/1/c_0016.jpg','2015-11-03',0,'華爲 HUAWEI Mate S 臻享版 手機 極晝金 移動聯通雙4G(高配)滿星評價即返30元話費啦;買就送電源+清水套+創意手機支架;優雅弧屏,mate7升級版',0,'1'),('17','索尼(SONY) E6533 Z3+',4099,3999,'products/1/c_0017.jpg','2015-11-02',0,'索尼(SONY) E6533 Z3+ 雙卡雙4G手機 防水防塵 澗湖綠索尼z3專業防水 2070萬像素 移動聯通雙4G',0,'1'),('18','HTC One M9+',3599,3499,'products/1/c_0018.jpg','2015-11-02',0,'HTC One M9+(M9pw) 金銀匯 移動聯通雙4G手機5.2英寸,8核CPU,指紋識別,UltraPixel超像素前置相機+2000萬/200萬後置雙鏡頭相機!降價特賣,驚喜不斷!',0,'1'),('19','HTC Desire 826d 32G 臻珠白',1599,1469,'products/1/c_0020.jpg','2015-11-02',1,'後置1300萬+UltraPixel超像素前置攝像頭+【雙】前置揚聲器+5.5英寸【1080p】大屏!',0,'1'),('2','中興 AXON',2899,2699,'products/1/c_0002.jpg','2015-11-05',1,'中興 AXON 天機 mini 壓力屏版 B2015 華爾金 移動聯通電信4G 雙卡雙待',0,'1'),('20','小米 紅米2A 增強版 白色',649,549,'products/1/c_0019.jpg','2015-11-02',0,'新增至2GB 內存+16GB容量!4G雙卡雙待,聯芯 4 核 1.5GHz 處理器!',0,'1'),('21','魅族 魅藍note2 16GB 白色',1099,999,'products/1/c_0021.jpg','2015-11-02',0,'現貨速搶,搶完即止!5.5英寸1080P分辨率屏幕,64位八核1.3GHz處理器,1300萬像素攝像頭,雙色溫雙閃光燈!',0,'1'),('22','三星 Galaxy S5 (G9008W) 閃耀白',2099,1999,'products/1/c_0022.jpg','2015-11-02',1,'5.1英寸全高清炫麗屏,2.5GHz四核處理器,1600萬像素',0,'1'),('23','sonim XP7700 4G手機',1799,1699,'products/1/c_0023.jpg','2015-11-09',1,'三防智能手機 移動/聯通雙4G 安全 黑黃色 雙4G美國軍工IP69 30天長待機 3米防水防摔 北斗',0,'1'),('24','努比亞(nubia)Z9精英版 金色',3988,3888,'products/1/c_0024.jpg','2015-11-02',1,'移動聯通電信4G手機 雙卡雙待真正的無邊框!金色尊貴版!4GB+64GB大內存!',0,'1'),('25','Apple iPhone 6 Plus (A1524) 16GB 金色',5188,4988,'products/1/c_0025.jpg','2015-11-02',0,'Apple iPhone 6 Plus (A1524) 16GB 金色 移動聯通電信4G手機 硬貨 硬實力',0,'1'),('26','Apple iPhone 6s (A1700) 64G 玫瑰金色',6388,6088,'products/1/c_0026.jpg','2015-11-02',0,'Apple iPhone 6 Plus (A1524) 16GB 金色 移動聯通電信4G手機 硬貨 硬實力',0,'1'),('27','三星 Galaxy Note5(N9200)32G版',5588,5388,'products/1/c_0027.jpg','2015-11-02',0,'旗艦機型!5.7英寸大屏,4+32G內存!不一樣的SPen更優化的浮窗指令!贈無線充電板!',0,'1'),('28','三星 Galaxy S6 Edge+(G9280)32G版 鉑光金',5999,5888,'products/1/c_0028.jpg','2015-11-02',0,'贈移動電源+自拍杆+三星OTG金屬U盤+無線充電器+透明保護殼',0,'1'),('29','LG G4(H818)陶瓷白 國際版',3018,2978,'products/1/c_0029.jpg','2015-11-02',0,'李敏鎬代言,F1.8大光圈1600萬後置攝像頭,5.5英寸2K屏,3G+32G內存,LG年度旗艦機!',0,'1'),('3','華爲榮耀6',1599,1499,'products/1/c_0003.jpg','2015-11-02',0,'榮耀 6 (H60-L01) 3GB內存標準版 黑色 移動4G手機',0,'1'),('30','微軟(Microsoft) Lumia 640 LTE DS (RM-1113)',1099,999,'products/1/c_0030.jpg','2015-11-02',0,'微軟首款雙網雙卡雙4G手機,5.0英寸高清大屏,雙網雙卡雙4G!',0,'1'),('31','宏碁(acer)ATC705-N50 臺式電腦',2399,2299,'products/1/c_0031.jpg','2015-11-02',0,'爆款直降,滿千減百,品質宏碁,特惠來襲,何必苦等11.11,早買早便宜!',0,'2'),('32','Apple MacBook Air MJVE2CH/A 13.3英寸',6788,6688,'products/1/c_0032.jpg','2015-11-02',0,'寬屏筆記本電腦 128GB 閃存',0,'2'),('33','聯想(ThinkPad) 輕薄系列E450C(20EH0001CD)',4399,4199,'products/1/c_0033.jpg','2015-11-02',0,'聯想(ThinkPad) 輕薄系列E450C(20EH0001CD)14英寸筆記本電腦(i5-4210U 4G 500G 2G獨顯 Win8.1)',0,'2'),('34','聯想(Lenovo)小新V3000經典版',4599,4499,'products/1/c_0034.jpg','2015-11-02',0,'14英寸超薄筆記本電腦(i7-5500U 4G 500G+8G SSHD 2G獨顯 全高清屏)黑色滿1000減100,狂減!火力全開,橫掃3天!',0,'2'),('35','華碩(ASUS)經典系列R557LI',3799,3699,'products/1/c_0035.jpg','2015-11-02',0,'15.6英寸筆記本電腦(i5-5200U 4G 7200轉500G 2G獨顯 D刻 藍牙 Win8.1 黑色)',0,'2'),('36','華碩(ASUS)X450J',4599,4399,'products/1/c_0036.jpg','2015-11-02',0,'14英寸筆記本電腦 (i5-4200H 4G 1TB GT940M 2G獨顯 藍牙4.0 D刻 Win8.1 黑色)',0,'2'),('37','戴爾(DELL)靈越 飛匣3000系列',3399,3299,'products/1/c_0037.jpg','2015-11-03',0,' Ins14C-4528B 14英寸筆記本(i5-5200U 4G 500G GT820M 2G獨顯 Win8)黑',0,'2'),('38','惠普(HP)WASD 暗影精靈',5699,5499,'products/1/c_0038.jpg','2015-11-02',0,'15.6英寸遊戲筆記本電腦(i5-6300HQ 4G 1TB+128G SSD GTX950M 4G獨顯 Win10)',0,'2'),('39','Apple 配備 Retina 顯示屏的 MacBook',11299,10288,'products/1/c_0039.jpg','2015-11-02',0,'Pro MF840CH/A 13.3英寸寬屏筆記本電腦 256GB 閃存',0,'2'),('4','聯想 P1',2199,1999,'products/1/c_0004.jpg','2015-11-02',0,'聯想 P1 16G 伯爵金 移動聯通4G手機充電5分鐘,通話3小時!科技源於超越!品質源於沉澱!5000mAh大電池!高端商務佳配!',0,'1'),('40','機械革命(MECHREVO)MR X6S-M',6799,6599,'products/1/c_0040.jpg','2015-11-02',0,'15.6英寸遊戲本(I7-4710MQ 8G 64GSSD+1T GTX960M 2G獨顯 IPS屏 WIN7)黑色',0,'2'),('41','神舟(HASEE) 戰神K660D-i7D2',5699,5499,'products/1/c_0041.jpg','2015-11-02',0,'15.6英寸遊戲本(i7-4710MQ 8G 1TB GTX960M 2G獨顯 1080P)黑色',0,'2'),('42','微星(MSI)GE62 2QC-264XCN',6199,5999,'products/1/c_0042.jpg','2015-11-02',0,'15.6英寸遊戲筆記本電腦(i5-4210H 8G 1T GTX960MG DDR5 2G 背光鍵盤)黑色',0,'2'),('43','雷神(ThundeRobot)G150S',5699,5499,'products/1/c_0043.jpg','2015-11-02',0,'15.6英寸遊戲本 ( i7-4710MQ 4G 500G GTX950M 2G獨顯 包無亮點全高清屏) 金',0,'2'),('44','惠普(HP)輕薄系列 HP',3199,3099,'products/1/c_0044.jpg','2015-11-02',0,'15-r239TX 15.6英寸筆記本電腦(i5-5200U 4G 500G GT820M 2G獨顯 win8.1)金屬灰',0,'2'),('45','未來人類(Terrans Force)T5',10999,9899,'products/1/c_0045.jpg','2015-11-02',0,'15.6英寸遊戲本(i7-5700HQ 16G 120G固態+1TB GTX970M 3G GDDR5獨顯)黑',0,'2'),('46','戴爾(DELL)Vostro 3800-R6308 臺式電腦',3299,3199,'products/1/c_0046.jpg','2015-11-02',0,'(i3-4170 4G 500G DVD 三年上門服務 Win7)黑',0,'2'),('47','聯想(Lenovo)H3050 臺式電腦',5099,4899,'products/1/c_0047.jpg','2015-11-11',0,'(i5-4460 4G 500G GT720 1G獨顯 DVD 千兆網卡 Win10)23英寸',0,'2'),('48','Apple iPad mini 2 ME279CH/A',2088,1888,'products/1/c_0048.jpg','2015-11-02',0,'(配備 Retina 顯示屏 7.9英寸 16G WLAN 機型 銀色)',0,'2'),('49','小米(MI)7.9英寸平板',1399,1299,'products/1/c_0049.jpg','2015-11-02',0,'WIFI 64GB(NVIDIA Tegra K1 2.2GHz 2G 64G 2048*1536視網膜屏 800W)白色',0,'2'),('5','摩托羅拉 moto x(x+1)',1799,1699,'products/1/c_0005.jpg','2015-11-01',0,'摩托羅拉 moto x(x+1)(XT1085) 32GB 天然竹 全網通4G手機11月11天!MOTO X震撼特惠來襲!1699元!帶你玩轉黑科技!天然材質,原生流暢系統!',0,'1'),('50','Apple iPad Air 2 MGLW2CH/A',2399,2299,'products/1/c_0050.jpg','2015-11-12',0,'(9.7英寸 16G WLAN 機型 銀色)',0,'2'),('6','魅族 MX5 16GB 銀黑色',1899,1799,'products/1/c_0006.jpg','2015-11-02',0,'魅族 MX5 16GB 銀黑色 移動聯通雙4G手機 雙卡雙待送原廠鋼化膜+保護殼+耳機!5.5英寸大屏幕,3G運行內存,2070萬+500萬像素攝像頭!長期省纔是真的省!',0,'1'),('7','三星 Galaxy On7',1499,1398,'products/1/c_0007.jpg','2015-11-14',0,'三星 Galaxy On7(G6000)昂小七 金色 全網通4G手機 雙卡雙待新品火爆搶購中!京東尊享千元良機!5.5英寸高清大屏!1300+500W像素!評價贏30元話費券!',0,'1'),('8','NUU NU5',1288,1190,'products/1/c_0008.jpg','2015-11-02',0,'NUU NU5 16GB 移動聯通雙4G智能手機 雙卡雙待 曬單有禮 晨光金香港品牌 2.5D弧度前後鋼化玻璃 隨機附贈手機套+鋼化貼膜 曬單送移動電源+藍牙耳機',0,'1'),('9','樂視(Letv)樂1pro(X800)',2399,2299,'products/1/c_0009.jpg','2015-11-02',0,'樂視(Letv)樂1pro(X800)64GB 金色 移動聯通4G手機 雙卡雙待樂視生態UI+5.5英寸2K屏+高通8核處理器+4GB運行內存+64GB存儲+1300萬攝像頭!',0,'1');
-- 4 創建訂單表
CREATE TABLE `orders` (
`oid` varchar(32) NOT NULL,
`ordertime` datetime DEFAULT NULL, #下單時間
`total` double DEFAULT NULL, #總價
`state` int(11) DEFAULT NULL, #訂單狀態:1=未付款;2=已付款,未發貨;3=已發貨,沒收貨;4=收貨,訂單結束
`address` varchar(30) DEFAULT NULL, #收穫地址
`name` varchar(20) DEFAULT NULL, #收穫人
`telephone` varchar(20) DEFAULT NULL, #收貨人電話
`uid` varchar(32) DEFAULT NULL,
PRIMARY KEY (`oid`),
KEY `order_fk_0001` (`uid`),
CONSTRAINT `order_fk_0001` FOREIGN KEY (`uid`) REFERENCES `user` (`uid`)
) ;
-- 5 創建訂單項表
CREATE TABLE `orderitem` (
`itemid` varchar(32) NOT NULL,
`quantity` int(11) DEFAULT NULL, #購買數量
`total` double DEFAULT NULL, #小計
`pid` varchar(32) DEFAULT NULL, #購買商品的id
`oid` varchar(32) DEFAULT NULL, #訂單項所在訂單id
PRIMARY KEY (`itemid`),
KEY `order_item_fk_0001` (`pid`),
KEY `order_item_fk_0002` (`oid`),
CONSTRAINT `order_item_fk_0001` FOREIGN KEY (`pid`) REFERENCES `product` (`pid`),
CONSTRAINT `order_item_fk_0002` FOREIGN KEY (`oid`) REFERENCES `orders` (`oid`)
) ;
二、環境搭建
創建目錄結構
導入架包
3、工具類的構建
package cn.itzheng.store.utils;
import javax.servlet.http.Cookie;
public class CookUtils {
/**
* 通過名稱在cookie數組獲取指定的cookie
* @param name cookie名稱
* @param cookies cookie數組
* @return
*/
public static Cookie getCookieByName(String name, Cookie[] cookies) {
if(cookies!=null){
for (Cookie c : cookies) {
//通過名稱獲取
if(name.equals(c.getName())){
//返回
return c;
}
}
}
return null;
}
}
package cn.itzheng.store.utils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class JDBCUtils {
private static ComboPooledDataSource ds = new ComboPooledDataSource();
private static ThreadLocal<Connection> tl=new ThreadLocal<>();
/**
* 從線程中獲取連接
* @return
* @throws SQLException
*/
public static Connection getConnection() throws SQLException {
//從線程中獲取conneciton
Connection conn = tl.get();
if(conn==null){
conn=ds.getConnection();
//和當前線程綁定
tl.set(conn);
}
return conn;
}
// 獲取數據源
public static DataSource getDataSource() {
return ds;
}
// 釋放資源
public static void closeResource( Statement st, ResultSet rs) {
closeResultSet(rs);
closeStatement(st);
}
// 釋放資源
public static void closeResource(Connection conn, Statement st, ResultSet rs) {
closeResource(st, rs);
closeConn(conn);
}
// 釋放 connection
public static void closeConn(Connection conn) {
if (conn != null) {
try {
conn.close();
//和線程解綁
tl.remove();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
// 釋放 statement ctrl + shift + f 格式化代碼
public static void closeStatement(Statement st) {
if (st != null) {
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
st = null;
}
}
// 釋放結果集
public static void closeResultSet(ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
}
//開啓事務
public static void startTransaction() throws SQLException{
getConnection().setAutoCommit(false);
}
/**
* 事務提交且釋放連接
*/
public static void commitAndClose(){
Connection conn = null;
try {
conn=getConnection();
//事務提交
conn.commit();
//關閉資源
conn.close();
//解除版定
tl.remove();
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 事務回滾且釋放資源
*/
public static void rollbackAndClose(){
Connection conn = null;
try {
conn=getConnection();
//事務回滾
conn.rollback();
//關閉資源
conn.close();
//解除版定
tl.remove();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws SQLException {
System.out.println(getConnection().toString());
}
}
package cn.itzheng.store.utils;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;
public class MailUtils {
public static void sendMail(String email, String emailMsg)
throws AddressException, MessagingException {
// 1.創建一個程序與郵件服務器會話對象 Session
Properties props = new Properties();
//設置發送的協議
//props.setProperty("mail.transport.protocol", "SMTP");
//設置發送郵件的服務器
//props.setProperty("mail.host", "smtp.126.com");
//props.setProperty("mail.smtp.auth", "true");// 指定驗證爲true
// 創建驗證器
Authenticator auth = new Authenticator() {
public PasswordAuthentication getPasswordAuthentication() {
//設置發送人的帳號和密碼
return new PasswordAuthentication("admin", "[email protected]");
}
};
Session session = Session.getInstance(props, auth);
// 2.創建一個Message,它相當於是郵件內容
Message message = new MimeMessage(session);
//設置發送者
message.setFrom(new InternetAddress("[email protected]"));
//設置發送方式與接收者
message.setRecipient(RecipientType.TO, new InternetAddress(email));
//設置郵件主題
message.setSubject("用戶激活");
// message.setText("這是一封激活郵件,請<a href='#'>點擊</a>");
String url="http://localhost:8080/MyTomcat/UserServlet?method=active&code="+emailMsg;
String content="<h1>來自購物天堂的激活郵件!激活請點擊以下鏈接!</h1><h3><a href='"+url+"'>"+url+"</a></h3>";
//設置郵件內容
message.setContent(content, "text/html;charset=utf-8");
// 3.創建 Transport用於將郵件發送
Transport.send(message);
}
public static void main(String[] args) throws AddressException, MessagingException {
MailUtils.sendMail("[email protected]", "abcdefg");
}
}
package cn.itzheng.store.utils;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Utils {
/**
* 使用md5的算法進行加密
*/
public static String md5(String plainText) {
byte[] secretBytes = null;
try {
secretBytes = MessageDigest.getInstance("md5").digest(
plainText.getBytes());
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("沒有md5這個算法!");
}
String md5code = new BigInteger(1, secretBytes).toString(16);// 16進制數字
// 如果生成數字未滿32位,需要前面補0
for (int i = 0; i < 32 - md5code.length(); i++) {
md5code = "0" + md5code;
}
return md5code;
}
}
package cn.itzheng.store.utils;
import java.util.Map;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.converters.DateConverter;
public class MyBeanUtils {
public static void populate(Object obj, Map<String, String[]> map) {
try {
// 由於BeanUtils將字符串"1992-3-3"向user對象的setBithday();方法傳遞參數有問題,手動向BeanUtils註冊一個時間類型轉換器
// 1_創建時間類型的轉換器
DateConverter dt = new DateConverter();
// 2_設置轉換的格式
dt.setPattern("yyyy-MM-dd");
// 3_註冊轉換器
ConvertUtils.register(dt, java.util.Date.class);
BeanUtils.populate(obj, map);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static<T> T populate(Class<T> clazz, Map<String, String[]> map) {
try {
T obj=clazz.newInstance();
// 由於BeanUtils將字符串"1992-3-3"向user對象的setBithday();方法傳遞參數有問題,手動向BeanUtils註冊一個時間類型轉換器
// 1_創建時間類型的轉換器
DateConverter dt = new DateConverter();
// 2_設置轉換的格式
dt.setPattern("yyyy-MM-dd");
// 3_註冊轉換器
ConvertUtils.register(dt, java.util.Date.class);
BeanUtils.populate(obj, map);
return obj;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
package cn.itzheng.store.utils;
import java.util.UUID;
public class UploadUtils {
/**
* 獲取隨機名稱
* @param realName 真實名稱
* @return uuid
*/
public static String getUUIDName(String realName){
//realname 可能是 1.jpg 也可能是 1
//獲取後綴名
int index = realName.lastIndexOf(".");
if(index==-1){
return UUID.randomUUID().toString().replace("-", "").toUpperCase();
}else{
return UUID.randomUUID().toString().replace("-", "").toUpperCase()+realName.substring(index);
}
}
/**
* 獲取文件真實名稱
* @param name
* @return
*/
public static String getRealName(String name){
// c:/upload/1.jpg 1.jpg
//獲取最後一個"/"
int index = name.lastIndexOf("\\");
return name.substring(index+1);
}
/**
* 獲取文件目錄
* @param name 文件名稱
* @return 目錄
*/
public static String getDir(String name){
int i = name.hashCode();
String hex = Integer.toHexString(i);
int j=hex.length();
for(int k=0;k<8-j;k++){
hex="0"+hex;
}
return "/"+hex.charAt(0)+"/"+hex.charAt(1);
}
@SuppressWarnings("unused")
public static void main(String[] args) {
//String s="G:\\day17-基礎加強\\resource\\1.jpg";
String s="1.jgp";
String realName = getRealName(s);
//System.out.println(realName);
String uuidName = getUUIDName(realName);
//System.out.println(uuidName);
String dir = getDir(realName);
System.out.println(dir);
}
}
package cn.itzheng.store.utils;
import java.util.UUID;
public class UUIDUtils {
/**
* 隨機生成id
*
* @return
*/
public static String getId() {
return UUID.randomUUID().toString().replace("-", "").toUpperCase();
}
public static String getUUID64() {
return getId() + getId();
}
/**
* 生成隨機碼
*
* @return
*/
public static String getCode() {
return getId();
}
public static void main(String[] args) {
System.out.println(getId());
/*
* String str = UUID.randomUUID().toString(); System.out.println(str);
*/
}
}
c3p0配置文件
<c3p0-config>
<!-- 默認配置,如果沒有指定則使用這個配置 -->
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/store_40</property>
<property name="user">root</property>
<property name="password">root</property>
<property name="checkoutTimeout">30000</property>
<property name="idleConnectionTestPeriod">30</property>
<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
<property name="maxStatements">200</property>
<user-overrides user="test-user">
<property name="maxPoolSize">10</property>
<property name="minPoolSize">1</property>
<property name="maxStatements">0</property>
</user-overrides>
</default-config>
<!-- 命名的配置 -->
<named-config name="itzheng">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/store_40</property>
<property name="user">root</property>
<property name="password">root</property>
<!-- 如果池中數據連接不夠時一次增長多少個 -->
<property name="acquireIncrement">5</property>
<property name="initialPoolSize">20</property>
<property name="minPoolSize">10</property>
<property name="maxPoolSize">40</property>
<property name="maxStatements">0</property>
<property name="maxStatementsPerConnection">5</property>
</named-config>
</c3p0-config>
導入最後一個工具類解決編碼亂碼的問題,導入到filter
package cn.itzheng.store.web.filter;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Map;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
/**
* 統一編碼
* @author Administrator
*
*/
public class EncodingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
//1.強轉
HttpServletRequest request=(HttpServletRequest) req;
HttpServletResponse response=(HttpServletResponse) resp;
//System.out.println("@@@@@@@@@@@@@@@@@@");
//2.放行
chain.doFilter(new MyRequest(request), response);
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
//之前的MyRequest增強了request.getParameter("name");方法
//增強了所有的獲取參數的方法request.getParameterValues("name");
//增強了所有的獲取參數的方法request.getParameterMap();
class MyRequest extends HttpServletRequestWrapper{
private HttpServletRequest request;
private boolean flag=true;
public MyRequest(HttpServletRequest request) {
super(request);
this.request=request;
}
@Override
public String getParameter(String name) {
if(name==null || name.trim().length()==0){
return null;
}
String[] values = getParameterValues(name);
if(values==null || values.length==0){
return null;
}
return values[0];
}
@Override
/**
* hobby=[eat,drink]
*/
public String[] getParameterValues(String name) {
if(name==null || name.trim().length()==0){
return null;
}
Map<String, String[]> map = getParameterMap();
if(map==null || map.size()==0){
return null;
}
return map.get(name);
}
@Override
/**
* map{ username=[tom],password=[123],hobby=[eat,drink]}
*/
public Map<String,String[]> getParameterMap() {
/**
* 首先判斷請求方式
* 若爲post request.setchar...(utf-8)
* 若爲get 將map中的值遍歷編碼就可以了
*/
String method = request.getMethod();
if("post".equalsIgnoreCase(method)){
try {
request.setCharacterEncoding("utf-8");
return request.getParameterMap();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else if("get".equalsIgnoreCase(method)){
Map<String,String[]> map = request.getParameterMap();
if(flag){
for (String key:map.keySet()) {
String[] arr = map.get(key);
//繼續遍歷數組
for(int i=0;i<arr.length;i++){
//編碼
try {
arr[i]=new String(arr[i].getBytes("iso-8859-1"),"utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
flag=false;
}
//需要遍歷map 修改value的每一個數據的編碼
return map;
}
return super.getParameterMap();
}
}
配置過濾器對應的web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>store_v5</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>cn.itzheng.store.web.filter.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
導入BaseServlet這個工具類的作用是減少Servlet的創建
package cn.itzheng.store.web.base;
import java.io.IOException;
import java.lang.reflect.Method;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class BaseServlet extends HttpServlet {
@Override
public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// localhost:8080/store/productServlet?method=addProduct
String method = req.getParameter("method");
if (null == method || "".equals(method) || method.trim().equals("")) {
method = "execute";
}
// 注意:此處的this代表的是子類的對象
// System.out.println(this);
// 子類對象字節碼對象
Class clazz = this.getClass();
try {
// 查找子類對象對應的字節碼中的名稱爲method的方法.這個方法的參數類型是:HttpServletRequest.class,HttpServletResponse.class
Method md = clazz.getMethod(method, HttpServletRequest.class, HttpServletResponse.class);
if(null!=md){
String jspPath = (String) md.invoke(this, req, resp);
if (null != jspPath) {
req.getRequestDispatcher(jspPath).forward(req, resp);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
// 默認方法
public String execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
return null;
}
}