[TOC]

1、需求分析:用户模块分析(尽可能实现多的功能)
(略)
2、需求分析:后台需求分析(尽可能实现多的功能)
(略)
3、页面设计
这里直接引用静态页面即可。(略)
3、数据库设计
(1)用户表:
用户ID
用户名
密码
真实姓名
邮箱
地址
电话
用户状态(1、未激活,2、已激活)
激活码
(2)一级分类:
一级分类ID
一级分类名称
(3)二级分类:
二级分类ID
二级分类名称
一级分类ID(外键,指向一级分类的主键ID)
(4)商品表:(二级分类与商品是一对多 关系)
商品ID
商品名称
商品商城价格
商品市场价格
商品描述
商品图片(路径)
二级分类ID(外键,指向二级分类的主键ID)
(5)订单表(订单与商品是多对多关系,用户与订单是一对多关系)
订单ID
订单时间
订单金额
订单状态
订单地址
订单电话
订单收货人
用户ID(外键,指向用户表的主键ID)
商品
(6)订单项表(中间表,与商品表、订单表是一对多关系)
主键ID
商品ID
订单ID
数量
小计
(7)后台用户表
用户名
密码
SSH网上商城项目 - 图1
4、SSH框架整合搭建环境(略,可翻看Spring整合的第三个版本)
(1)导入jar包
(2)在Config包下编写applicationContext.xml

5、引入静态页面
(1)在WEB-INF下创建了jsp文件夹,将SSH\网上商城day01\资料\静态页面\静态页
面.html的所有页面引入到jsp文件夹中。
(2)将SSH\网上商城day01\资料\静态页面\静态页面\css,js等文件引入到WebContent

6、访问首页
因为页面在WEB-INF目录下,无法直接访问。必须经过Action来访问。
(1)将index.htm的内容复制到index.jsp中
(2)将./css ./image修改为${pageContext.request.contextPath}/css image
(3)编写indextAction,结果视图为WEB-INF/jsp/index.jsp

7、注册页面跳转
(1)将顶部抽取出来,放入menu.jsp
(2)将会员注册.htm内容复制到regist.jsp中
(3)编写registPage.action,结果视图为WEB-INF/jsp/regist.jsp

8、注册校验
(1)前台JS校验(只进行非空校验)
SSH网上商城项目 - 图2
(2)前台Ajax异步校验
1、script部分:
function checkUsername(){
var username=document.getElementById(‘username’).value;
var xmlhttp=createXmlHttp();
xmlhttp.onreadystatechange=function(){
if(xmlhttp.readyState==4&&xmlhttp.status==200){
document.getElementById(“uspan”).innerHTML=
xmlhttp.responseText;
}
} xmlhttp.open(“GET”,”${pageContext.request.contextPath}/findByName.action?
time=”+new Date().getTime()+”&username=”+username,true);
xmlhttp.send(null);
};
function createXmlHttp(){
var xmlhttp;
if (window.XMLHttpRequest)
{
// IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码
xmlhttp=new XMLHttpRequest();
}
else
{
// IE6, IE5 浏览器执行代码
xmlhttp=new ActiveXObject(“Microsoft.XMLHTTP”);
}
return xmlhttp;
};
2、编写Dao,Service的findByName方法(略)
3、编写findByName.action
@Action(“findByName”)
public String findByName() throws IOException {
user=userService.findByName(user.getUsername());
//判断
HttpServletResponse response=ServletActionContext.getResponse();
response.setContentType(“text/html;charset=utf-8”);
if(user!=null) {
response.getWriter().println(“用户名已经存在“);
}else {
response.getWriter().println(“用户名可以使用“);
}
return NONE;
}
(3)后台校验
使用struts2的xwork框架检验数据。
文件:UserAction-regist-validation.xml
输出错误信息:

9、注册将数据保存到数据库中
(1)在Service层补充用户的state,code数据。
激活码code使用UUID获取。
状态码:设置为0。表示还未激活。
(2)使用save方法保存

10、邮件概述和发送过程
邮件协议:
smtp :发送邮件协议
pop3 :接收邮件协议
邮箱发送全过程:
SSH网上商城项目 - 图3

11、邮件发送的服务器安装及客户端软件安装
(1)搭建邮箱服务器:
安装邮箱服务器:
修改域名:
工具——>服务器设置——>shop.com
注册账号:
账号——>新建账号
(2)安装客户端软件:(接收和发送邮件.)
outlook 和 foxmail
安装foxmail:
配置:
配置发送邮件服务器:
localhost
配置接收邮件服务器:
localhost

