太恐怖了 两天搞定一个项目 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','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 网络商城教程+源代码相关推荐
- 51php服务器稳不稳定,百度经验:两步搞定PHP-FPM优化,让服务器更平稳
原标题:百度经验:两步搞定PHP-FPM优化,让服务器更平稳 导言:Web服务器的CPU指标和MEM指标异常,不稳定?可能是PHP-FPM进程重启机制的问题导致的,一同和百度外卖探索下如何优化吧.作者 ...
- 三分钟搞定一个网页原型设计
三分钟搞定一个网页原型设计 PS插件之Velositey(撒福利一波吼~) 做设计的大佬们应该很熟这个插件了,主要安利给平时不玩设计的后台们,以及不想花时间在做重复框架上的同学,更多的时间快留给打磨属 ...
- 两步搞定Hyperledger主打区块链解决方案Fabric
区块链技术发展至今,形成了公有链和联盟链两种主流技术平台. 公有链 面向大众,用户可以匿名参与,非常方便,账本数据也公开,加上强大的智能合约,因此公有链极大地促进了区块链概念和技术的普及,比如比特币. ...
- (8)小白又如何?3分钟搞定一个 C# 知识点
本系列文章将会以通俗易懂的对话方式进行教学,对话中将涵盖了新手在学习中的一般问题.此系列将会持续更新,包括别的语言以及实战都将使用对话的方式进行教学,基础编程语言教学适用于零基础小白,之后实战课程也将 ...
- 教你用 3 台机器搞定一个 Redis 高可用架构
转载自 教你用 3 台机器搞定一个 Redis 高可用架构 基于内存的 Redis 应该是目前各种 Web 开发业务中最为常用的 key-value 数据库了. 我们经常在业务中用其存储用户登陆态 ...
- 为什么wps数字前面有撇号_表格中输入18位超长的数值后变样了? 别急! 两招搞定!...
原标题:表格中输入18位超长的数值后变样了? 别急! 两招搞定! 输入超长的数值,就会显示成奇怪的样子, 好端端的身份证号码全都乱套了,为什么? 怎么办?这就为你解答~ 错误一:输入18位数之后变为含 ...
- 电脑关机Matlab文件没保存,文件还没保存就关机了?别怕,两招搞定它
原标题:文件还没保存就关机了?别怕,两招搞定它 大家好!我依然是你们帅气依旧的小琛哥. 大家有没有碰到过这种情况. 老板交给你一项很重要的任务! 虽然晚上十二点了,但是今天晚上必须赶出来! 结果电脑突 ...
- AVL Cruise从入门到秃头-如何快速搞定一个双电机四驱仿真模型(2)
学海无涯,回头是岸 目录 写在前面 模型改造 结语 写在前面 本文由"王浮生不怕生"原创,拒绝任何形式的抄袭及转载! 原文链接:https://mp.weixin.qq.com/s ...
- 两小时搞定负载均衡51CTO技术沙龙现场视频2
田逸田老师幽默风趣的案例讲解 7月5日下午,51CTO技术社区主办的"两小时搞定负载均衡 全真实战案例解析"活动圆满结束.参加沙龙的100多位用户和嘉宾相聚近三个小时,生动的课程. ...
最新文章
- python爬虫scrapy框架教程_Python爬虫教程-30-Scrapy 爬虫框架介绍
- 10种排序算法基础总结
- macOS下加载动态库dylib报code signature invalid错误的解决办法
- android 模拟器横竖屏切换
- Android studio 设置主题
- 牛客 - Alice and Bob(尺取+二分)
- 自定义异常 java
- 改开源项目的一些心得
- 微软Silverlight 5开发书籍汇总
- FusionCharts参数说明——3D饼图属性(Pie3D.swf )
- 在JSP中使用JavaBean
- Oracle分页查询语句(一)
- CCF业务总部和学术交流中心落户苏州相城
- Linux type stat file
- 第一次创业失败的总结 - 产品设计
- es6.2.4-ansible部署
- Quartz配置RAMJobStore-007
- 使用接口根据关键词取亚马逊商品数据
- 为什么不使能中断,中断标志位也会被置一
- 通过gitbub桌面工具同步