A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 厦门校区 黑马粉丝团   /  2018-6-23 18:01  /  1449 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

同学们,今天主要就是购物模块与订单模块,这两块算是网上商城项目的核心内容也是难点内容,实现逻辑要比登录等复杂一些。

今日需要掌握的有:
  • 理解耦合的缺点,我们通过用工厂+反射+配置文件是如何做到的解耦,和之前最大的区别是什么?
  • 购物车模块主要就是对添加和移除
  • 订单模块涉及到两张表,理解两张表之间的关系,对实现逻辑要搞清楚


请同学们按照如上要求,总结今日所学。




13 个回复

倒序浏览
常小天
今天继续商城实战,新学习了一个工厂+反射+配置文件解耦合的方法。之后就是常规的商城代码的编写,所以就只总结一下业务逻辑。
在之前的案例中,我们都是在servlet和service中直接new下一层级的对象再调用方法。这样做会使程序具有侵入性,耦合性高,维护难度大。为了解决这一问题,我们将new的操作移到工厂中进行,将之前程序之间的耦合性转移到了工厂中,一定程度的降低了维护难度,但程序间的耦合性依然存在。所以我们进一步引入了反射和配置文件来解决这一问题。在配置文件中将不同实现类的全限定名和不同的id绑定起来,在工厂中解析配置文件,从配置文件中获得实现类的全限定名,这样就可以利用反射创建实现类的实例,在将实例返回给调用方法的位置。这样,在程序中我们只用调用工厂的静态方法来获得实例,当实现类改变的时候只用修改配置文件即可。
购物模块的业务逻辑比较复杂。当我们在商品详情页面点击加入购物车后,访问servlet,并同时传递商品id和购买数量两个参数。在servlet中,获得商品id和购买数量后先封装进购物项对象,购物项对象中包含商品实体类对象、购买数量和小计,这里小计通过计算获得。购物项对象封装好了之后,将购物项对象再添加进购物车对象的购物项集合中。购物车对象中包含购物项集合和总计两个成员。总计通过累加购物项的小计获得。添加完之后将购物车对象存入session,之后每次添加商品进购物车的时候都先从session中获得购物车对象,没有在新建。一件新商品添加进购物车的时候先判断购物车中是否已经有这种商品,如果有则直接在购物项中增加数量即可,如果没有在按照上面的步骤进行添加。
在购物车页面点击删除单个购物项时,会携带pid访问servlet,在servlet中调用购物车实体类的删除单个项的方法并将pid传参即可,方法的实现就是map集合中根据key删除元素。在购物车页面点击清空购物车时,直接访问servlet中的清空方法,servlet在调用购物车实体类的清空购物车方法,方法的实现就是map集合的clear方法。
订单模块的业务逻辑也比较复杂。当我们点击提交订单之后。首先我们可以先判断一下session中有没有购物车对象,以及用户有没有登录。只有两个都满足我们才进行后面的操作。当满足要求时,我们要对订单数据进行封装。订单的实体类中包含订单id、订单时间、订单状态和订单项集合。前三个很简单,复杂的是订单项集合的封装。封装订单项集合时,我们要获得购物车对象,从购物车对象中获得购物项集合,遍历购物项集合,将其中的每一个购物项的信息搬进订单项对象中,每完成一个就往订单项集合中添加一个,添加完所有的订单项后,要清空购物车,之后将订单对象存入数据库,同时将订单对象存入域中,在进行页面跳转。当然在将订单对象存入数据库的时候要注意订单信息复杂,一部分存入订单表,另一部分要存入订单项表。此时应设置事务管理,保证两个表中都存好信息才算成功。之后就可以在jsp页面显示订单信息了。从域中获得订单对象,遍历订单项集合并输出即可。

点评

发表于 2019-7-21 00:38
回复 使用道具 举报
林文辉
BeanFactory工厂
1.在原先过程中都是通过多态直接去new一个实现类,这样有个很大的问题就是如果

需要使用不同的实现类,那需要去修改大量的代码,这也违法了OCP原则。

2.通过 工长+反射+配置文件 对类之间进行解耦合操作,这样如果要使用不同的实现

类只需在配置文件里修改class属性就行了,也就是Spring中的IOC原则,控制反转,

将调用者的控制权转到配置文件中,由配置文件来生成实例。

购物车模块的添加和删除:

1.将购物项存入Map集合中,然后使用Pid做key,这样可以通过pid找到对应的购物项

并可以通过remove或put来进行相应的添加和删除。

