0
点赞
收藏
分享

微信扫一扫

JavaWeb MVC购物车(1)

我是小瘦子哟 2022-04-27 阅读 78

目录

一、MVC是什么? 

二、 项目文件

MVC购物车(1)主要完成的功能

数据库建表 


一、MVC是什么? 


二、 项目文件


三、登录功能的制作

 

 login.jsp(登录界面)

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" href="${pageContext.request.contextPath}/bootstrap-3.3.7-dist/css/bootstrap.css">
<script src="${pageContext.request.contextPath}/bootstrap-3.3.7-dist/js/jquery-3.5.1.js"></script>
<script src="${pageContext.request.contextPath}/bootstrap-3.3.7-dist/js/bootstrap.js"></script>
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>登录界面</title>
<style>
form {
width: 500px;
margin: auto;
}
</style>
</head>
<body class="container">
<form action="login.do" method="post">
<h1>登录</h1>
<div class="form-group">
<input name="account" class="form-control" placeholder="用户名">
</div>
<div class="form-group">
<input name="password" class="form-control" placeholder="密码">
</div>
<div class="form-group">
<button class="btn btn-primary btn-block">登录</button>
</div>
</form>
</body>
</html>

LoginServlet.java(实现登录功能的页面)

package com.zking.servlet;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

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 com.zking.biz.IUserBiz;
import com.zking.biz.impl.UserBizImpl;
import com.zking.pojo.OrderItem;
import com.zking.pojo.User;

/**
* 实现登录功能
* @author zjjt
*
*/

@WebServlet("/login.do")
public class LoginServlet extends HttpServlet{

private IUserBiz userBiz=new UserBizImpl();

//接收用户的数据
@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");

//去biz完成登录验证
User user = new User();
//将值封装到对象里面去
user.setAccount(account);
user.setPassword(password);
User u=userBiz.login(user);

if(u==null) {
resp.sendRedirect("login.jsp");
}else {
//将数据放到session中
req.getSession().setAttribute("user", u);
//为用户生成购物车
List<OrderItem>car=new ArrayList<OrderItem>();
req.getSession().setAttribute("car", car);
//把总价直接放到session中
req.getSession().setAttribute("total", 0);
//去到首页
resp.sendRedirect("index.do");
}
}

}

User.java(用户实体类)

package com.zking.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
/**
* 用户实体类
* @author zjjt
*
*/


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;
}
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
}
@Override
public String toString() {
return "User [id=" + id + ", account=" + account + ", password=" + password + "]";
}



}

 IUserDao.java(用户访问接口)

package com.zking.dao;

import com.zking.pojo.User;
/**
* 用户数据访问接口
* @author zjjt
*
*/


public interface IUserDao {

User login(User user);
}

 UserDaoImpl.java(用户数据访问接口)

package com.zking.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import com.zking.dao.IUserDao;
import com.zking.pojo.User;
import com.zking.util.DBHelper;
/**
* 用户数据访问接口实现类
* @author zjjt
*
*/

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;
}

}

 INewsBiz.java(用户逻辑接口)

package com.zking.biz;

import com.zking.pojo.User;
/**
* 用户逻辑接口
* @author zjjt
*
*/

public interface IUserBiz {
User login(User user);
}

 UserBizImpl.java(用户逻辑接口实现类)

package com.zking.biz.impl;

import org.apache.commons.codec.digest.DigestUtils;

import com.zking.biz.IUserBiz;
import com.zking.dao.IUserDao;
import com.zking.dao.impl.UserDaoImpl;
import com.zking.pojo.User;
/**
* 用户逻辑接口实现类
* @author zjjt
*
*/

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;
}

}

注意:数据库的密码是进行了加密的 需要先将前端的密码加密再和数据库密码进行比较


四、.页面过滤器的制作

