一、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>
最后是页面效果的展示,制作不易,谢谢大家啦!!!