2.在进行添加和删除时,无需再存入session中,因为取出来时是放在Cart  cart的引用中,

cart指向的是session中的cart地址,所以再进行相应的添加和删除时,地址值也会发生

相应的变化,只要引用对象没有发生改变。

订单模块两表。

1.这是一个1对多的关系。一个购物车有多个购物项,一个购物项只属于一个购物车。

在表中我们是通过在购物项表中添加购物车的主键作为外键。但是在表中,我们需要

用不同的方式去表示这两者的关系。购物车对购物项属于一对多关系,所以购物车的

类中需要存放一个购物项的集合,来表示一对多的关系。购物项对购物车是多对一的

关系,所以需要在购物项中添加一个购物车的对象属性,来表示多对一的关系。


回复 使用道具 举报
陈叶隆
购物车业务逻辑:
1. 封装实体
* 购物项:
    * 商品对象:
    * 数量:
    * 小计:
* 购物车:
    * 购物项集合:
    * 总计:
2. 加入购物车的代码实现:
在商品详情页面点击【加入购物车】:
添加到Servlet:
调用封装的购物车对象addCart的方法:
页面跳转:(购物车的页面)
3. 清空购物车:
在购物车的页面中点击清除购物车的链接:
提交到Servlet:
* 调用Cart中的clearCart的方法:
* 跳转到购物车页面:
4. 移除购物项:
在购物车的页面中点击 删除的链接:
提交到Servlet:
* 调用Cart中的removeCart的方法:
* 跳转到购物车页面:
回复 使用道具 举报
汪志阳:
1.创建购物车javaBean实体:商品(已存在),购物项(数量,小计[需改写方法]),购物车(以map封装购物项key=pid,购物项为value,总计价)生成get方法
2.CartBean中添加购物项和删除购物项的方法:
增加addCart:1.以pid判断购物项存在购物车中否:存在(已存在购物项获取该pid并+传入的pid累计设置);未存在:(添加该商品如map)2.计算总计价
移除:从购物项中移除pid(整个购物项整体删除某个购物项,返回对象没有变化,该对象可以为获取购物金额小计的对象),计算总金额
清空:购物项清空;金额清空
购物车数据存入ssession中,编写一个工具类getCart(获取session,存入cart,如果不存在购物车再新建,避免资源的浪费)
后台页面:接收数据,调用业务层方法findByPid处理,封装为item购物项对象,调用获取购物车的方法添加购物项,最后页面跳转到jsp

点评

发表于 2019-7-21 00:38
回复 使用道具 举报
汪志阳:
1.创建购物车javaBean实体:商品(已存在),购物项(数量,小计[需改写方法]),购物车(以map封装购物项key=pid,购物项为value,总计价)生成get方法
2.CartBean中添加购物项和删除购物项的方法:
增加addCart:1.以pid判断购物项存在购物车中否:存在(已存在购物项获取该pid并+传入的pid累计设置);未存在:(添加该商品如map)2.计算总计价
移除:从购物项中移除pid(整个购物项整体删除某个购物项,返回对象没有变化,该对象可以为获取购物金额小计的对象),计算总金额
清空:购物项清空;金额清空
购物车数据存入ssession中,编写一个工具类getCart(获取session,存入cart,如果不存在购物车再新建,避免资源的浪费)
后台页面:接收数据,调用业务层方法findByPid处理,封装为item购物项对象,调用获取购物车的方法添加购物项,最后页面跳转到jsp
回复 使用道具 举报
谢洪彬:
商城购物项目(三)
今天完成了加入购物车和生成订单的案例:
订单表关系:
商品表和订单表均是多对多的关系,
一个商品可能存在多个订单中,一个订单也会存在多个商品,所以这是我们需要创建中间表.
中间表中可以有两个外键分别指向商品的主键,和订单的主键
使用反射+配置文件去解耦合
原理:        写一个BeanFatory工具类,在工具类的方法中去获取我们自己配置的xml文件,利用dom4j+xpath去找到指定id去寻找class属性的值,拿到class属性的值也就是类的全类名,这是我们就可以通过反射去完成实体的创建.
在我们实际开发中我们就可以使用工具类传入指定的id去获取指定的实体类.
在后期的开发过程中,如果我们需要去变更接口的实现,只需要让这个新的实现类去实现接口并修改配置文件就可以了,不需要更改源代码就可以完成操作.
购物车的案例:
思路:       
1.进行购物车的代码实现时,我们需要在session中获取Cart对象,保证实体对象的唯一性,否则会发生每一次添加的商品都存放在不同的Cart对象中.
2.购物车使用map集合来存储购物项是因为要对购物项进行添加删除操作,方便操作
3.添加方法需要判断map集合中是否存在该商品,存在则只需将数量进行更改
4.添加方法最后都需要将总金额的值进行修改
购物项的案例:
思路:
1.分别封装订单实体和订单项实体
2.大部分封装的数据从session中拿到Cart对象获取
3.从域中获取对象形式的数据需要进行非空判断
4.由于需要将订单和订单项的数据存储到数据库中,所以需要开启事务来进行操作,要么同时成功,要么同时失败
5.在生成订单后我们需要将购物车的内容进行清空在进行页面跳转
6.订单中使用list集合来存储订单项的作用只是为了显示作用,因为订单一旦生成,订单项就不可改变.

