太恐怖了 兩天搞定一個項目 Java Web MVC 網絡商城教程+源代碼

兩天搞定一個項目 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;
	}

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章