前几天复习完了Servlet和JSP方面的知识,于是想着汇总一下,然后就想开发一个简化版的购物车,虽说是简化版但是购物车的逻辑与天猫,京东的购物车逻辑基本一样,下面就让我们来看一下这个购物车是如何实现的吧。
说明:本文是借鉴某大佬的教材,文末我会说明出处
主要做以下几点开发:
- 类关系
- 产品模块
- 用户模块
- 购物车模块
- 订单模块
首先我们先要明确一些基本的关系,有产品、订单、用户、订单项,前三个都挺好理解的,就是第四个订单项是什么呢?订单项说白了就是一条记录,在一个session里面放了好几个相同的订单。那么他们之间的关系是怎样的呢?产品和订单项之间是一对多的关系,订单项和订单的关系是多对一,订单和用户之间的关系是多对一。介绍完了类与类之间的关系之后我们就要进行开发了。
首先我们要创建一个数据库并新建一个product表,然后插入四条数据以备后用
然后再在idea中创建相对应的实体类,字段要与数据库中的字段一一对应,然后我们需要创建一个product表的DAO用作查询数据,由于是简化版的购物车这里我只做了查询操作,接下来我们就需要一个servlet来调用DAO并且将数据显示到浏览器上了,代码如下:
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
List<Product> products = new ProductListDAO().list();
req.setAttribute("Product",products);
req.getRequestDispatcher("JSP/listProduct.jsp").forward(req, resp);
}
在JSP中大概的意思就是有一个表格,然后每一行都是根据传过来的数组进行增加的。效果如图:
如果登陆失败的话会重新跳转到登录页面,登陆的servlet代码如下:
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
String name = req.getParameter("name");
String password = req.getParameter("password");
User user = new UserDAO().getUser(name, password);
if (null != user.getName()){
System.out.println("登录成功!");
req.getSession().setAttribute("user",user);
resp.sendRedirect("ProductListServlet");
}else {
System.out.println("登录失败!");
resp.sendRedirect("index.jsp");
}
}
然后再就是用户模块,刚才实现的用户登录就是用户模块的内容,大体实现过程我来简单描述一下,首先需要一个user表,然后需要有对应的entity类,然后依然是需要有一个用作查询用户表内容的DAO,姑且就叫他UserListDAO吧,查出来的东西得有地方用吧?所以我们需要一个servlet,用作验证输入的是否正确就是上面那一部分代码,正确的话就把用户的内容传过去,就能实现登陆了。
然后需要做的就是关于购物车的显示模块了,我们不妨仔细的想一想,购物车里面的哪一些订单是怎么实现的呢?不就是相同的订单放在一个订单项里面,然后会有很多个订单项,你可以买相同的商品买一个或者是多个,但是如果买多个的话只能产生一个订单项,如果相同的商品买了三个,然后对应三个订单项那这就是不正确的。在这个阶段订单项都是保存在session当中的,只有到最后提交订单的时候才会保存到数据库中。
这里我们需要新建一个订单项的类OrderItem,里面放着数量和商品的信息,由于在购买商品的时候提交的是一个pid,而OrderItem中的是Product,所以我们需要根据id查找商品的价格和名称。其实购买行为本身就是创建一个OrderItem的过程,因为每次创建了一个新的订单,然后就要新建一个OiderItem对象然后再把价格名称放进去,最后添加到集合当中,首次创建的时候集合是空的然后就要把首个记录放进去,然后跳转到显示界面,之后在进行加入购物车的操作之后就会直接加进来。
在显示购物车的时候更简单,几乎都在servlet当中都做好了,就是把数据显示出来而已,另外再增加一个删除操作。
刚才说到相同的订单不管数量是多少都对应一条订单项,然后我们需要在servlet当中进行判断是否是相同的id,如果是的话只改变数量就可以了。
boolean found = false;
for (OrderItem orderItem : ois) {
if (orderItem.getProduct().getId() == oi.getProduct().getId()) {
orderItem.setNum(orderItem.getNum() + oi.getNum());
found = true;
break;
}
}
if (!found)
ois.add(oi);
删除操作大体思路就是把这条订单项也就是这个商品的id号传到servlet当中,然后将集合进行遍历,比较,如果找到对应的订单项,那么就remove删除此记录。跳转到购物车界面。
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
int id = Integer.parseInt(req.getParameter("id"));
List<OrderItem> ois ;
ois = (List<OrderItem>) req.getSession().getAttribute("ois");
for (OrderItem orderItem : ois) {
if(orderItem.getProduct().getId()==id){
ois.remove(orderItem);
req.getSession().setAttribute("ois", ois);
break;
}
}
resp.sendRedirect("/listOrderItem");
}
前面根据购物车的逻辑已经做好了下单之前额所有准备了,当我们在淘宝上下单的时候加入购物车确定数量之后接下来要做什么呢?没错,就是提交订单然后付款了,提交订单之后购物车的使命就正式结束了。那么然后我们接下来就做一下清空购物车的操作吧!
大致做完了购物车的逻辑实现,先贴几张图片看看效果吧
我们看完了效果再说一下逻辑,首先我们需要两个表,一个是用来存储用户信息的表,另一个是用来存储购物车里面的信息的表,购物车里面的信息出了商品名数量还有价格之外,还有对应的用户名,因为每次提交订单都是同一个对象提交的订单,不可能是两个对象提交了同一个订单,所以我们知道了这个逻辑之后就要新建一个servlet对其进行操作,我们也要新建两个DAO一个是用来存储用户名的另一个是用来存储购物车里面的信息的,servlet里面做的事情就是验证是否已经登录(这是各大电商平台的下单的逻辑,没有登陆的话必须先登录)。如果不为空的话就先把用户名的id存入到数据库中,有了用户的id就可以遍历购物车里面的内容了,然后每遍历一项都要把这个用户的id存进去,然后再把整个的订单项存到数据库当中,当购物车里面的东西都存好之后就要清除购物车了,因为这个购物车里面的东西是一个集合,没有涉及到数据表,所以我们只需要调用集合的clear方法,清空即可。
提交订单的servlet代码:
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
User u = (User) req.getSession().getAttribute("user");
if (null == u){
resp.sendRedirect("JSP/index.jsp");
}
Order o = new Order();
o.setUser(u);
//将这个购物车的用户存入数据库
new OrderDAO().insert(o);
List<OrderItem> ois = (List<OrderItem>)req.getSession().getAttribute("ois");
for (OrderItem oi:ois) {
oi.setOrder(o);
new OrderItemDAO().insert(oi);
}
//清空购物车
ois.clear();
resp.setContentType("text/html; charset=UTF-8");
resp.sendRedirect("JSP/success.jsp");
}
清空之后也就代表着下单完成了,跳转到订单完成界面就ok了,如果是在真正的购物的时候是需要跳转到支付界面的,由于我们这里是简化版的所以这一步我们就省略了,只要知道大概的逻辑就可以了。
好了,以上这些就是开发一个简化版购物车的所有逻辑,基本上所有的电商平台开发购物车的逻辑与之无二,所以有了这个逻辑去开发更全面的购物车也会顺手一些,继续努力吧骚年们~