回复 使用道具 举报
李思贤:工厂模式:
工厂模式+反射+配置文件完成程序解耦合. 方便以后程序的扩展,对程序底层进行切换的时候不用改源代码.用到了dom4j,要导2个包.

一个工厂工具类,一个配置文件.
解析XML  :dom4j
                        SAXReader reader =new SAXReader();
                        Document document = reader.read(BeanFactory.class.getClassLoader().getResourceAsStream("applicationContext.xml"));
                        //获得class中的内容
                        Element beanElement = (Element) document.selectSingleNode("//bean[@id='"+id+"']");
                        String value = beanElement.attributeValue("class");
                        System.out.println(value);
                        //反射生成实例
                        Class clazz = Class.forName(value);
                        return clazz.newInstance();


购物车代码实现:

封装2个实体:
购物项:商品,数量,小计  //小计get方法可由数量*商品价格得的.set方法不用了
购物车:购物项的集合(用map装),总计
购物车实体还要有方法 添加购物项方法+移除购物项方法+清空购物车方法.

加入购物车操作:
商品详情页面点击加入购物车:
添加到Servlet:(要传过去form表单,还要有2个隐藏字段 method 和 pid)
调用封装购物车的方法:购物车从Session中拿
接收参数:
页面跳转:(购物车页面),这里用转发会发生重复提交,所以用重定向.
接下来就是在jsp中显示了,这里要注意商品在购物项里,购物项在购物车里.
比如拿到商品名称:  ${ entry.value.product.pname }


清空购物车操作:
方法封装好了,点击清空,调到servlet.带着?Method=clearCart,在Servlet中调用clearCart方法就行了,重定向到cart.jsp.基本操作就完事了,想让购物车页面显示,”购物车空空的哦”,就要引入fn标签了,判断cart.map长度
c:if test="${ fn:length(cart.map) == 0}">
                        <h1>购物车空空的哦~~快去购物吧</h1>
                        <img  src="${ pageContext.request.contextPath }/image/Cart.jpg">
                </c:if>



移除购物项:
点击删除添加到Servlet,这里要传pid
调用Cart.removeCare方法

在删除标签一个点击事件....忍心删除?
判断 是->window.location.href="${ pageContext.request.contextPath }/CartServlet?method=removeCart&pid="+pid;



订单模块:
需求:点击提交订单,向订单表和订单项表插入记录,使用事物。
准备工作:创建表和实体

生成订单部分:
1点击提交订单;提交到Servlet;
2在Servlet中先封装Order对象,总金额从购物车中拿,订单用户从登陆信息中拿,设置订单项(遍历购物车Map中values,一步步拿到数据封装到orderItem中,最后订单项添加到订单中  order.getOrderItems().add(orderItem);)
调用业务层保存订单:
要用事务来保证插入表中.要插入数据向两张表中,订单表和订单项表.
这就插入成功了,此时要清空购物车.
页面跳转到订单页面。
在订单页面显示就可以
回复 使用道具 举报
许剑鸿 webDay28商城实战三总结

购物模块

加入购物车
        在商品详情页面点击【加入购物车】:
        添加到Servlet:
        调用封装的购物车对象addCart的方法:
        页面跳转:(购物车的页面)

清空购物车
        在购物车的页面中点击清除购物车的链接:
        提交到Servlet:
        * 调用Cart中的clearCart的方法:
        * 跳转到购物车页面:

移除购物项
        在购物车的页面中点击 删除的链接:
        添加到Servlet:
        * 调用Cart中的removeCart的方法:
        * 跳转到购物车页面:


订单模块

生成订单
        在购物车的页面中点击提交订单:
        提交到Servlet中:
        * 事务管理:向订单表和订单项表插入记录.
        * 页面跳转到订单页面
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马