使用Servlet和三层架构来完成购物车项目?
目录:
项目目录展示
项目的具体编写
a. 数据库帮助类的编写
b. 实体类的编写
c. jsp界面的编写
d. Filter过滤器在项目中的运用
e. 表示层的编写
f. 业务逻辑层的编写
g. 数据库访问层的编写
相关知识:
项目目录展示:开发软件:支持web开发的eclipse
开发模式:三层架构
将Java代码从jsp文件中分离:使用Servlet技术实现
访问权限:使用Filter过滤器实现
项目的具体编写 a. 数据库帮助类的编写:
package com.zking.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import oracle.jdbc.driver.OracleDriver;
public class DBHelper {
//OracleDriver
//加载驱动
static {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (Exception e) {
e.printStackTrace();
}
}
//定义连接字符串
private static final String URL="jdbc:oracle:thin:@localhost:1521:orcl";
//获得连接
public static Connection getCon() {
try {
return DriverManager.getConnection(URL,"scott","123");
} catch (Exception e) {
e.printStackTrace();
}return null;
}
//关闭资源
public static void close(Connection con,PreparedStatement ps,ResultSet rs) {
try {
if(con!=null&&!con.isClosed()) {
con.close();
}if(ps!=null) {
ps.close();
}if(rs!=null) {
rs.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
System.out.println(DBHelper.getCon());
}
}
b. 实体类的编写:
User用户实体类:
package com.zking.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@SuppressWarnings("all")
@Accessors(chain = true)
public class User {
private Integer id;
private String account;
private String password;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User [id=" + id + ", account=" + account + ", password=" + password + "]";
}
public User(Integer id, String account, String password) {
super();
this.id = id;
this.account = account;
this.password = password;
}
public User() {
// TODO Auto-generated constructor stub
}
}
Goods商品实体类:
package com.zking.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@SuppressWarnings("all")
@Accessors(chain = true)
public class Goods {
private Integer id;
private String name;
private String describe;
private Integer price;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescribe() {
return describe;
}
public void setDescribe(String describe) {
this.describe = describe;
}
public Integer getPrice() {
return price;
}
public void setPrice(Integer price) {
this.price = price;
}
@Override
public String toString() {
return "Goods [id=" + id + ", name=" + name + ", describe=" + describe + ", price=" + price + "]";
}
public Goods(Integer id, String name, String describe, Integer price) {
super();
this.id = id;
this.name = name;
this.describe = describe;
this.price = price;
}
public Goods() {
// TODO Auto-generated constructor stub
}
}
OrserItem订单项实体类:
package com.zking.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@SuppressWarnings("all")
public class OrderItem {
private Integer id;
private Integer orderId;
private Goods goods;
private Integer quantity;
private Integer total;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getOrderId() {
return orderId;
}
public void setOrderId(Integer orderId) {
this.orderId = orderId;
}
public Goods getGoods() {
return goods;
}
public void setGoods(Goods goods) {
this.goods = goods;
}
public Integer getQuantity() {
return quantity;
}
public void setQuantity(Integer quantity) {
this.quantity = quantity;
}
public Integer getTotal() {
return total;
}
public void setTotal(Integer total) {
this.total = total;
}
@Override
public String toString() {
return "OrderItem [id=" + id + ", orderId=" + orderId + ", goods=" + goods + ", quantity=" + quantity
+ ", total=" + total + "]";
}
public OrderItem(Integer id, Integer orderId, Goods goods, Integer quantity, Integer total) {
super();
this.id = id;
this.orderId = orderId;
this.goods = goods;
this.quantity = quantity;
this.total = total;
}
public OrderItem() {
// TODO Auto-generated constructor stub
}
}
c. jsp界面的编写
login.jsp 登录页面:
<%--
User: yy
Date: 2022/4/24
Time: 18:43
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
登录界面
index.jsp 主页面:
<%--
User: hgh
Date: 2022/4/24
Time: 19:02
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
主界面
${user.account},您好, 这是首页
点我去购物车
| 商品编号 | 商品名称 | 商品描述 | 商品价格 | 商品操作 |
|---|---|---|---|---|
| ${goods.id} | ${goods.name} | ${goods.describe} | ${goods.price} | 加入 |
car.jsp 购物车页面:
<%--
User: hgh
Date: 2022/4/24
Time: 19:02
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
购物车界面
${user.account},您好, 这是购物车
继续购买
订单结算
查看订单
清空
| 商品编号 | 商品名字 | 商品数量 | 商品总价 | 商品操作 |
|---|---|---|---|---|
| ${item.goods.id} | ${item.goods.name} | ${item.quantity} | ${item.total} | 删除 +1 -1 |
d. Filter过滤器在项目中的运用
这里的Filter导包导入的是下面这个:
LoginFilter 登录过滤器:
package com.zking.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@SuppressWarnings("all")
@WebFilter("
@SuppressWarnings("all")
@WebServlet("/login.do")
public class LoginServlet extends HttpServlet {
private IUserBiz userBiz=new UserBizImpl();
//接收用户的数据: 【post】【get】
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
//参数的获取
String account = req.getParameter("account");
String password = req.getParameter("password");
User user = new User();
user.setAccount(account);
user.setPassword(password);
//去biz完成登录验证
// 表示层(servlet)->业务逻辑层(biz)->数据库访问层(dao)
User u = userBiz.login(user);
if(u==null){
resp.sendRedirect("login.jsp");
}else{
//将数据放到session中
req.getSession().setAttribute("user",u);
//为这个用户生成一个购物车
List car=new ArrayList<>();
req.getSession().setAttribute("car",car);
//把总价直接放到session中
req.getSession().setAttribute("total",0);
//去到首页
resp.sendRedirect("index.do");
}
}
}
IndexServlet.jsp的编写:
package com.zking.servlet;
import com.zking.biz.IGoodsBiz;
import com.zking.biz.impl.GoodsBizImpl;
import com.zking.pojo.Goods;
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;
@SuppressWarnings("all")
@WebServlet("/index.do")
public class IndexServlet extends HttpServlet {
private IGoodsBiz goodsBiz=new GoodsBizImpl();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//取到biz层中的商品数据的集合
List list = goodsBiz.list();
//把数据放到index.jsp中去显示
//request【转发】 session appliction
req.setAttribute("list",list);
//只有转发才能携带请求的数据
req.getRequestDispatcher("index.jsp").forward(req,resp);
}
}
AddServlet.jsp的编写:
package com.zking.servlet;
import com.zking.biz.IGoodsBiz;
import com.zking.biz.impl.GoodsBizImpl;
import com.zking.pojo.Goods;
import com.zking.pojo.OrderItem;
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;
@SuppressWarnings("all")
@WebServlet("/add.do")
public class AddServlet extends HttpServlet {
private IGoodsBiz GoodsBiz = new GoodsBizImpl();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//购物车在哪里?
List car = (List) req.getSession().getAttribute("car");
//是哪件商品?需要用户带一个商品的id
int id = Integer.parseInt(req.getParameter("id"));
//购物车中已经有了,数量+1
boolean f = true;
for (OrderItem item : car) {
// item就是订单项,订单项中有一个与他对应的商品
if (item.getGoods().getId().equals(id)) {
//数量+1
item.setQuantity(item.getQuantity() + 1);
//价格需要重新计算
item.setTotal(item.getQuantity() * item.getGoods().getPrice());
f = false;
break;
}
}
//购物车中没有,添加购物车
if (f) {
//生成了订单项
OrderItem item = new OrderItem();
//根据商品的id去数据库查出这件商品
Goods one = GoodsBiz.one(id);
item.setGoods(one);
item.setQuantity(1);
item.setTotal(one.getPrice());
//添加订单项到购物车
car.add(item);
}
req.getSession().setAttribute("total", car.stream()
.mapToInt(OrderItem::getTotal)
.sum());
//返回首页
resp.sendRedirect("index.do");
}
}
DelServlet.jsp的编写:
package com.zking.servlet;
import com.zking.pojo.Goods;
import com.zking.pojo.OrderItem;
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;
@SuppressWarnings("all")
@WebServlet("/del.do")
public class DelServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//购物车在哪里?
List car = (List)req.getSession().getAttribute("car");
//是哪件商品?需要用户带一个商品的id
int id = Integer.parseInt(req.getParameter("id"));
//购物车中已经有了,删除
OrderItem i=null;
for (OrderItem item : car) {
// item就是订单项,订单项中有一个与他对应的商品
if(item.getGoods().getId().equals(id)){
//你就是我要删除的
i=item;
break;
}
}
car.remove(i);
req.getSession().setAttribute("total",car.stream()
.mapToInt(OrderItem::getTotal)
.sum());
//返回首页
resp.sendRedirect("car.jsp");
}
}
UpdServlet.jsp的编写:
package com.zking.servlet;
import com.zking.pojo.Goods;
import com.zking.pojo.OrderItem;
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;
@SuppressWarnings("all")
@WebServlet("/upd.do")
public class UpdServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//购物车在哪里?
List car = (List)req.getSession().getAttribute("car");
//是哪件商品?需要用户带一个商品的id
int id = Integer.parseInt(req.getParameter("id"));
//获取需要改变的类型(1,-1)
int type = Integer.parseInt(req.getParameter("type"));
//购物车中已经有了,数量+1
for (OrderItem item : car) {
// item就是订单项,订单项中有一个与他对应的商品
if(item.getGoods().getId().equals(id)){
//数量+还是-
int count = item.getQuantity() + type;
if(count<1)count=1;//最少一个
// if(count>5)count=5;//最多5个
item.setQuantity(count);
//价格需要重新计算
item.setTotal(item.getQuantity()*item.getGoods().getPrice());
req.getSession().setAttribute("total",car.stream()
.mapToInt(OrderItem::getTotal)
.sum());
break;
}
}
//返回首页
resp.sendRedirect("car.jsp");
}
}
ClearServlet.jsp的编写:
package com.zking.servlet;
import com.zking.pojo.OrderItem;
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;
@SuppressWarnings("all")
@WebServlet("/clear.do")
public class ClearServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//购物车在哪里?
List car = (List)req.getSession().getAttribute("car");
//清空购物车
car.clear();
//返回首页
resp.sendRedirect("car.jsp");
}
}
f. 业务逻辑层
IUserBiz与UserBizImpl的编写:
package com.zking.biz;
import com.zking.pojo.User;
@SuppressWarnings("all")
public interface IUserBiz {
User login(User user);
}
package com.zking.biz.impl;
import com.zking.biz.IUserBiz;
import com.zking.dao.IUserDao;
import com.zking.dao.impl.UserDaoImpl;
import com.zking.pojo.User;
import org.apache.commons.codec.digest.DigestUtils;
@SuppressWarnings("all")
public class UserBizImpl implements IUserBiz {
private IUserDao userDao=new UserDaoImpl();
@Override
public User login(User user) {
//user 是用户给进来的
//u 是数据库中存在的
User u = userDao.login(user);
if(u==null){
return null;//account账号在数据库中查询不到记录
}
//需要将前端给我的那个用户的密码加密之后再和数据库的密码进行比较
String pwd= DigestUtils.md5Hex(user.getPassword());
if(!u.getPassword().equals(pwd)){
return null;//账号存在,但是密码不一致
}
return u;
}
}
IGoodsBiz与GoodsBizImpl的编写:
package com.zking.biz;
import com.zking.pojo.Goods;
import java.util.List;
@SuppressWarnings("all")
public interface IGoodsBiz {
List list();
Goods one(int id);
}
package com.zking.biz.impl;
import com.zking.biz.IGoodsBiz;
import com.zking.dao.IGoodsDao;
import com.zking.dao.impl.GoodsDaoImpl;
import com.zking.pojo.Goods;
import java.util.List;
@SuppressWarnings("all")
public class GoodsBizImpl implements IGoodsBiz {
private IGoodsDao goodsDao=new GoodsDaoImpl();
@Override
public List list() {
return goodsDao.list();
}
@Override
public Goods one(int id) {
return goodsDao.one(id);
}
}
g. 数据库访问层的编写
IUserDao与UserDaoImpl的编写:
package com.zking.dao;
import com.zking.pojo.User;
@SuppressWarnings("all")
public interface IUserDao {
User login(User user);
}
package com.zking.dao.impl;
import com.zking.dao.IUserDao;
import com.zking.pojo.User;
import com.zking.util.DBHelper;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
@SuppressWarnings("all")
public class UserDaoImpl implements IUserDao {
//定义资源
private Connection con;
private PreparedStatement ps;
private ResultSet rs;
@Override
public User login(User user) {
try {
con = DBHelper.getCon();
ps=con.prepareStatement("select * from car_user where account=?");
ps.setString(1, user.getAccount());
rs=ps.executeQuery();
if(rs.next()){
User u=new User();
u.setId(rs.getInt(1));
u.setAccount(rs.getString(2));
u.setPassword(rs.getString(3));
return u;
}
}catch (Exception e) {
e.printStackTrace();
}finally {
DBHelper.close(con,ps,rs);
}
return null;
}
}
IGoodsDao与GoodsDaoImpl的编写:
package com.zking.dao;
import com.zking.pojo.Goods;
import java.util.List;
@SuppressWarnings("all")
public interface IGoodsDao {
List list();
Goods one(int id);
}
package com.zking.dao.impl;
import com.zking.dao.IGoodsDao;
import com.zking.pojo.Goods;
import com.zking.util.DBHelper;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
@SuppressWarnings("all")
public class GoodsDaoImpl implements IGoodsDao {
//定义资源
private Connection con;
private PreparedStatement ps;
private ResultSet rs;
@Override
public List list() {
List list = new ArrayList();
try {
con = DBHelper.getCon();
ps = con.prepareStatement("select * from car_goods");
rs = ps.executeQuery();
while (rs.next()) {
Goods goods = new Goods();
goods.setId(rs.getInt(1));
goods.setName(rs.getString(2));
goods.setDescribe(rs.getString(3));
goods.setPrice(rs.getInt(4));
list.add(goods);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBHelper.close(con, ps, rs);
}
return list;
}
@Override
public Goods one(int id) {
List list = new ArrayList();
try {
con = DBHelper.getCon();
ps = con.prepareStatement("select * from car_goods where id=?");
ps.setInt(1,id);
rs = ps.executeQuery();
if (rs.next()) {
Goods goods = new Goods();
goods.setId(rs.getInt(1));
goods.setName(rs.getString(2));
goods.setDescribe(rs.getString(3));
goods.setPrice(rs.getInt(4));
return goods;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBHelper.close(con, ps, rs);
}
return null;
}
}
尚未完善的功能,敬请等待下一期~
感谢收看~~
~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~