🔘过滤器Filter

  • 精准匹配(/a.jsp)
  • 扩展名匹配(*.jsp)
  • 路径匹配(/manager/*)
  • 匹配所有(/*)

注意过滤器是@WebFilter不要弄错了 

 

如果对过滤器的流程不是很了解的可以查看如下过滤器的流程图 👇

 

 

我们购物车项目使用的过滤规则是/*(所有的页面都会被拦截)所以有些页面需要放行比如说登录页面。放行的代码如下

chain.doFilter(request,response);//放行

 LoginFilter.java(登录过滤页面) 

package com.zkiing.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.sun.net.httpserver.Filter.Chain;

@WebFilter("/*")//所有的请求都会被拦截
public class LoginFilter implements Filter{


//如果登陆了正常通行
//如果没登陆 让你回到登陆页面

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//有一些页面需要放行
//父转子强转拿到getServletPath()的方法
HttpServletRequest req=(HttpServletRequest)request;
HttpServletResponse resp=(HttpServletResponse)response;
String path = req.getServletPath();
if(path.equals("/login.jsp")||path.equals("/login.do")) {
chain.doFilter(request,response);//放行
return;
}
//判断你是否可以通行【有没有登陆 session中是否有user属性】
Object user = req.getSession().getAttribute("user");
if(user==null) {
resp.sendRedirect("login.jsp");
return;
}else {
chain.doFilter(request,response);//放行

}
}
}

五、全部商品的显示

商品显示功能的思路

 login.jsp-(表单)->login.do-(登录验证)->index.do-(拿到首页需要的数据)->index.jsp 显示数据

 

index.jsp(首页代码)

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<link rel="stylesheet" href="bootstrap-3.3.7-dist/css/bootstrap.css">
<script src="bootstrap-3.3.7-dist/js/jquery-3.5.1.js"></script>
<script src="bootstrap-3.3.7-dist\js\bootstrap.js"></script>
<meta name="viewport" content="width=device-width,initial-scale=1">
<style>
body {
padding: 20px 40px;
}
</style>
</head>
<c:if test="${list==null }">
<c:redirect url="index.do"></c:redirect>
</c:if>
<body>
<h1>
${user.account} 您好, <small>这是首页</small>
</h1>
<h1>
<a href="car.jsp" class="btn btn-primary" onclick="">点我去购物车</a>
</h1>
<table class="table table-bordered table-striped">
<tbody><tr>
<th>商品编号</th>
<th>商品名称</th>
<th>商品描述</th>
<th>商品价格</th>
<th>商品操作</th>
</tr>
<c:forEach items="${list }" var="goods">
<tr>
<td>${goods.id }</td>
<td>${goods.name }</td>
<td>${goods.describe }</td>
<td>${goods.price }</td>
<td><a href="add.do?id=${goods.id }" onclick="" class="btn btn-default">加入</a></td>
</tr>
</c:forEach>


</tbody></table>

</body></html>

 IndexServlet.java(处理首页界面)

package com.zking.servlet;

import java.io.IOException;
import java.util.List;

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 com.zking.biz.IGoodsBiz;
import com.zking.biz.impl.GoodsBizImpl;
import com.zking.pojo.Goods;
/**
* 处理首页界面
* @author zjjt
*
*/

@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<Goods> list = goodsBiz.list();
//把数据放到index.jsp中去显示
req.setAttribute("list",list);
//只有转发才能携带请求的数据
req.getRequestDispatcher("index.jsp").forward(req, resp);
}
}

六、.购物车商品的添加

 

Car.jsp(购物车界面)

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<link rel="stylesheet" href="bootstrap-3.3.7-dist/css/bootstrap.css">
<script src="bootstrap-3.3.7-dist/js/jquery-3.5.1.js"></script>
<script src="bootstrap-3.3.7-dist\js\bootstrap.js"></script>
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>我的购物车</title>
</head>
<body>
<div class="container">
<h1>
${user.account} 您好, <small>这是首页</small>
</h1>
<h1>
<a href="index.do" class="btn btn-default">继续购买</a>
<a href="" class="btn btn-default">订单结算</a>
<a href="" class="btn btn-default">查看订单</a>
<a href="clear.do" class="btn btn-default">清空</a>
</h1>
<table class="table table-bordered table-striped">
<tbody><tr>
<th>商品编号</th>
<th>商品名称</th>
<th>商品数量</th>
<th>商品总价</th>
<th>商品操作</th>
</tr>
<c:forEach items="${car }" var="item">

