美文网首页
Java Web商城项目笔记

Java Web商城项目笔记

作者: 字节码 | 来源:发表于2017-02-15 17:13 被阅读1818次

    一、分析商城实体有哪些:
    1.用户:通过需要注册和登录,得到必须有用户
    2.商品:所有展示的商品
    3.订单:用户选择商品到购物车及购买商品时使用
    4.分类:每个商品所属的分类
    总体分为4个实体

    根据实体建表,分析多表之间的关系
    1.User和orders两表之间的关系为1对多(1个用户可有多个订单),所以可以给orders表添加一个外键,标识为哪个用户,添加用户id外键
    2.category和product两表之间的关系为一对多(即1个分类可以有多个商品),所以可以给多的那张表即product表添加一个分类id外键,标识哪个分类
    3.订单和商品两表之间的关系为多对多,所以订单和商品之间需要添加一个表orderItem(订单项),这样orderItem的商品id指向product的商品id,orderItem的订单id指向了orders的订单id,把这三表之间拆分成了两个1对多的关系,也就是一个订单可以有多个orderItem,一个商品也可以有多个orderItem
    分析结果:4个实体需要建立5个表

    Snip20170214_2.png

    二、准备工作

    • 模块分析:
      1.用户模块:
      注册:以发送邮件的方式发送激活码
      激活:根据激活码,更改激活状态
      登录:
      退出

    • 创建数据库 及 user

    CREATE TABLE user (
      `uid` varchar(32) NOT NULL,
      `username` varchar(30) DEFAULT NULL,
      `password` varchar(100) DEFAULT NULL,
      `name` varchar(20) DEFAULT NULL,
      `email` varchar(20) DEFAULT NULL,
      `telephone` varchar(20) DEFAULT NULL,
      `birthday` date DEFAULT NULL,
      `sex` varchar(10) DEFAULT NULL,
      `state` int(11) DEFAULT NULL,
      `CODE` varchar(64) DEFAULT NULL,
      PRIMARY KEY (`uid`)
    ) ENGINE=InnoDB DEFAULT CHARSET=gbk ROW_FORMAT=COMPACT
    
    • 项目结构
      • 包结构
        • com.sey.web.servlet
      • com.sey.web.filter
      • com.sey.dao --- dao的接口
      • com.sey.dao.impl --- dao的实现类
      • com.sey.service -- service层的接口
      • com.sey.service.impl -- service层的实现类
      • com.sey.domain -- 实体类
      • com.sey.utils -- 工具类
      • com.sey.constant -- 常量
      • jar包
        • 驱动:
          • C3P0、DBUtils、BeanUtils、JSTL、邮件验证
        • 工具类和配置文件:
        • DataSourceUtils和C3P0的配置文件、UUIDUtils、UploadUtils、MD5Utils、MailUtils
      • 前台写好的页面:将前台写好的页面拷贝到Java Web项目的WebContent文件夹中

    三、通用servlet设计:
    创建一个BaseServlet,让其继承自HttpServlet,当再需要创建其他servlet时,让其继承自BaseServlet即可;
    在BaseServlet中重写service方法,在里面获取请求的方法名称,通过方法名称 获取一个指定的方法 ,并通过this关键字获取到调用者对象(子类),并让其调用获取到的方法

    public class BaseServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
    
        @Override
        public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            try {
                // 获取子类
                Class clas = this.getClass();
    
                // 获取表单数据,我定义的method字段为请求的方法的名称
                String mName = request.getParameter("method");
                if (mName == null) {
                    mName = "index"; // 当方法名为null时,让其为index,就会调用到定义的index方法
                }
                System.out.println(mName);
                // 通过方法名mName获取请求的方法
                Method method = clas.getMethod(mName, HttpServletRequest.class, HttpServletResponse.class);
                // 执行方法, 我定义的方法的返回值为请求转发的路径
                String path = (String) method.invoke(this, request, response);
                // 判断请求转发路径是否为空,不为空,就进行请求转发
                if (path != null) {
                    request.getRequestDispatcher(path).forward(request, response);
                }
            } catch (Exception e) {
                e.printStackTrace();
                throw new RuntimeException();
            }
            
        }
    }
    

    对Index页面的处理:

    创建IndexServlet 用于处理商城首页的服务器之间的交互

    当我们访问项目首页时,一般都有index页面,但是index.jsp页面中需要动态的查询数据,我们可以让其跳转到servlet上,让其查询到数据后,将数据放到request域中,然后请求转发;
    注意:开发中,所有的jsp页面都不可以让外界直接访问,因为jsp本质上也是servlet,这样不安全,我们可将所有的jsp放到WEB-INF目录下,浏览器就无法访问到了,但是我们可以通过java代码请求转发就可以访问到了。

    四、分模块开发

    • 1.用户模块
      • 1.1.用户注册功能

    创建UserServlet 它是与用户相关的servlet

    - register
       获取表单数据,并封装成用户模型:手动设置用户id, 设置state(用户状态(是否激活)),设置code(激活码)
       调用service完成注册操作,并请求转发到/jsp/msg.jsp页面
       在UserService中调用UserDao,发送激活邮件验证,在数据库中插入一条数据
    - 步骤实现:
      在index.jsp上点击注册页面时,跳转到register.jsp
      当点击注册按钮时发送请求
      <a href="Store/user?method=registerUI"></a>
      在UserServlet中编写一个registerUI方法,请求转发到register.jsp即可
    
    • 注意:封装数据的时候报了一个错误
      原因:字符串装成时间类型的时候出现错误,BeanUtils不支持字符串装成时间;
      解决方案:自定义转化器,1.编写一个类 实现Conventer接口,2.实现方法convert(转换成的类型,前台页面传入的字符串),3.注册转化器 在封装数据之前注册ConvertUtils.register(new MyConventer(), Date.class);

    • 对用户密码使用md5加密
      md5是不对称的加密、不可逆的、且同一字符串加密后的结果相同;
      可以使用sql语句加密,比如INSERT INTO user(uid, password) VALUES('101', MD5('8883499'));,但开发中一般不这么用;
      开发中在获取到前台表单、封装数据时,使用java api对password进行md5加密后,保存到数据库中;

    • 发送邮件验证:
      电子邮箱:就是在邮件服务器上开启的一块空间
      服务器:提供邮件服务
      协议:规定数据的格式
      发送邮件的协议:smtp
      接受邮件的协议:pop / pop3 imap
      测试阶段:可使用易邮邮件服务器软件作为本地邮件服务器,foxmail作为客户端收发邮件进行测试,在邮件服务器中新建一个service@主机名.com作为客服账号
      邮件验证步骤:当用户注册会员时,我们的service会想向用户的邮件中发送一条用户激活邮件,提醒用户点击链接进行激活,这个链接中带有user?method=active&code=激活码(这个激活码在用户注册时,已自动生成并保存在数据库中),当用户点击时,服务端会去UserServlet中查找active的方法,内部调用secvice层->dao层,通过激活码去数据库查找用户,若用户不为空就修改用户的激活状态state为1即可;

    • 1.2.用户激活功能

      • 用户点击邮箱的链接激活账户:比如http://localhost:8080/Store/user?method=active&code=824736A172A04023A7D71A498B8F6DF1
        服务端需要在UserServlet编写一个active方法:方法内需获取激活码 ->调用service完成激活->最后页面跳转, 请求转发到 jsp/msg.jsp提示用户
        在UserService中编写active(code)方法传入code:通过激活码获取一个用户->用户有可能为空->若不为空,修改用户的state 将0改成1
    • 1.3.用户登录

      • 步骤分析:
        1).在index.jsp的登陆链接 点击时最终需要跳转到login.jsp,我们可以通过先跳转到UserServlet,通过loginUI进行请求转发到login.jsp
        2).修改login.jsp页面上的form表单: method=post、 给每个标签添加name属性、action="/store/user?method=login"
        3).login操作:首先获取表单数据用户名和密码(由于数据库总密码为MD5加密过的,所以这里在查询时,需将表单获取的密码md5加密后再查询)->调用service层获取一个user,判断user是否为null,若为null则登陆失败,若不为null则继续判断是否已激活->若用户已激活,则将用户放到session中;
        4).登陆成功时,页面重定向到首页上,展示用户名、退出按钮、我的订单
    • 1.4.注销用户:

      • 步骤分析:
        1)当点击jsp页面上注销按钮时,跳转到UserService页面,根据后面的method调用servlet的logout方法
        <li><a href="${pageContext.request.contextPath }/user?method=logout">退出</a></li>
        2).logout方法内部-销毁session,然后页面重定向到主页,当有自动登录时还要移除cookie
    • 2.商品分类的展示

    创建CategoryServlet 它是用于处理首页的商品分类信息与服务器之间的交互

    • 商品分类最初的设计:当用户进入首页时,查询所有分类信息
    • 步骤分析:
      • 1).创建category商品分类表,并添加数据

    CREATE TABLE category (
    cid VARCHAR(32) NOT NULL PRIMARY KEY,
    cname VARCHAR(20) DEFAULT NULL
    ) ENGINE=INNODB DEFAULT CHARSET=utf8;

        - 2).在IndexServlet中查询搭配所有的商品分类数据
        - 3).调用CategoryService层findAll()方法去数据库查询所有商品分类数据,此方法返回值应为List集合
        - 4).在index.jsp页面,显示导航标题时,使用c:forEach 语句遍历存入request域中的cList商品分类集合
    

    <ul class="nav navbar-nav">
    <c:forEach items="${cList }" var="c">
    <li><a href="#">${c.cname }</a></li>
    </c:forEach>
    </ul>

       - 5).此时存在的问题:由于只在访问首页index.jsp时才显示分类列表信息,进入其他页面时,比如注册或登陆时,不显示查询到的商品分类信息
       > 解决方法:要让所有的页面都显示分类列表信息,只需要将页面上的logo和菜单部分都包含进来即可,然后在页面加载成功之后,发送一个ajax请求,异步查询所有分类信息,服务器返回json数据即可,需要使用的技术有(json、包含、ajax)
       - 解决此问题的步骤:
    1).新建一个head.jsp,将index.jsp中的菜单栏和导航条剪切到head.jsp中,将head.jsp包含到所有需要显示菜单栏和导航条的页面中(如果是请求转发、包含、错误路径,都是使用内部路径)
    静态包含:```<%@include file="/jsp/head.jsp" %>```
    动态包含:```<jsp:include page="/jsp/head.jsp"><jsp:include>```
    2).每次加载head.jsp时发送ajax请求,去CategoryServlet中异步获取商品分类信息,所以就不通过之前IndexServlet中的直接将cList放入request域中,而是CategoryServlet中将查询到的cList转换为json后,response再写回客户端
    3).展示商品分类列表:客户端确定事件,获取需要修改的元素,遍历服务端返回的json数据,append数据
       - 6).使用缓存技术,将不经常改变的数据,缓存到服务器的内存中,避免每次切换页面都会去数据库查询,减轻服务器压力;
         > 常见的缓存技术:ehcache(hibernate中低层使用的它)、 memcache、redis
         ehcache使用步骤:1.导入jia包->2.编写配置文件->使用api
         ehcache机制:Service层在获取数据时先从缓存中获取,若获取的值为空,再去查询数据库,并将查询数据放入缓存中
    - 3.首页上热门商品和最热商品展示
      - 步骤分析:
    页面加载的时候,查询最新商品和热门商品即可,由于是在首页中展示的,所以在IndexServlet的index方法中处理即可;
    去数据库查询最新商品时,按照商品上架日期倒序查询即可,查询热门商品时,根据商品是否热门及商品上架日期降序查询,查询的结果为两个list集合,将两个list放入request域中,请求转发到index.jsp即可;
    在index.jsp中取出集合,使用for循环展示数据
      - 准备工作:
    创建product商品表,并添加数据
    ProductServlet、Product、ProductDao、ProductService
    

    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,
    pdesc varchar(255) DEFAULT NULL,
    pflag int(11) DEFAULT NULL,
    cid varchar(32) DEFAULT NULL,
    PRIMARY KEY (pid),
    KEY sfk_0001 (cid),
    CONSTRAINT sfk_0001 FOREIGN KEY (cid) REFERENCES category (cid)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

        INSERT INTO `product` VALUES ('1','小米 4c 标准版',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.单个商品详情页
       - 步骤分析:
    当在首页上,点击每个商品时,跳转到商品详情页```<a href="/store/product?method=getByID$pid=${p.pid }"></a>```
    创建ProductServlet作为商品模块的servlet,编写getByID方法,此方法内:获取表单(用户点击的商品pid)->调用service层查找商品(返回值Product)->将product放入request域中,请求转发到product_info.jsp中显示商品详情
    
    - 5.分页展示商品
     - 步骤分析 
    1).当点击菜单上某一个商品分类按钮时,将此分类的商品分页展示出来```<a>/store/product?method=findByPage&cid=${分类id}&currentPage=1</a>```
    2).添加一个javabean:PageBean实体:包含List<T>、currentPage、totalPage、totalCount、pageSize
    3).在ProductServlet添加findByPage方法: 1.获取表单数据cid、currentPage, --> 2.调用service层,查询当前页商品和商品总数并将其封装在PageBean中返回 -->3.将pageBean放入request域中,请求转发到jsp/product_list.jsp
    4).在product_list.jsp中展示数据
    
    - 6.浏览记录
    > 当进入一个商品详情页时,需要记录当前的商品的ID:```<a href="&{pageContext.request.contextPath }/product?method=getByID&pid=${pid }"></a>```
    我们需要在ProductServlet的getByID方法中处理cookie
    规定:浏览记录只显示3条,cooie的名称:ids, value格式为3-2-1(拼接商品id,最新的拼接在前面,超过3条就切剪掉value后面的)
    
     - 技术分析:cookie
     - 步骤分析:
       - 1).在getByID方法中,通过cookie名获取指定的cookie:
       - 2).判断cookie是否为空:
         - 若cookie不为空: 获取value值,继续判断value值中有无该商品的id(将value值按-切割为list集合),
    若有商品id,先移除该id,然后将商品id放入到list的最前面,
    若没有商品id,继续判断list的长度是否>=3,若>=3移除最后一个,将当前的商品id放入list的最前面,若<=3就将当前商品id放入list的最前面,最后将list转换为字符串即可;若list为空,直接将当前商品id放入cookie中即可
         - 若cookie为空:创建cookie,通过response添加cookie
       - 3).在product_list.jsp中需要将cookie里面的商品展示出来:
         - 需要在jsp中获取指定的cookie
         - 判断cookie是否为空,若不为空,获取cookie的value,对value进行切割字符串,获取每一个商品的id,通过id去数据库中查找商品信息,并展示结果
    
    -6 将商品添加到购物车

    相关文章

      网友评论

          本文标题:Java Web商城项目笔记

          本文链接:https://www.haomeiwen.com/subject/pdixwttx.html