使用MVC架构和session做了个简单的添加购物车场景

一、MVC三层架构

      

(一)什么是MVC三层架构

          MVC全称(Model-View-Controller)即模型层、视图层、控制层,是JavaWeb服务器比较主流的代码设计模式,宗旨高内聚、低耦合,也就是追求每层内部的元素尽量能独立完成某一功能,关联性强的情况下还不能有很高的依赖性,当一层代码进行改进后,其他层的尽可能不受其影响,这也对后期代码的维护、迭代更新更方便。

(二)MVC分层

     Model层

            即数据模型层,一般应用中包括业务逻辑层dao和数据访问层Service。数据访问层主要是对数据库访问时的操作进行一些封装,业务逻辑层主要作用是将Controller控制层的数据和数据库封装的操作进行一个桥接。除此之外还进行一些复杂的业务逻辑和事务的处理。

    Controller层

            即数据控制层,一般是对View视图层提交为其设置对应的Servlet进行特定功能的处理。 也是进行HTTPServlet操作的主要层之一,这里面进行的特点功能一般是model层里面封装的数据  和方法。

    View层

            即视图层,主要作用就是编写一些前台的代码,也是最先呈现在客户面前的视图。这里面进行一些前端页面的编写,比如jsp、html、css。

二、Session的描述

           首先,我们要知道,服务器中的HTTP协议他是一种无状态的协议,目的是为了保证它的安全性。但这种无状态的协议也导致访问的问题,我们在进行一次请求,当服务器响应过后一次协议就结束了,也就是说这种协议虽然保证了服务器和客户端通讯的一个安全性,但它的存储数据却是十分的拉胯。所以我们才引出session域对象这一概念,当客户端第一次向服务器发出请求时服务器会为这个session对象创建一个特有的sessionID,当这个对象下次再进行请求时,就会携带着上次访问的数据,也就是说,这样会保证数据的一个存储,防止导致数据丢失的问题。

三、代码的实现

         通过上面我们对MVC和session对象的简单概述,相信大家已经对其有一定的了解,那么接下来就看看如何使用其实现对商品添加进购物车的场景:

       

通过上面,我们可以看到,MVC的三层架构,分别是controller数据控制层,其中包括两个servlet类,也就是实现session功能的类,进行添加购物车的操作。其次就是model模型层,其中包括三个分层:dao数据访问层和、model模型和service业务逻辑层。数据访问层用来实现数据库的连接与访问,业务逻辑层就是对数据库操作的封装进行第二次封装,主要目的就是实现架构的高内聚低耦合的理念,model模型里面有一个数据库中表对应的类,这里也应用了ORM编程思想,一个表对应一个类,一个属性对应一个表中的列,属性值就是一列对应的值,每一行就是一个product对象。最后是view视图层,也就是进行后台提供后的数据进行页面呈现。

Model层

     dao数据访问层

package com.ujiuye.dao;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import com.ujiuye.model.Product;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;

import java.sql.SQLException;
import java.util.List;