12、编码实现发送邮件
(1)复制mail.jar和activation.jar
(2)编写MailUtils工具类
public static void sendMail(String to,String code) {
//10.12.178.150 本地ip地址
/*
1、创建Session对象
2、创建一个代表邮件的对象Message
3、发送邮件Transport
/
//1、获取连接对象
Properties props=new Properties();
props.setProperty(“mail.host”, “localhost”);
Session session=Session.getDefaultInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(“service@shop.com”,”123”);
}
});
//2、创建邮件对象
Message message=new MimeMessage(session);
try {
//设置发件人
message.setFrom(new InternetAddress(“service@shop.com”));
//设置收件人 抄送CC 暗送BCC
message.addRecipient(RecipientType.TO,new InternetAddress(to));
//设置标题
message.setSubject(“来自传智商城的官方激活邮件!”);
//设置邮件正文
message.setContent(“

传智商城的官方激活邮件!点下面链接完成激活
操作!

http://10.12.178.150:8080/SSHshop/active.action?code=”+code+”

“,”text/html;charset=utf-8”);
//发送邮件
Transport.send(message);
} catch (Exception e) {
e.printStackTrace();
}
}

13、激活用户
在邮箱客户端编点击激活链接:
根据传递的激活码进行用户查询:
用户不为空,修改用户的状态为1。(编写active.action动作方法)
@Action(“active”)
public String active() {
User existUser=userService.findByCode(user.getCode());
if(existUser==null) {
this.addActionMessage(“激活失败!”);
}else {
existUser.setState(1);
existUser.setCode(null);
userService.update(existUser);
this.addActionMessage(“激活成功!”);
}
return “msg”;
}
用户为空,激活被篡改或者过期。

14、跳转到登录页面
(1)修改登录链接,改为loginPage.action
(2)编写loginPage.action

15、用户登录操作
(1)接收用户名和密码(模型驱动会自动接收)
(2)根据用户名,密码,状态值进行查询。状态值为1才能登录。
(3)登录成功:
将用户信息保存到session域中。
返回至首页。
@Result(name=”loginSuccess”,type=”redirectAction”,location=”index”)
(4)登录失败:
添加错误信息至页面。
this.addActionError(“登录失败!用户名或密码错误,账号未激活!”);
将错误信息显示在页面中。

返回至登录页面。

16、用户退出登录操作
(1)点击“退出登录”的链接,提交到Action。
(2)编写Action。
A、销毁Session
B、跳转回首页,配置结果视图(略)
//退出登录
@Action(“quit”)
public String quit() {
//销毁session
ServletActionContext.getRequest().getSession().invalidate();
return “quit”;
}

17、解决验证码问题
(1)编写生成验证码的CheckImgAction类。
代码实现:Action.CheckImgAction
(2)修改验证码图片的链接。
SSH网上商城项目 - 图4undefined
onclick=”change()” title=”点击更换验证码”>
(3)编写点击验证码图片的切换功能
function change(){
var img=document.getElementById(“checkImage”);
img.undefined
+new Date().getTime();
}

18、首页上的一级分类的查询
(1)创建一级分类的表:
CREATE TABLE category (
cid int(11) NOT NULL AUTO_INCREMENT,
cname varchar(255) DEFAULT NULL,
PRIMARY KEY (cid)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
(2)插入数据
INSERT INTO category VALUES (1,’女装男装’),(2,’鞋靴箱包’),(3,’运动户外’),(4,’珠宝配饰’),(5,’手机数码’),(6,’家电办公’),(7,’护肤彩妆’);
(3)建包和类
CategoryService 业务层对象
CategoryDao 持久层对象
Category 实体对象
CategoryAction 一级分类的Action
(4)对CategoryService,,CategoryDao,Category进行注解配置(略)
(5)访问首页时就需要查询一级分类
A、在indexAction中注入CategoryService对象。
B、调用顺序:Actin—Service—Dao
C、编写findAll方法,查询所有一级分类。
D、将一级分类的数据显示到页面:
将一级分类的数据存入Session域中:
ActionContext.getContext().getSession().put(“list”,list);
然后在页面中显示:






  • 19、首页热门商品和最新商品的显示
    (1)创建二级分类的表
    CREATE TABLE categorysecond (
    csid int(11) NOT NULL AUTO_INCREMENT,
    csname varchar(255) DEFAULT NULL,
    cid int(11) DEFAULT NULL,
    PRIMARY KEY (csid),
    KEY FK936FCAF21DB1FD15 (cid),
    CONSTRAINT FK936FCAF21DB1FD15 FOREIGN KEY (cid) REFERENCES category (cid)
    ) ENGINE=InnoDB AUTO_INCREMENT=41 DEFAULT CHARSET=utf8;
    (2)创建商品表
    CREATE TABLE product (
    pid int(11) NOT NULL AUTO_INCREMENT,
    pname varchar(255) DEFAULT NULL,
    market_price double DEFAULT NULL,
    shop_price double DEFAULT NULL,
    image varchar(255) DEFAULT NULL,
    pdesc varchar(255) DEFAULT NULL, //商品的描述
    is_hot int(11) DEFAULT NULL, //是否是热门商品
    pdate datetime DEFAULT NULL, //商品的日期
    csid int(11) DEFAULT NULL, //二级分类的id 外键
    PRIMARY KEY (pid),
    KEY FKED8DCCEFB9B74E02 (csid),
    CONSTRAINT FKED8DCCEFB9B74E02 FOREIGN KEY (csid) REFERENCES categorysecond (csid)
    ) ENGINE=InnoDB AUTO_INCREMENT=80 DEFAULT CHARSET=utf8;
    (3)往二级分类表中插入数据
    INSERT INTO categorysecond VALUES (1,’潮流女装’,1),(2,’初冬羽绒’,1),(3,’毛呢大衣’,1),(4,’温暖毛衣’,1),(5,’精选男装’,1),(6,’冬季外套’,1),(7,’羽绒服’,1),(9,’女鞋’,2),(10,’短靴’,2),(11,’男鞋’,2),(12,’女包’,2),(13,’男包’,2),(14,’服饰配件’,2),(15,’运动鞋’,3),(16,’运动服’,3),(17,’户外运动’,3),(18,’健身装备’,3),(19,’骑行装备’,3),(20,’珠宝首饰’,4),(21,’时尚饰品’,4),(22,’品质手表’,4),(23,’眼镜配饰’,4),(24,’手机’,5),(25,’平板’,5),(26,’电脑’,5),(27,’相机’,5),(28,’大家电’,6),(29,’厨房电器’,6),(30,’生活电器’,6),(31,’个户电器’,6),(32,’办公耗材’,6),(33,’美容护肤’,7),(34,’强效保养’,7),(35,’超值彩妆’,7),(36,’换季保养’,7);
    (4)往商品表中插入数据
    INSERT INTO product VALUES (1,’韩版连帽加厚毛衣女外套’,558,228,’products/1/cs10001.jpg’,’双11限量200件,拍完下架,加车享优惠,早下手早发货。。秋冬个性中长款毛衣,美丽和温度同在!限量供应,拒绝撞衫!迫于纱线和人工在不断上涨的双重压力下,产品涨价在即!少量现货出售中,手快有,手慢等哦,赶紧抢哦,绝对高大上。’,1,’2014-11-02 20:18:00’,1),(2,’女装立领长袖拼接PU皮毛呢外套’,436,172,’products/1/cs10002.jpg’,’【现在拍下并支付定金,即可获得双12当天10元无门槛优惠券一张。注:只限有预付定金款~优惠券统一在12月11号发放】 毛呢外套 整洁干练的长款版型 整个肩部给予皮绒拼接 与毛呢一起撑起品质感 立领 长袖 肩部往下做流行加层拼接 一粒扣收合门襟 特意做的夹棉里层(袖里无) 不必再畏惧冷冽寒风’,0,’2014-11-04 20:18:00’,1),(3,’韩版女装翻领羔绒夹棉格子毛呢外套’,238,119,’products/1/cs10003.jpg’,’外套款。 称为棉衣也不为过 或者因为它的表层毛呢 称呼为毛呢外套 yang 羔绒位于翻领及袖口 从视觉着手 带来温暖无限 夹棉里衬(袖里也有)再次提升御寒功能 流行元素上 选择红黑格纹理 大气而又经典 金属拉链开叉 插袋自不会少’,0,’2014-10-01 20:18:00’,1),(4,’韩版女装翻领羔绒夹棉格子毛呢外套’,238,119,’products/1/cs10004.jpg’,’外套款。 称为棉衣也不为过 或者因为它的表层毛呢 称呼为毛呢外套 yang 羔绒位于翻领及袖口 从视觉着手 带来温暖无限 夹棉里衬(袖里也有)再次提升御寒功能 流行元素上 选择红黑格纹理 大气而又经典 金属拉链开叉 插袋自不会少’,0,’2014-12-07 20:18:00’,1),(5,’韩版女装翻领羔绒夹棉格子毛呢外套’,238,119,’products/1/cs10005.jpg’,’外套款。 称为棉衣也不为过 或者因为它的表层毛呢 称呼为毛呢外套 yang 羔绒位于翻领及袖口 从视觉着手 带来温暖无限 夹棉里衬(袖里也有)再次提升御寒功能 流行元素上 选择红黑格纹理 大气而又经典 金属拉链开叉 插袋自不会少’,0,’2014-11-02 20:18:00’,1),(6,’冬装韩版女装翻领羔绒夹棉格子毛呢外套’,238,119,’products/1/cs10006.jpg’,’外套款。 称为棉衣也不为过 或者因为它的表层毛呢 称呼为毛呢外套 yang 羔绒位于翻领及袖口 从视觉着手 带来温暖无限 夹棉里衬(袖里也有)再次提升御寒功能 流行元素上 选择红黑格纹理 大气而又经典 金属拉链开叉 插袋自不会少’,0,’2014-11-10 15:18:00’,1),(7,’新款优雅奢华毛领白鸭绒轻薄羽绒服’,1120,590,’products/1/cs10007.jpg’,’秋冬热卖款,今日特惠!库存有限,卖完即止!喜欢的赶紧出手哦!’,0,’2014-11-03 20:18:00’,1),(8,’秋冬季毛呢外套女中长款圆领小香风呢子大衣’,672,336,’products/1/cs10008.jpg’,’【双12预售】双12提前开抢,11月24日—12月11日抢先付预付款33.6元,12月12日付剩余尾款,先付先发货,提前引爆双12!!!买就【送】双十二10元无门槛优惠券!!!商家【赠】运费险!!!’,0,’2014-11-03 20:18:00’,1),(9,’女装貉子毛大衣 时尚修身长袖淑女毛呢外套’,238,119,’products/1/cs10009.jpg’,’秋冬热卖款,今日特惠!库存有限,卖完即止!喜欢的赶紧出手哦!’,0,’2014-11-03 20:18:00’,1),(10,’修身显瘦淑女针织长袖打底连衣裙女’,356,158,’products/1/cs10010.jpg’,’【1212万能盛典预售抢先购,早买早便宜!】定金15.80元,预售价158.00元,双12价涨价至178.00元!’,0,’2014-11-03 20:18:00’,1),(11,’整貂皮大衣外套中长款收腰立领长袖进口真皮草裘皮’,19800,9900,’products/1/cs20001.jpg’,’采用100%进口小母貂 毛皮结实柔软毛峰更有光泽 保暖效果极强。  【正品保证】我们承诺100%整皮水貂 假一罚十 支持验货 无理由退换货 【售后保障】终身免费保养维修’,0,’2014-11-03 20:18:00’,2),(12,’整貂皮大衣外套中长款收腰立领长袖进口真皮草裘皮’,19800,9900,’products/1/cs20002.jpg’,’采用100%进口小母貂 毛皮结实柔软毛峰更有光泽 保暖效果极强。  【正品保证】我们承诺100%整皮水貂 假一罚十 支持验货 无理由退换货 【售后保障】终身免费保养维修’,0,’2014-11-03 20:18:00’,2),(13,’整貂皮大衣外套中长款收腰立领长袖进口真皮草裘皮’,19800,9900,’products/1/cs20003.jpg’,’采用100%进口小母貂 毛皮结实柔软毛峰更有光泽 保暖效果极强。  【正品保证】我们承诺100%整皮水貂 假一罚十 支持验货 无理由退换货 【售后保障】终身免费保养维修’,0,’2014-11-03 20:18:00’,2),(14,’整貂皮大衣外套中长款收腰立领长袖进口真皮草裘皮’,19800,9900,’products/1/cs20004.jpg’,’采用100%进口小母貂 毛皮结实柔软毛峰更有光泽 保暖效果极强。  【正品保证】我们承诺100%整皮水貂 假一罚十 支持验货 无理由退换货 【售后保障】终身免费保养维修’,0,’2014-11-03 20:18:00’,2),(15,’整貂皮大衣外套中长款收腰立领长袖进口真皮草裘皮’,19800,9900,’products/1/cs20005.jpg’,’采用100%进口小母貂 毛皮结实柔软毛峰更有光泽 保暖效果极强。  【正品保证】我们承诺100%整皮水貂 假一罚十 支持验货 无理由退换货 【售后保障】终身免费保养维修’,0,’2014-11-03 20:18:00’,2),(16,’整貂皮大衣外套中长款收腰立领长袖进口真皮草裘皮’,19800,9900,’products/1/cs20006.jpg’,’采用100%进口小母貂 毛皮结实柔软毛峰更有光泽 保暖效果极强。  【正品保证】我们承诺100%整皮水貂 假一罚十 支持验货 无理由退换货 【售后保障】终身免费保养维修’,0,’2014-11-03 20:18:00’,2),(17,’整貂皮大衣外套中长款收腰立领长袖进口真皮草裘皮’,19800,9900,’products/1/cs20007.jpg’,’采用100%进口小母貂 毛皮结实柔软毛峰更有光泽 保暖效果极强。  【正品保证】我们承诺100%整皮水貂 假一罚十 支持验货 无理由退换货 【售后保障】终身免费保养维修’,0,’2014-11-03 20:18:00’,2),(18,’整貂皮大衣外套中长款收腰立领长袖进口真皮草裘皮’,19800,9900,’products/1/cs20008.jpg’,’采用100%进口小母貂 毛皮结实柔软毛峰更有光泽 保暖效果极强。  【正品保证】我们承诺100%整皮水貂 假一罚十 支持验货 无理由退换货 【售后保障】终身免费保养维修’,0,’2014-11-03 20:18:00’,2),(19,’整貂皮大衣外套中长款收腰立领长袖进口真皮草裘皮’,19800,9900,’products/1/cs20009.jpg’,’采用100%进口小母貂 毛皮结实柔软毛峰更有光泽 保暖效果极强。  【正品保证】我们承诺100%整皮水貂 假一罚十 支持验货 无理由退换货 【售后保障】终身免费保养维修’,0,’2014-10-01 20:18:00’,2),(20,’中长款貂皮大衣整貂女装’,17900,7290,’products/1/cs20010.jpg’,’采用100%进口小母貂 毛皮结实柔软毛峰更有光泽 保暖效果极强。  【正品保证】【售后保障】我们承诺100%整皮水貂 假一罚十 支持验货 无理由退换货’,0,’2014-11-03 20:18:00’,2),(21,’韩版毛呢外套女韩范秋冬装厚中长款冬季呢子’,598,198,’products/1/cs30001.png’,’今年韩国首尔爆款,超高端定制羊毛呢大衣,版型超美,不挑身材,不挑年龄,上身非常漂亮哦,适合任何场合,这个秋冬MM必备款哦。几乎人手一件,美丽时尚的你怎么能少了这件呢,现秋冬预热加十一到来,只需99元包邮,只限今天,今天过后马上涨价,早买早划算哦~’,1,’2014-11-03 20:18:00’,3),(22,’韩版毛呢外套女韩范秋冬装厚中长款冬季呢子’,598,198,’products/1/cs30002.png’,’今年韩国首尔爆款,超高端定制羊毛呢大衣,版型超美,不挑身材,不挑年龄,上身非常漂亮哦,适合任何场合,这个秋冬MM必备款哦。几乎人手一件,美丽时尚的你怎么能少了这件呢,现秋冬预热加十一到来,只需99元包邮,只限今天,今天过后马上涨价,早买早划算哦~’,0,’2014-11-03 20:18:00’,3),(23,’韩版毛呢外套女韩范秋冬装厚中长款冬季呢子’,598,198,’products/1/cs30003.png’,’今年韩国首尔爆款,超高端定制羊毛呢大衣,版型超美,不挑身材,不挑年龄,上身非常漂亮哦,适合任何场合,这个秋冬MM必备款哦。几乎人手一件,美丽时尚的你怎么能少了这件呢,现秋冬预热加十一到来,只需99元包邮,只限今天,今天过后马上涨价,早买早划算哦~’,0,’2014-11-03 20:18:00’,3),(24,’韩版毛呢外套女韩范秋冬装厚中长款冬季呢子’,598,198,’products/1/cs30004.png’,’今年韩国首尔爆款,超高端定制羊毛呢大衣,版型超美,不挑身材,不挑年龄,上身非常漂亮哦,适合任何场合,这个秋冬MM必备款哦。几乎人手一件,美丽时尚的你怎么能少了这件呢,现秋冬预热加十一到来,只需99元包邮,只限今天,今天过后马上涨价,早买早划算哦~’,0,’2014-11-03 20:18:00’,3),(25,’韩版毛呢外套女韩范秋冬装厚中长款冬季呢子’,598,198,’products/1/cs30005.png’,’今年韩国首尔爆款,超高端定制羊毛呢大衣,版型超美,不挑身材,不挑年龄,上身非常漂亮哦,适合任何场合,这个秋冬MM必备款哦。几乎人手一件,美丽时尚的你怎么能少了这件呢,现秋冬预热加十一到来,只需99元包邮,只限今天,今天过后马上涨价,早买早划算哦~’,0,’2014-11-03 20:18:00’,3),(26,’韩版毛呢外套女韩范秋冬装厚中长款冬季呢子’,598,198,’products/1/cs30006.png’,’今年韩国首尔爆款,超高端定制羊毛呢大衣,版型超美,不挑身材,不挑年龄,上身非常漂亮哦,适合任何场合,这个秋冬MM必备款哦。几乎人手一件,美丽时尚的你怎么能少了这件呢,现秋冬预热加十一到来,只需99元包邮,只限今天,今天过后马上涨价,早买早划算哦~’,0,’2014-11-03 20:18:00’,3),(27,’韩版毛呢外套女韩范秋冬装厚中长款冬季呢子’,598,198,’products/1/cs30007.png’,’今年韩国首尔爆款,超高端定制羊毛呢大衣,版型超美,不挑身材,不挑年龄,上身非常漂亮哦,适合任何场合,这个秋冬MM必备款哦。几乎人手一件,美丽时尚的你怎么能少了这件呢,现秋冬预热加十一到来,只需99元包邮,只限今天,今天过后马上涨价,早买早划算哦~’,0,’2014-11-03 20:18:00’,3),(28,’韩版毛呢外套女韩范秋冬装厚中长款冬季呢子’,598,198,’products/1/cs30008.png’,’今年韩国首尔爆款,超高端定制羊毛呢大衣,版型超美,不挑身材,不挑年龄,上身非常漂亮哦,适合任何场合,这个秋冬MM必备款哦。几乎人手一件,美丽时尚的你怎么能少了这件呢,现秋冬预热加十一到来,只需99元包邮,只限今天,今天过后马上涨价,早买早划算哦~’,0,’2014-11-03 20:18:00’,3),(29,’韩版毛呢外套女韩范秋冬装厚中长款冬季呢子’,598,198,’products/1/cs30009.png’,’今年韩国首尔爆款,超高端定制羊毛呢大衣,版型超美,不挑身材,不挑年龄,上身非常漂亮哦,适合任何场合,这个秋冬MM必备款哦。几乎人手一件,美丽时尚的你怎么能少了这件呢,现秋冬预热加十一到来,只需99元包邮,只限今天,今天过后马上涨价,早买早划算哦~’,0,’2014-11-03 20:18:00’,3),(30,’韩版毛呢外套女韩范秋冬装厚中长款冬季呢子’,598,198,’products/1/cs30010.png’,’今年韩国首尔爆款,超高端定制羊毛呢大衣,版型超美,不挑身材,不挑年龄,上身非常漂亮哦,适合任何场合,这个秋冬MM必备款哦。几乎人手一件,美丽时尚的你怎么能少了这件呢,现秋冬预热加十一到来,只需99元包邮,只限今天,今天过后马上涨价,早买早划算哦~’,0,’2014-11-10 20:18:00’,3),(31,’打底衫加厚修身羊毛衫女装羊绒衫’,387,186,’products/1/cs40001.png’,’本产品 不起球 不掉色 不缩水 是一款贴身必备的厚款羊绒衫 质量保证支持退换’,0,’2014-11-03 20:18:00’,4),(32,’打底衫加厚修身羊毛衫女装羊绒衫’,387,186,’products/1/cs40002.png’,’本产品 不起球 不掉色 不缩水 是一款贴身必备的厚款羊绒衫 质量保证支持退换’,0,’2014-11-03 20:18:00’,4),(33,’打底衫加厚修身羊毛衫女装羊绒衫’,387,186,’products/1/cs40003.png’,’本产品 不起球 不掉色 不缩水 是一款贴身必备的厚款羊绒衫 质量保证支持退换’,0,’2014-11-03 20:18:00’,4),(34,’性感时尚 酷感黑色小圆领露肩修身长袖针织衫’,387,186,’products/1/cs40004.jpg’,’本产品 不起球 不掉色 不缩水 是一款贴身必备的厚款羊绒衫 质量保证支持退换’,0,’2014-11-03 20:18:00’,4),(35,’韩版黑色打底衫加厚修身羊毛衫女装羊绒衫’,387,186,’products/1/cs40005.png’,’本产品 不起球 不掉色 不缩水 是一款贴身必备的厚款羊绒衫 质量保证支持退换’,1,’2014-11-03 20:18:00’,4),(36,’韩版黑色打底衫加厚修身羊毛衫女装羊绒衫’,387,186,’products/1/cs40006.png’,’本产品 不起球 不掉色 不缩水 是一款贴身必备的厚款羊绒衫 质量保证支持退换’,0,’2014-11-03 20:18:00’,4),(37,’韩版黑色打底衫加厚修身羊毛衫女装羊绒衫’,387,186,’products/1/cs40007.png’,’本产品 不起球 不掉色 不缩水 是一款贴身必备的厚款羊绒衫 质量保证支持退换’,0,’2014-11-03 20:18:00’,4),(38,’韩版黑色打底衫加厚修身羊毛衫女装羊绒衫’,387,186,’products/1/cs40008.png’,’本产品 不起球 不掉色 不缩水 是一款贴身必备的厚款羊绒衫 质量保证支持退换’,0,’2014-11-03 20:18:00’,4),(39,’韩版黑色打底衫加厚修身羊毛衫女装羊绒衫’,387,186,’products/1/cs40009.png’,’本产品 不起球 不掉色 不缩水 是一款贴身必备的厚款羊绒衫 质量保证支持退换’,0,’2014-11-03 20:18:00’,4),(40,’韩版黑色打底衫加厚修身羊毛衫女装羊绒衫’,387,186,’products/1/cs40010.png’,’本产品 不起球 不掉色 不缩水 是一款贴身必备的厚款羊绒衫 质量保证支持退换’,0,’2014-11-03 20:18:00’,4),(41,’韩版黑色打底衫加厚修身羊毛衫女装羊绒衫’,387,186,’products/1/cs40011.png’,’本产品 不起球 不掉色 不缩水 是一款贴身必备的厚款羊绒衫 质量保证支持退换’,1,’2014-11-03 20:18:00’,4),(42,’冬装外套棉衣立领修身商务大码男装潮牌上衣’,899,358,’products/1/cs50001.png’,’【型男卖点简介】该款凭借其独特的设计、精选的面料和一致的时尚理念,以质感都市,充满时尚感的设计风格, 简约毛呢大衣,修身不变形,不起球,国际大牌一样的面料!面料成分:77.8%聚酯纤维+22.2%粘纤 秋冬简约修身防静电呢风衣外套’,1,’2014-11-03 20:18:00’,5),(43,’冬装外套棉衣立领修身商务大码男装潮牌上衣’,899,358,’products/1/cs50002.png’,’【型男卖点简介】该款凭借其独特的设计、精选的面料和一致的时尚理念,以质感都市,充满时尚感的设计风格, 简约毛呢大衣,修身不变形,不起球,国际大牌一样的面料!面料成分:77.8%聚酯纤维+22.2%粘纤 秋冬简约修身防静电呢风衣外套’,0,’2014-11-03 20:18:00’,5),(44,’冬装外套棉衣立领修身商务大码男装潮牌上衣’,899,358,’products/1/cs50003.png’,’【型男卖点简介】该款凭借其独特的设计、精选的面料和一致的时尚理念,以质感都市,充满时尚感的设计风格, 简约毛呢大衣,修身不变形,不起球,国际大牌一样的面料!面料成分:77.8%聚酯纤维+22.2%粘纤 秋冬简约修身防静电呢风衣外套’,1,’2014-11-03 20:18:00’,5),(45,’冬装外套棉衣立领修身商务大码男装潮牌上衣’,899,358,’products/1/cs50004.png’,’【型男卖点简介】该款凭借其独特的设计、精选的面料和一致的时尚理念,以质感都市,充满时尚感的设计风格, 简约毛呢大衣,修身不变形,不起球,国际大牌一样的面料!面料成分:77.8%聚酯纤维+22.2%粘纤 秋冬简约修身防静电呢风衣外套’,0,’2014-12-07 20:18:00’,5),(46,’冬装外套棉衣立领修身商务大码男装潮牌上衣’,899,358,’products/1/cs50005.png’,’【型男卖点简介】该款凭借其独特的设计、精选的面料和一致的时尚理念,以质感都市,充满时尚感的设计风格, 简约毛呢大衣,修身不变形,不起球,国际大牌一样的面料!面料成分:77.8%聚酯纤维+22.2%粘纤 秋冬简约修身防静电呢风衣外套’,0,’2014-11-03 20:18:00’,5),(47,’冬装外套棉衣立领修身商务大码男装潮牌上衣’,899,358,’products/1/cs50006.png’,’【型男卖点简介】该款凭借其独特的设计、精选的面料和一致的时尚理念,以质感都市,充满时尚感的设计风格, 简约毛呢大衣,修身不变形,不起球,国际大牌一样的面料!面料成分:77.8%聚酯纤维+22.2%粘纤 秋冬简约修身防静电呢风衣外套’,1,’2014-11-03 20:18:00’,5),(48,’冬装外套棉衣立领修身商务大码男装潮牌上衣’,899,358,’products/1/cs50007.png’,’【型男卖点简介】该款凭借其独特的设计、精选的面料和一致的时尚理念,以质感都市,充满时尚感的设计风格, 简约毛呢大衣,修身不变形,不起球,国际大牌一样的面料!面料成分:77.8%聚酯纤维+22.2%粘纤 秋冬简约修身防静电呢风衣外套’,0,’2014-11-03 20:18:00’,5),(49,’冬装外套棉衣立领修身商务大码男装潮牌上衣’,899,358,’products/1/cs50008.png’,’【型男卖点简介】该款凭借其独特的设计、精选的面料和一致的时尚理念,以质感都市,充满时尚感的设计风格, 简约毛呢大衣,修身不变形,不起球,国际大牌一样的面料!面料成分:77.8%聚酯纤维+22.2%粘纤 秋冬简约修身防静电呢风衣外套’,0,’2014-11-03 20:18:00’,5),(50,’冬装外套棉衣立领修身商务大码男装潮牌上衣’,899,358,’products/1/cs50009.png’,’【型男卖点简介】该款凭借其独特的设计、精选的面料和一致的时尚理念,以质感都市,充满时尚感的设计风格, 简约毛呢大衣,修身不变形,不起球,国际大牌一样的面料!面料成分:77.8%聚酯纤维+22.2%粘纤 秋冬简约修身防静电呢风衣外套’,0,’2014-11-03 20:18:00’,5),(51,’冬装外套棉衣立领修身商务大码男装潮牌上衣’,899,358,’products/1/cs50010.png’,’【型男卖点简介】该款凭借其独特的设计、精选的面料和一致的时尚理念,以质感都市,充满时尚感的设计风格, 简约毛呢大衣,修身不变形,不起球,国际大牌一样的面料!面料成分:77.8%聚酯纤维+22.2%粘纤 秋冬简约修身防静电呢风衣外套’,1,’2014-12-07 20:18:00’,5),(52,’商务修身羊毛呢子风衣 中长款呢大衣外套’,997,299,’products/1/cs60001.png’,’冬装新品首发!大牌做工,顶级羊毛呢面料,穿着舒适保暖,冬季潮男必备品!新品预售价299元,预计涨到398!不要拿市场上那些低劣的毛呢大衣相比较,一分价钱一分货哦!买到就是赚到,支持7天无理由退换货,尺码不对,可享受免费换货!’,0,’2014-11-03 20:18:00’,6),(53,’商务修身羊毛呢子风衣 中长款呢大衣外套’,997,299,’products/1/cs60002.png’,’冬装新品首发!大牌做工,顶级羊毛呢面料,穿着舒适保暖,冬季潮男必备品!新品预售价299元,预计涨到398!不要拿市场上那些低劣的毛呢大衣相比较,一分价钱一分货哦!买到就是赚到,支持7天无理由退换货,尺码不对,可享受免费换货!’,1,’2014-11-03 20:18:00’,6),(54,’商务修身羊毛呢子风衣 中长款呢大衣外套’,997,299,’products/1/cs60003.png’,’冬装新品首发!大牌做工,顶级羊毛呢面料,穿着舒适保暖,冬季潮男必备品!新品预售价299元,预计涨到398!不要拿市场上那些低劣的毛呢大衣相比较,一分价钱一分货哦!买到就是赚到,支持7天无理由退换货,尺码不对,可享受免费换货!’,0,’2014-11-03 20:18:00’,6),(55,’商务修身羊毛呢子风衣 中长款呢大衣外套’,997,299,’products/1/cs60004.png’,’冬装新品首发!大牌做工,顶级羊毛呢面料,穿着舒适保暖,冬季潮男必备品!新品预售价299元,预计涨到398!不要拿市场上那些低劣的毛呢大衣相比较,一分价钱一分货哦!买到就是赚到,支持7天无理由退换货,尺码不对,可享受免费换货!’,0,’2014-11-03 20:18:00’,6),(56,’商务修身羊毛呢子风衣 中长款呢大衣外套’,997,299,’products/1/cs60005.png’,’冬装新品首发!大牌做工,顶级羊毛呢面料,穿着舒适保暖,冬季潮男必备品!新品预售价299元,预计涨到398!不要拿市场上那些低劣的毛呢大衣相比较,一分价钱一分货哦!买到就是赚到,支持7天无理由退换货,尺码不对,可享受免费换货!’,0,’2014-11-03 20:18:00’,6),(57,’商务修身羊毛呢子风衣 中长款呢大衣外套’,997,299,’products/1/cs60006.png’,’冬装新品首发!大牌做工,顶级羊毛呢面料,穿着舒适保暖,冬季潮男必备品!新品预售价299元,预计涨到398!不要拿市场上那些低劣的毛呢大衣相比较,一分价钱一分货哦!买到就是赚到,支持7天无理由退换货,尺码不对,可享受免费换货!’,1,’2014-12-07 22:18:00’,6),(58,’商务修身羊毛呢子风衣 中长款呢大衣外套’,997,299,’products/1/cs60007.png’,’冬装新品首发!大牌做工,顶级羊毛呢面料,穿着舒适保暖,冬季潮男必备品!新品预售价299元,预计涨到398!不要拿市场上那些低劣的毛呢大衣相比较,一分价钱一分货哦!买到就是赚到,支持7天无理由退换货,尺码不对,可享受免费换货!’,0,’2014-11-03 20:18:00’,6),(59,’商务修身羊毛呢子风衣 中长款呢大衣外套’,997,299,’products/1/cs60008.png’,’冬装新品首发!大牌做工,顶级羊毛呢面料,穿着舒适保暖,冬季潮男必备品!新品预售价299元,预计涨到398!不要拿市场上那些低劣的毛呢大衣相比较,一分价钱一分货哦!买到就是赚到,支持7天无理由退换货,尺码不对,可享受免费换货!’,0,’2014-11-03 20:18:00’,6),(60,’商务修身羊毛呢子风衣 中长款呢大衣外套’,997,299,’products/1/cs60009.png’,’冬装新品首发!大牌做工,顶级羊毛呢面料,穿着舒适保暖,冬季潮男必备品!新品预售价299元,预计涨到398!不要拿市场上那些低劣的毛呢大衣相比较,一分价钱一分货哦!买到就是赚到,支持7天无理由退换货,尺码不对,可享受免费换货!’,1,’2014-12-02 20:18:00’,6),(61,’商务修身羊毛呢子风衣 中长款呢大衣外套’,997,299,’products/1/cs60010.png’,’冬装新品首发!大牌做工,顶级羊毛呢面料,穿着舒适保暖,冬季潮男必备品!新品预售价299元,预计涨到398!不要拿市场上那些低劣的毛呢大衣相比较,一分价钱一分货哦!买到就是赚到,支持7天无理由退换货,尺码不对,可享受免费换货!’,0,’2014-11-03 20:18:00’,6),(62,’韩版修身羽绒服加厚保暖可脱卸帽’,198,83,’products/1/cs70001.png’,’羽绒棉服,保暖性比普通棉服高出3倍,价格合适,比羽绒服便宜3倍,超高性价比~~现亏本冲业绩,活动过后涨价为198元哦,亲们速抢~~!!’,1,’2014-11-03 20:18:00’,7),(63,’韩版修身羽绒服加厚保暖可脱卸帽’,198,83,’products/1/cs70002.png’,’羽绒棉服,保暖性比普通棉服高出3倍,价格合适,比羽绒服便宜3倍,超高性价比~~现亏本冲业绩,活动过后涨价为198元哦,亲们速抢~~!!’,1,’2014-11-03 20:18:00’,7),(64,’韩版修身羽绒服加厚保暖可脱卸帽’,198,83,’products/1/cs70003.png’,’羽绒棉服,保暖性比普通棉服高出3倍,价格合适,比羽绒服便宜3倍,超高性价比~~现亏本冲业绩,活动过后涨价为198元哦,亲们速抢~~!!’,0,’2014-11-03 20:18:00’,7),(65,’韩版修身羽绒服加厚保暖可脱卸帽’,198,83,’products/1/cs70004.png’,’羽绒棉服,保暖性比普通棉服高出3倍,价格合适,比羽绒服便宜3倍,超高性价比~~现亏本冲业绩,活动过后涨价为198元哦,亲们速抢~~!!’,1,’2014-11-03 20:18:00’,7),(66,’韩版修身羽绒服加厚保暖可脱卸帽’,198,83,’products/1/cs70005.png’,’羽绒棉服,保暖性比普通棉服高出3倍,价格合适,比羽绒服便宜3倍,超高性价比~~现亏本冲业绩,活动过后涨价为198元哦,亲们速抢~~!!’,0,’2014-11-03 20:18:00’,7),(67,’韩版修身羽绒服加厚保暖可脱卸帽’,198,83,’products/1/cs70006.png’,’羽绒棉服,保暖性比普通棉服高出3倍,价格合适,比羽绒服便宜3倍,超高性价比~~现亏本冲业绩,活动过后涨价为198元哦,亲们速抢~~!!’,1,’2014-11-03 20:18:00’,7),(68,’韩版修身羽绒服加厚保暖可脱卸帽’,198,83,’products/1/cs70007.png’,’羽绒棉服,保暖性比普通棉服高出3倍,价格合适,比羽绒服便宜3倍,超高性价比~~现亏本冲业绩,活动过后涨价为198元哦,亲们速抢~~!!’,1,’2014-12-04 20:18:00’,7),(69,’韩版修身羽绒服加厚保暖可脱卸帽’,198,83,’products/1/cs70008.png’,’羽绒棉服,保暖性比普通棉服高出3倍,价格合适,比羽绒服便宜3倍,超高性价比~~现亏本冲业绩,活动过后涨价为198元哦,亲们速抢~~!!’,1,’2014-11-03 20:18:00’,7),(70,’韩版修身羽绒服加厚保暖可脱卸帽’,198,83,’products/1/cs70009.png’,’羽绒棉服,保暖性比普通棉服高出3倍,价格合适,比羽绒服便宜3倍,超高性价比~~现亏本冲业绩,活动过后涨价为198元哦,亲们速抢~~!!’,0,’2014-11-03 20:18:00’,7),(71,’韩版修身羽绒服加厚保暖可脱卸帽’,198,83,’products/1/cs70010.png’,’羽绒棉服,保暖性比普通棉服高出3倍,价格合适,比羽绒服便宜3倍,超高性价比~~现亏本冲业绩,活动过后涨价为198元哦,亲们速抢~~!!’,1,’2014-11-03 20:18:00’,7),(72,’女鞋’,198,83,’products/1/nvxie.jpg’,’韩版女鞋…’,0,’2015-02-10 12:02:54’,9);
    (4)创建类
    ProductService 业务层对象
    ProductDao 持久层对象
    Product 实体对象
    ProductAction 商品的Action
    (5)对ProductService,,ProductDao,Product进行注解配置(略)
    (6)访问首页时就需要查询热门商品(0不是热门,1是热门)和最新商品
    A、在indexAction中注入ProductService对象。
    B、调用顺序:Actin—Service—Dao
    C、使用分页查询,将查询到的数据保存到值栈中去
    分页查询:1、离线条件查询(使用Page类) 2、execute查询

    D、将商品的数据显示到页面

    20、点击首页商品的图片显示商品详情。
    (1)修改商品的点击链接(略)
    (2)修改分页面.htm为product.jsp后台页面。(略)
    (3)编写Product类的findByPid动作方法(略)
    根据主键Pid,通过get方法查询Product
    将查询的结果返回给模型驱动对象。
    (4)在product.jsp中显示查询的结果
    编号:


    21、首页上点击一级分类,查询商品(左侧一级分类和二级分类的查询)
    (1)修改一级分类的链接(此处的cid为一级分类的主键)
    ">
    (2)修改蔬菜分类.htm为jsp后台页面
    (3)点击一级分类的链接
    (4)创建二级分类相关的类
    CategorysecondService 二级分类的业务类
    CategorysecondDao 二级分类的持久类
    CategorysecondAction 二级分类的动作类
    Categorysecond 二级分类的实体类
    (5)编写Categorysecond实体类,并注解配置和一级分类Category的关系(略)
    (7)一级分类和二级分类有着“一对多关系”,查询一级分类后,二级分类也查出来。
    (6)在ProductAction类中的findByCid动作方法里直接返回结果视图。
    访问首页时,已经查询了一级分类。并将一级分类存入了session中。
    (7)hibernateTemplate的find方法默认是延迟加载,必须在“一的一方”配置立即加
    载。 @OneToMany(targetEntity=Categorysecond.class,mappedBy=”category”,fetch=FetchType.EAGER)
    (8)将一级分类Category的二级分类属性categoryseconds显示在页面中





    (9)编写ProductAction类的findByCid动作方法,查询商品。
    //根据一级分类Category的cid查询商品
    @Action(“findByCid”)
    public String findByCid() {
    page=productService.findByCid(cid,num);
    System.out.println(page.getRecords());
    return “findByCid”;
    }
    public Page findByCid(Integer cid, Integer num) {
    int currentPageNum=1;
    if(num!=null) {
    currentPageNum=num;
    }
    int totalRecords=productDao.findCountCid(cid);
    System.out.println(“totalRecords”+totalRecords);
    Page page=new Page(currentPageNum,totalRecords);
    page.setPageSize(8);
    Listrecords=productDao.findByPageCid(cid,page.getStartIndex(),page.getPageSize());
    page.setRecords(records);
    return page;
    }
    public int findCountCid(Integer cid) {
    List list=(List)hibernateTemplate.find(“select count(
    ) from Product p where p.categorysecond.category.cid=?”,cid);
    if(list!=null&&list.size()>0) {
    return list.get(0).intValue();
    }
    return 0;
    }
    public List findByPageCid(Integer cid, int startIndex, int pageSize) {
    String hql=”select p from Product p join p.categorysecond cs join cs.category c where c.cid=?”;
    List list=hibernateTemplate.execute(new PageHibernateCallback
    (hql,new Object[] {cid}, startIndex, pageSize));
    if(list!=null&&list.size()>0) {
    return list;
    }
    return null;
    }
    (10)在productList.jsp页面显示商品


  • ">
    SSH网上商城项目 - 图5" width="170" height="170" style="display: inline-block;"/>



  • 11、点击商品,跳转到商品详情页。
    (1)修改productList.jsp的商品链接
    ">
    (2)编写findByPid.action动作方法(略)

    12、点击productList.jsp页面左侧的一级分类,显示商品
    (1)修改productList.jsp的一级分类的连接
    ">
    (2)编写findByCid.action动作方法(略)

    13、点击product.jsp页面中左侧一级分类的链接显示商品
    (1)修改左侧一级分类的链接



    ">








    (2)编写findByCid动作方法(略)

    14、点击二级分类显示商品带分页
    (1)修改点击的链接
    ">
    (2)编写ProductAction类的findByCsid动作方法
    @Action(“findByCsid”)
    public String findByCsid() {
    page=productService.findByCsid(csid,num);
    return “findByCsid”;
    }
    (3)编写ProductService类的findByCsid()
    public Page findByCsid(Integer csid, Integer num) {
    int currentPageNum=1;
    if(num!=null) {
    currentPageNum=num;
    }
    int totalRecords=productDao.findCountCsid(csid);
    System.out.println(“totalRecords”+totalRecords);
    Page page=new Page(currentPageNum,totalRecords);
    page.setPageSize(8);
    List records=productDao.findByPageCsid
    (csid,page.getStartIndex(),page.getPageSize());
    System.out.println(records);
    page.setRecords(records);
    return page;
    }
    (4)编写ProductDao类的findCountCsid()和findByPageCsid()
    public int findCountCsid(Integer csid) {
    List list=(List)hibernateTemplate.find(“select count() from
    Product p where p.categorysecond.csid=?”,csid);
    if(list!=null&&list.size()>0) {
    return list.get(0).intValue();
    }
    return 0;
    }
    public List findByPageCsid(Integer csid, int startIndex, int pageSize) {
    String hql=”select p from Product p join p.categorysecond cs where cs.csid=?”;
    List list=hibernateTemplate.execute
    (new PageHibernateCallback(hql,new Object[] {csid},
    startIndex, pageSize));
    if(list!=null&&list.size()>0) {
    return list;
    }
    return null;
    }

    15、将购物项添加到购物车中
    (1)修改Product.jsp中“加入购物车”的链接地址
    method=”post” id=”cartForm”>
    "/>


    购买数量:


    maxlength=”4” onpaste=”return false;” type=”text”>






    value=”加入购物车” type=”button” onclick=”saveCart()”>



    (2)编写javascript代码

    (3)编写CartAction类的addCart动作方法和getCart()
    //将购物项添加到购物车中
    @Action(“addCart”)
    public String addCart() {
    CartItem cartItem=new CartItem();
    cartItem.setCount(count);
    cartItem.setProduct(productService.findByPid(pid));
    getCart().addCart(cartItem);
    return “addCart”;
    }
    //从session中获得购物车
    private Cart getCart() {
    Cart cart=(Cart)ServletActionContext.getRequest().getSession().
    getAttribute(“cart”);
    if(cart==null) {
    cart=new Cart();
    ServletActionContext.getRequest().getSession().setAttribute(“cart”,cart);
    }
    return cart;
    }
    (4)将购物车中的所有购物项显示在cart.jsp页面中

    SSH网上商城项目 - 图6">


    总计:


    16、情况购物车
    (1)修改“清空购物车”的链接

    清空购物车

    (2)编写CartAction类的clearCart动作方法
    //清空购物车
    @Action(“clearCart”)
    public String clearCart() {
    getCart().clearCart();
    return “clearCart”;
    }

    17、将购物车中的某一个购物项移除
    (1)修改购物项后的“删除”链接
    " class="delete">删除
    (2)点击“删除链接”,传递商品的pid
    (3)接收pid,从购物车删除获得的购物项
    (4)编写CartAction类的removeCart动作方法
    //移除某一个购物项
    @Action(“removeCart”)
    public String removeCart() {
    getCart().removeCartItem(pid);
    return “removeCart”;
    }

    18、点击首页的“购物车”,跳转到cart.jsp页面
    (1)修改首页的“购物车”的链接地址
    购物车
    (2)编写CartAction类的myCart动作方法
    //我的购物车
    @Action(“myCart”)
    public String myCart() {
    return “myCart”;
    }

    19、网站首页配置成index.jsp
    (1)在WebContent下创建index.jsp
    (2)设置struts2的核心过滤器的拦截方式
    原因:过滤器默认只拦截请求,不拦截转发
    设置:在标签下,添加标签
    REQUEST
    FORWARD
    (3)在WebContent目录下的index.jsp添加语句:


    20、订单表orders的创建
    CREATE TABLE orders (
    oid int(11) NOT NULL AUTO_INCREMENT,
    total double DEFAULT NULL,
    ordertime datetime DEFAULT NULL, //订单时间
    state int(11) DEFAULT NULL, //订单状态
    name varchar(20) DEFAULT NULL, //收货人
    phone varchar(20) DEFAULT NULL, //收获号码
    addr varchar(50) DEFAULT NULL, //收货地址
    uid int(11) DEFAULT NULL,
    PRIMARY KEY (oid),
    KEY FKC3DF62E5AA3D9C7 (uid),
    CONSTRAINT FKC3DF62E5AA3D9C7 FOREIGN KEY (uid) REFERENCES user (uid)
    ) ENGINE=InnoDB AUTO_INCREMENT=9004 DEFAULT CHARSET=utf8;

    21.订单项表的创建(中间表,参与到了业务逻辑)
    CREATE TABLE orderitem (
    itemid int(11) NOT NULL AUTO_INCREMENT,
    count int(11) DEFAULT NULL,
    subtotal double DEFAULT NULL,
    pid int(11) DEFAULT NULL,
    oid int(11) DEFAULT NULL,
    PRIMARY KEY (itemid),
    KEY FKE8B2AB6166C01961 (oid),
    KEY FKE8B2AB6171DB7AE4 (pid),
    KEY FKE8B2AB6140ACF87A (oid),
    CONSTRAINT FKE8B2AB6140ACF87A FOREIGN KEY (oid) REFERENCES orders (oid),
    CONSTRAINT FKE8B2AB6171DB7AE4 FOREIGN KEY (pid) REFERENCES product (pid)
    ) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;

    22、订单模块类的创建和配置
    OrderAction 订单的动作类
    OrderService 订单的业务类
    OrderDao 订单的持久类
    Order 订单的实体类
    因为订单表和商品表是多对多的关系。在这里我们配置两个一对多的关系,即商品和订
    单项表,订单项表和订单表。

    23、保存订单到数据库
    (1)修改“提交订单”的链接地址
    提交订单
    (2)编写OrderAction类的saveOrder动作方法
    @Action(“saveOrder”)
    public String saveOrder() {
    order.setOrdertime(new Date());
    order.setState(1);
    //1:未付款 2:已经付款,但是没有发货 3、已经发货,没有确认收货 4:交易成功
    Cart cart=(Cart)ServletActionContext.getRequest().getSession().getAttribute(“cart”);
    if(cart==null) {
    this.addActionError(“亲!你还没有购物!请先去 购物!”);
    return “msg”;
    }
    order.setTotal(cart.getTotal());
    for(CartItem cartItem:cart.getCartItems()) {
    OrderItem orderItem=new OrderItem();
    orderItem.setCount(cartItem.getCount());
    orderItem.setProduct(cartItem.getProduct());
    orderItem.setSubtotal(cartItem.getSubtotal());
    orderItem.setOrder(order);
    order.getOrderitems().add(orderItem);
    }
    User user=(User)ServletActionContext.getRequest().getSession().
    getAttribute(“existUser”);
    if(user==null) {
    this.addActionError(“亲!你还没有登录!请先去登录”);
    return “login”;
    }
    order.setAddr(user.getAddr());
    order.setName(user.getName());
    order.setPhone(user.getPhone());
    order.setUser(user);
    orderService.saveOrder(order);
    return “saveOrder”;
    }
    (3)配置级联保存,保存订单的同时,也保存了订单项 @OneToMany(targetEntity=OrderItem.class,mappedBy=”order”,cascade=CascadeType.ALL)
    private Set orderitems=new HashSet(0);

    22、我的订单查询(分页)
    (1)根据用户的id查询当前用户的所有订单
    (2)编写OrderAction类的findAllOrder动作方法
    @Action(“findAllOrder”)
    public String findAllOrder() {
    Useruser=(User)ServletActionContext.getRequest().
    getSession().getAttribute(“existUser”);
    orders=orderService.findAllOrder(user.getUid(),num);
    return “findAllOrder”;
    }
    (3)编写OrderService类的findAllOrder()
    public Page findAllOrder(Integer uid, Integer num) {
    int currentPageNum=1;
    if(num!=null) {
    currentPageNum=num;
    }
    int totalRecords=orderDao.findTotalRecords(uid);
    Page page=new Page(currentPageNum,totalRecords,5);
    List list=orderDao.findAllOrder
    (uid,page.getStartIndex(),page.getPageSize());
    page.setRecords(list);
    return page;
    }
    (4)编写OrderDao类的findTotalRecords()和findAllOrder()
    //统计用户的订单总数
    public int findTotalRecords(Integer uid) {
    List list=(List)hibernateTemplate.find(
    “select count(
    ) from Order o where o.user.uid=?”,uid);
    if(list!=null&&list.size()>0) {
    return list.get(0).intValue();
    }
    return 0;
    }
    //查询用户的订单
    public List findAllOrder(Integer uid, int startIndex, int pageSize) {
    String hql=”from Order o where o.user.uid=? order by ordertime desc”;
    List list=hibernateTemplate.execute(new PageHibernateCallback
    (hql,new Object[] {uid},startIndex, pageSize));
    return list;
    }
    (5)将查询到的所有订单显示到orderList.js页面中(略)

    24、根据订单编号查询订单
    (1)点击orderList.jsp页面的“付款”,跳转到付款页面
    (2)修改“付款”的链接地址
    (3)编写OrderAction类的findByOid动作方法
    //根据订单id查询订单
    @Action(“findByOid”)
    public String findByOid() {
    order=orderService.findByOid(order.getOid());
    return “findByOid”;
    }
    (4)将查询到的数据显示在order.jsp页面中(略)

    25、在线支付的方式
    SSH网上商城项目 - 图7

    26、在线支付流程的分析
    SSH网上商城项目 - 图8
    27、跳转到易宝支付网页
    (1)修改order.jsp页面的“确认订单”的链接地址

    (2)编写OrderAction类的payOrder动作方法
    @Action(“payOrder”)
    public String payOrder() throws IOException {
    //修改订单
    Order currOrder=orderService.findByOid(order.getOid());
    currOrder.setAddr(order.getAddr());
    currOrder.setName(order.getName());
    currOrder.setPhone(order.getPhone());
    orderService.update(currOrder);
    //为订单付款
    String p0_Cmd=”Buy”; //业务类型,固定值
    String p1_MerId=”10001126856”; //商户编号
    String p2_Order=order.getOid().toString(); //订单编号
    String p3_Amt=”0.01”; //付款金额
    String p4_Cur=”CNY”; //交易币种
    String p5_Pid=””; //商品名称
    String p6_Pcat=””; //商品种类
    String p7_Pdesc=””; //商品描述
    //支付成功后跳转的页面路径
    String p8_Url=”http://localhost:8080/SSHshop/callback.action“;
    String p9_SAF=””; //送货地址
    String pa_MP=””; //商户扩展信息
    String pd_FrpId=””; //支付通道编码
    String pr_NeedResponse=”1”; //应答机制
    String keyValue=”69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv
    769220IuYe9u37N4y7rI4Pl”;
    String hmac=PaymentUtil.buildHmac(p0_Cmd,p1_MerId,p2_Order,
    p3_Amt, p4_Cur, p5_Pid, p6_Pcat, p7_Pdesc,
    p8_Url, p9_SAF, pa_MP, pd_FrpId,
    pr_NeedResponse, keyValue); //签名数据
    //向易宝出发:
    StringBuffer stringbuffer=new StringBuffer(“
    https://www.yeepay.com/app-merchant-proxy/node?”);;)
    stringbuffer.append(“p0_Cmd=”).append(p0_Cmd).append(“&”);
    stringbuffer.append(“p1_MerId=”).append(p1_MerId).append(“&”);
    stringbuffer.append(“p2_Order=”).append(p2_Order).append(“&”);
    stringbuffer.append(“p3_Amt=”).append(p3_Amt).append(“&”);
    stringbuffer.append(“p4_Cur=”).append(p4_Cur).append(“&”);
    stringbuffer.append(“p5_Pid=”).append(p5_Pid).append(“&”);
    stringbuffer.append(“p6_Pcat=”).append(p6_Pcat).append(“&”);
    stringbuffer.append(“p7_Pdesc=”).append(p7_Pdesc).append(“&”);
    stringbuffer.append(“p8_Url=”).append(p8_Url).append(“&”);
    stringbuffer.append(“p9_SAF=”).append(p9_SAF).append(“&”);
    stringbuffer.append(“pa_MP=”).append(pa_MP).append(“&”);
    stringbuffer.append(“pd_FrpId=”).append(pd_FrpId).append(“&”);
    stringbuffer.append(“pr_NeedResponse=”).append(pr_NeedResponse).append(“&”);
    stringbuffer.append(“hmac=”).append(hmac);
    //重定向到易宝
    ServletActionContext.getResponse().sendRedirect(stringbuffer.toString());
    return NONE;
    }

    28、在线支付成功后跳转到原网站
    回调原网站的方式有两种:
    1、浏览器重定向
    2、服务器点对点通讯
    由于我们的网站是在本机上的,所以不不存在方式2。
    代码实现:SSH文件夹/day01/资料/在线支付/代码
    PayServlet.java CallBackServlet.java
    (1)编写OrderAction类的callback动作方法
    @Action(“callback”)
    public String callback() {
    //修改订单状态
    Order currOrder=orderService.findByOid(Integer.parseInt(r6_Order));
    currOrder.setState(2);
    orderService.update(currOrder);
    //在页面显示付款成功的消息
    this.addActionMessage(“订单付款成功:订单编号:”+r6_Order+” 付款的金额:
    “+r3_Amt);
    return “msg”;
    }

    29、后台页面的布局
    采用框架进行布局:使用dtree.js作为树形结构菜单
    dtree的方法:
    1、add()
    参数:节点id,父节点id,节点名称,url,标题,target打开方式
    (target默认为_self,在自己的页面打开url。_blank为新开页面。
    Frame名称,在Frame中打开。)
    2、
    创建dTree对象变量:d=new dTree(‘d’);
    将节点输出到页面上:document.write(dTree对象名);
    代码实现:
    <!— 引用dtree的css/js文件文件 —>


    <!— 使用class为dtree的样式 —>




    30、后台管理员登录功能(与前台不同)
    (1)引入后台管理的页面
    在WebContent下创建文件夹,名为:admin。
    将day01/资料/静态页面/后台页面,所有后台页面引入到admin文件夹。
    (2)创建表
    CREATE TABLE adminuser (
    uid int(11) NOT NULL AUTO_INCREMENT,
    username varchar(255) DEFAULT NULL,
    password varchar(255) DEFAULT NULL,
    PRIMARY KEY (uid)
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
    (3)创建类:
    AdminUserAction 后台管理员的动作类
    AdminUserService 后台管理员的业务类
    AdminUserDao 后台管理员的持久类
    AdminUser 后台管理员的实体类
    (4)编写AdminUserAction类的adminUser_login动作方法
    @Action(“adminUser_login”)
    public String adminUser_login() {
    AdminUser existAdminUser=adminUserService.login(adminUser);
    if(existAdminUser==null) {
    this.addActionError(“用户不存在!”);
    return “loginFail”;
    }else { ServletActionContext.getRequest().getSession().
    setAttribute(“existAdminUser”,existAdminUser);
    return “loginSuccess”;
    }
    }

    31、后台的一级分类管理
    1、查询一级分类:
    (1)点击left.jsp左边树形菜单上的一级分类管理
    (2)修改请求的路径(第四个参数)
    d.add(‘010201’,’0102’,’一级分类管理’,’${pageContext.request.contextPath}/
    adminCategory_findAll.action’,’’,’mainFrame’);
    (3)编写AdminCategoryAction类的findAll动作方法
    //后台查询所有一级分类
    @Action(“adminCategory_findAll”)
    public String findAll() {
    categorys=categoryService.findAll();
    return “findAll”;
    }
    2、添加一级分类
    (1)点击一级分类列表admin/list.jsp的“添加”按钮
    (2)修改请求的路径