<tr>
<td>${item.goods.id }</td>
<td>${item.goods.name}</td>
<td>${item.quantity }</td>
<td>${item.total}</td>
<td>
<a href="del.do?id=${item.goods.id }" class="btn btn-default">删除</a>
<a href="upd.do?id=${item.goods.id }1" class="btn btn-default">+1</a>
<a href="upd.do?id=${item.goods.id }-1" class="btn btn-default">-1</a>
</td>
</tr>
</c:forEach>
</tbody></table>
<h1>
total:${total }
</h1>
</div>

</body></html>

 AddServlet.java(处理购物车商品添加界面)

package com.zking.servlet;

import java.io.IOException;
import java.util.List;

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 com.zking.biz.IGoodsBiz;
import com.zking.biz.impl.GoodsBizImpl;
import com.zking.pojo.Goods;
import com.zking.pojo.OrderItem;

@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<OrderItem> car= (List<OrderItem>)req.getSession().getAttribute("car");
//拿到添加的商品编号
int id = Integer.parseInt(req.getParameter("id"));
//购物车中已经有了
boolean f=true;
for(OrderItem item:car) {
//item 订单项中有一个与他对应的商品
if(item.getGoods().getId().equals(id)) {
//数量+1
item.setQuantity(item.getQuantity()+1);
//价格需要重新计算
Integer total=(Integer)req.getSession().getAttribute("total");
total+=item.getGoods().getPrice();
req.getSession().setAttribute("total",total);

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);
Integer total=(Integer)req.getSession().getAttribute("total");
total+=one.getPrice();
req.getSession().setAttribute("total",total);
}
//返回首页
resp.sendRedirect("index.do");

}
}

 Goods.java(商品实体类)

package com.zking.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
/**
* 商品实体类
* @author zjjt
*
*/


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;
}
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
}
@Override
public String toString() {
return "Goods [id=" + id + ", name=" + name + ", describe=" + describe + ", price=" + price + "]";
}

}

 IGoodsDao.java(商品数据访问接口)

package com.zking.dao;

import java.util.List;

import com.zking.pojo.Goods;
/**
* 商品数据访问接口
* @author zjjt
*
*/

public interface IGoodsDao {

List<Goods>list();

Goods one(int id);
}

 GoodsDaoImpl .java(商品数据访问接口实现类)

package com.zking.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import org.apache.catalina.tribes.util.Arrays;

import com.zking.dao.IGoodsDao;
import com.zking.pojo.Goods;
import com.zking.util.DBHelper;
/**
* 商品数据访问接口实现类
* @author zjjt
*
*/

public class GoodsDaoImpl implements IGoodsDao{

private Connection con;
private PreparedStatement ps;
private ResultSet rs;

/**
* 查询商品
*/

@Override
public List<Goods> list() {
List<Goods>list=new ArrayList<Goods>();
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<Goods>list=new ArrayList<Goods>();
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;
}

}

 IGoodsBiz.java(商品逻辑接口)

package com.zking.biz;

import java.util.List;

import com.zking.pojo.Goods;
/**
* 商品逻辑接口
* @author zjjt
*
*/

public interface IGoodsBiz {

List<Goods> list() ;
Goods one(int id);
}

  GoodsBizImpl.java(商品逻辑接口实现类)

package com.zking.biz.impl;

import java.util.List;

import com.zking.biz.IGoodsBiz;
import com.zking.dao.IGoodsDao;
import com.zking.dao.impl.GoodsDaoImpl;
import com.zking.pojo.Goods;
/**
* 商品逻辑接口实现类
* @author zjjt
*
*/

public class GoodsBizImpl implements IGoodsBiz{

private IGoodsDao goodsDao=new GoodsDaoImpl();
@Override
public List<Goods> list() {

return goodsDao.list();
}
@Override
public Goods one(int id) {
return goodsDao.one(id);
}

}

