两天搞定一个项目 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','bbb@store.com','15723689921','2015-11-04','男',0,'9782f3e837ff422b9aee8b6381ccf927bdd9d2ced10d48f4ba4b9f187edf7738'),('3ca76a75e4f64db2bacd0974acc7c897','bb','bb','张三','bbb@store.com','15723689921','1990-02-01','男',0,'1258e96181a9457987928954825189000bae305094a042d6bd9d2d35674684e6'),('62145f6e66ea4f5cbe7b6f6b954917d3','cc','cc','张三','bbb@store.com','15723689921','2015-11-03','男',0,'19f100aa81184c03951c4b840a725b6a98097aa1106a4a38ba1c29f1a496c231'),('c95b15a864334adab3d5bb6604c6e1fc','bbb','bbb','老王','bbb@store.com','15712344823','2000-02-01','男',0,'71a3a933353347a4bcacff699e6baa9c950a02f6b84e4f6fb8404ca06febfd6f'),('f55b7d3a352a4f0782c910b2c70f1ea4','aaa','aaa','小王','aaa@store.com','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,       #分类idPRIMARY 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,       #订单项所在订单idPRIMARY 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 {//从线程中获取connecitonConnection 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);}// 释放 connectionpublic 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.创建一个程序与邮件服务器会话对象 SessionProperties 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", "admin@store.com");}};Session session = Session.getInstance(props, auth);// 2.创建一个Message,它相当于是邮件内容Message message = new MimeMessage(session);//设置发送者message.setFrom(new InternetAddress("admin@store.com"));//设置发送方式与接收者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("aaa@store.com", "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位,需要前面补0for (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 {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// TODO Auto-generated method stub}@Overridepublic 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);}@Overridepublic 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;}@Overridepublic 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 blocke.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 {@Overridepublic void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// localhost:8080/store/productServlet?method=addProductString 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.classMethod 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;}}

太恐怖了 两天搞定一个项目 Java Web MVC 网络商城教程+源代码相关推荐

  1. 51php服务器稳不稳定,百度经验:两步搞定PHP-FPM优化,让服务器更平稳

    原标题:百度经验:两步搞定PHP-FPM优化,让服务器更平稳 导言:Web服务器的CPU指标和MEM指标异常,不稳定?可能是PHP-FPM进程重启机制的问题导致的,一同和百度外卖探索下如何优化吧.作者 ...

  2. 三分钟搞定一个网页原型设计

    三分钟搞定一个网页原型设计 PS插件之Velositey(撒福利一波吼~) 做设计的大佬们应该很熟这个插件了,主要安利给平时不玩设计的后台们,以及不想花时间在做重复框架上的同学,更多的时间快留给打磨属 ...

  3. 两步搞定Hyperledger主打区块链解决方案Fabric

    区块链技术发展至今,形成了公有链和联盟链两种主流技术平台. 公有链 面向大众,用户可以匿名参与,非常方便,账本数据也公开,加上强大的智能合约,因此公有链极大地促进了区块链概念和技术的普及,比如比特币. ...

  4. (8)小白又如何?3分钟搞定一个 C# 知识点

    本系列文章将会以通俗易懂的对话方式进行教学,对话中将涵盖了新手在学习中的一般问题.此系列将会持续更新,包括别的语言以及实战都将使用对话的方式进行教学,基础编程语言教学适用于零基础小白,之后实战课程也将 ...

  5. 教你用 3 台机器搞定一个 Redis 高可用架构

    转载自   教你用 3 台机器搞定一个 Redis 高可用架构 基于内存的 Redis 应该是目前各种 Web 开发业务中最为常用的 key-value 数据库了. 我们经常在业务中用其存储用户登陆态 ...

  6. 为什么wps数字前面有撇号_表格中输入18位超长的数值后变样了? 别急! 两招搞定!...

    原标题:表格中输入18位超长的数值后变样了? 别急! 两招搞定! 输入超长的数值,就会显示成奇怪的样子, 好端端的身份证号码全都乱套了,为什么? 怎么办?这就为你解答~ 错误一:输入18位数之后变为含 ...

  7. 电脑关机Matlab文件没保存,文件还没保存就关机了?别怕,两招搞定它

    原标题:文件还没保存就关机了?别怕,两招搞定它 大家好!我依然是你们帅气依旧的小琛哥. 大家有没有碰到过这种情况. 老板交给你一项很重要的任务! 虽然晚上十二点了,但是今天晚上必须赶出来! 结果电脑突 ...

  8. AVL Cruise从入门到秃头-如何快速搞定一个双电机四驱仿真模型(2)

    学海无涯,回头是岸 目录 写在前面 模型改造 结语 写在前面 本文由"王浮生不怕生"原创,拒绝任何形式的抄袭及转载! 原文链接:https://mp.weixin.qq.com/s ...

  9. 两小时搞定负载均衡51CTO技术沙龙现场视频2

    田逸田老师幽默风趣的案例讲解 7月5日下午,51CTO技术社区主办的"两小时搞定负载均衡 全真实战案例解析"活动圆满结束.参加沙龙的100多位用户和嘉宾相聚近三个小时,生动的课程. ...

最新文章

  1. python爬虫scrapy框架教程_Python爬虫教程-30-Scrapy 爬虫框架介绍
  2. 10种排序算法基础总结
  3. macOS下加载动态库dylib报code signature invalid错误的解决办法
  4. android 模拟器横竖屏切换
  5. Android studio 设置主题
  6. 牛客 - Alice and Bob(尺取+二分)
  7. 自定义异常 java
  8. 改开源项目的一些心得
  9. 微软Silverlight 5开发书籍汇总
  10. FusionCharts参数说明——3D饼图属性(Pie3D.swf )
  11. 在JSP中使用JavaBean
  12. Oracle分页查询语句(一)
  13. CCF业务总部和学术交流中心落户苏州相城
  14. Linux type stat file
  15. 第一次创业失败的总结 - 产品设计
  16. es6.2.4-ansible部署
  17. Quartz配置RAMJobStore-007
  18. 使用接口根据关键词取亚马逊商品数据
  19. 为什么不使能中断,中断标志位也会被置一
  20. 通过gitbub桌面工具同步

热门文章

  1. first DG方法:二维ODE的边值问题
  2. Hotspot 对象引用Reference和Finalizer 源码解析
  3. 百度地图离线开发demo(热力图)
  4. 最实用的自用同花顺主力资金暴发进出公式
  5. 一个爬取沪深两市融资融券标的融资融券交易数据的小爬虫
  6. vim高亮多处,搜索多个关键词
  7. php搭建markdown云笔记_Typora+坚果云:支持markdown的云笔记搭建
  8. window 下使用typo3 neos 和 flows
  9. jquery:toggle()方法模拟鼠标连续click事件
  10. 最低2000多,中国房价最低的30城,你会选择吗?