public class CartDao {
    //实例化连接池c3p0
    ComboPooledDataSource source = new ComboPooledDataSource();
    //实例化dbutils
    QueryRunner qr = new QueryRunner(source);
    public List<Product> findAllCart() {
        //创建SQL语句
        String sql = "select * from product";
        //执行SQL
        try {
           return qr.query(sql,new BeanListHandler<Product>(Product.class));
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    public Product findCart(String pid) {

        //创建要执行的SQL语句
        String sql = "select * from product where pid=?";
        //执行语句
        try {
            return qr.query(sql,new BeanHandler<Product>(Product.class),pid);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
}

 model模型

package com.ujiuye.model;

public class Product {
  //商品号
  private int pid;
  //商品名
  private String pname;
  //商品价格
  private double price;
  //商品的描述
  private String pdesc;
  //商品发布时间
  private String createTime;

  public Product() {

  }

  public Product(int pid, String pname, double price, String pdesc, String createTime) {
    this.pid = pid;
    this.pname = pname;
    this.price = price;
    this.pdesc = pdesc;
    this.createTime = createTime;
  }

  public int getPid() {
    return pid;
  }

  public void setPid(int pid) {
    this.pid = pid;
  }


  public String getPname() {
    return pname;
  }

  public void setPname(String pname) {
    this.pname = pname;
  }


  public double getPrice() {
    return price;
  }

  public void setPrice(double price) {
    this.price = price;
  }


  public String getPdesc() {
    return pdesc;
  }

  public void setPdesc(String pdesc) {
    this.pdesc = pdesc;
  }


  public String getCreateTime() {
    return createTime;
  }

  public void setCreateTime(String createTime) {
    this.createTime = createTime;
  }

  @Override
  public String toString() {
    return "Product{" +
            "pid='" + pid + '\'' +
            ", pname='" + pname + '\'' +
            ", price=" + price +
            ", pdesc='" + pdesc + '\'' +
            ", createTime='" + createTime + '\'' +
            '}';
  }
}

 service业务逻辑层

import com.ujiuye.dao.CartDao;
import com.ujiuye.model.Product;

import java.util.List;

public class CartService {
    //创建CartDao的实例
    CartDao dao = new CartDao();
    public List<Product> findAllCart() {
        return dao.findAllCart();
    }

    public Product findCart(String pid) {
        return dao.findCart(pid);
    }
}

 controller数据控制层:

     第一个类是商品列表的操作,第二个类是进行session的操作。

package com.ujiuye.controller;

import com.ujiuye.model.Product;
import com.ujiuye.service.CartService;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

@WebServlet("/cart")
public class CartServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //1.调用业务,存储在集合中
        CartService service = new CartService();
        List<Product> list = service.findAllCart();


        //2.存储在请求域对象中
        req.setAttribute("list",list);

        //转发到view视图层
        req.getRequestDispatcher("/view/1.jsp").forward(req,resp);
    }
}
package com.ujiuye.controller;

import com.ujiuye.model.Product;
import com.ujiuye.service.CartService;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@WebServlet("/session")
public class SessionServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取pid
        String pid = req.getParameter("pid");

        //根据id获取商品对象
        CartService service = new CartService();
        Product product = service.findCart(pid);

        //获取购物车
        List<Product> card = getCard(req.getSession(), resp);
        //将商品添加进集合
        card.add(product);
        //重定向到2.jsp来显示购物车商品信息
        resp.sendRedirect(req.getContextPath()+"/view/2.jsp");

    }

    public static List<Product> getCard(HttpSession session, HttpServletResponse response){
        //实例化cookie
        Cookie cookie = new Cookie("JSESSIONID",session.getId());
        //设置cookie的存活时间
        cookie.setMaxAge(60*60);
        //响应给客户端存储在浏览器中
        response.addCookie(cookie);
        //域对象session获取cart键值
        ArrayList<Product> cart = (ArrayList<Product>) session.getAttribute("cart");
        //判断cart是否为空
        if (cart == null){
            //实例化ArrayList
            cart = new ArrayList<Product>();
            //session存储cart键值
            session.setAttribute("cart",cart);
        }
        //返回cart
        return cart;
    }
}

view层:

     第一个jsp是对商品列表操作进行的展示,第二个jsp是对添加购物车之后展示的操作。

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2021/6/26 0026
  Time: 17:29
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!-- 导入jsp通用标签库 -->
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
   <style>
       #div1{
           width: 800px;
           height: 100px;
           background-color: aliceblue;
           font-size: 30px;
           line-height: 80px;
           color: brown;
       }

       #div2{

       }

       tr{
           background-color: aliceblue;
       }

       a{
           text-decoration: none;
       }
   </style>
<body>
   <center>
   <div align="center" id="div1">今日爆火商品</div>
   </center>
   <div id="div2">
   <table border="1px" width="800px" cellpadding="7px" cellspacing="0px" align="center">
       <tr>
           <th>商品编号</th>
           <th>商品名称</th>
           <th>商品价格</th>
           <th>商品描述</th>
           <th>发布时间</th>
           <th>添加购物车</th>
       </tr>
       <c:if test="${list!=null}">
           <c:forEach items="${list}" var="p">
               <tr>
                   <td>${p.pid}</td>
                   <td>${p.pname}</td>
                   <td>${p.price}</td>
                   <td>${p.pdesc}</td>
                   <td>${p.createTime}</td>
                   <td>
                       <a href= "/ShoppingCart/session?pid=${p.pid}">添加购物车</a>
                   </td>
               </tr>
           </c:forEach>
       </c:if>
   </table>
   </div>
</body>
</html>
<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2021/6/26 0026
  Time: 22:16
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<table border="1px" width="800px" cellpadding="7px" cellspacing="0px" align="center">
    <tr>
        <th>商品编号</th>
        <th>商品名称</th>
        <th>商品价格</th>
        <th>商品描述</th>
        <th>发布时间</th>
    </tr>
    <c:if test="${cart!=null}">
        <c:forEach items="${cart}" var="p">
            <tr>
                <td>${p.pid}</td>
                <td>${p.pname}</td>
                <td>${p.price}</td>
                <td>${p.pdesc}</td>
                <td>${p.createTime}</td>
            </tr>
        </c:forEach>
    </c:if>
</table>
</body>
</html>

最后是页面效果的展示,制作不易,谢谢大家啦!!!

 

 


版权声明:本文为weixin_56575384原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。