七、购物车数量加减&总价计算

UpdServlet.java(处理数量加减的界面)

package com.zking.servlet;

import java.io.IOException;
import java.util.List;

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 com.zking.biz.IGoodsBiz;
import com.zking.biz.impl.GoodsBizImpl;
import com.zking.pojo.Goods;
import com.zking.pojo.OrderItem;

@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<OrderItem> car= (List<OrderItem>)req.getSession().getAttribute("car");
//拿到添加的商品编号
int id = Integer.parseInt(req.getParameter("id"));

//获取需要改变的类型
int type = Integer.parseInt(req.getParameter("type"));
//购物车中已经有了

for(OrderItem item:car) {
//item 订单项中有一个与他对应的商品
if(item.getGoods().getId().equals(id)) {
//数量+1/-1
int count= item.getQuantity()+type;
if(count<1)count=1;//最少一个
if(count>5)count=5;//最大五个
item.setQuantity(count);
//价格需要重新计算
item.setTotal(item.getQuantity()*item.getGoods().getPrice());
// Integer total=(Integer)req.getSession().getAttribute("total");
// total+=type*item.getGoods().getPrice();
//req.getSession().setAttribute("total",total);
req.getSession().setAttribute("total",car.stream()
.mapToInt(OrderItem::getTotal)
.sum());
break;
}
}

//返回首页
resp.sendRedirect("car.jsp");

}
}

八、删除商品

ClearServlet.java(处理删除商品的界面)

package com.zking.servlet;

import java.io.IOException;
import java.util.List;

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 com.zking.biz.IGoodsBiz;
import com.zking.biz.impl.GoodsBizImpl;
import com.zking.pojo.Goods;
import com.zking.pojo.OrderItem;

@WebServlet("/clear.do")
public class ClearServlet 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<OrderItem> car= (List<OrderItem>)req.getSession().getAttribute("car");
//清空购物车
car.clear();

//返回首页
resp.sendRedirect("car.jsp");

}
}

九、清空购物车

ClearServlet.java(处理清空购物车的界面) 

package com.zking.servlet;

import java.io.IOException;
import java.util.List;

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 com.zking.biz.IGoodsBiz;
import com.zking.biz.impl.GoodsBizImpl;
import com.zking.pojo.Goods;
import com.zking.pojo.OrderItem;

@WebServlet("/clear.do")
public class ClearServlet 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<OrderItem> car= (List<OrderItem>)req.getSession().getAttribute("car");
//清空购物车
car.clear();

//返回首页
resp.sendRedirect("car.jsp");

}
}

数据库建表 

car_user(用户表)

create table car_user(
id number primary key,--用户id
account varchar2(30) not null,--用户账号
password varchar(32) not null--用户密码

);

insert into car_user
values (1, '2890@fox.com', 'ff9830c42660c1dd1942844f8069b74a');-- root123

insert into car_user
values (2, '2357@fox.com', 'e10adc3949ba59abbe56e057f20f883e');-- 123456

 car_goods(商品表)

create table car_goods
(
id number primary key,--商品id
name varchar2(20) not null,--商品名称
describe varchar2(100) default '此商品暂时没有介绍藍' not null,--商品描述
price number not null--商品价格
);

car_order(订单表)

create table car_order
(
id number primary key,--订单id
user_id number not null,--用户id
total number not null--订单总价
);

 car_order_item(购物车订单项表)

create table car_order_item
(
id number primary key,--订单项编号
order_id number not null,--订单id
goods_id number not null,--商品id
quantity number not null,--下单的数量
total number not null--订单项总价
);

今天的分享就要这结束啦!!✌

以上就是关于JavaWeb MVC购物车(1)的一些内容!!📖

期待下次再见!!😊

举报

相关推荐

Javaweb (MVC购物车01)

JavaWeb—21 MVC购物车02

mvc购物车

MVC购物车

javaWeb购物车部分

0 条评论