涉及到实体类有 用户,商品,再加一个购物车表
需求:
在商品详情页面上,,选择商品 ,点击加入购物车,在购物车页面上展示里面所有的商品
分析:
涉及的实体:
购物车 购物车项 商品 用户表
步骤分析:
1.商品详情页面,,点击加入购物车
2.在cartservlet中的addToCCart方法操作
先获取两个参数 商品Id 和 用户Id
3.获取购物车,调用add2Cart(cartitem)
4.页面跳转
重定向 /jsp/cart.jsp
public class CartServlet extends HttpServlet{
public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException, ServletException {
HttpSession session=request.getSession();
User user=(User) session.getAttribute("loginUser");
//查看用户是否登录
//如果登录
if(user != null) {
//获取商品ID
String[] bids = request.getParameterValues("bookId");
//调用service中的addToCart的方法,加入到购物车
ShopcartService shopcartService=new ShopcartServiceImpl();
boolean result = shopcartService.addToCart(bids,user.getUid());
//如果添加成功 转到商品购物
if(result) {
request.getRequestDispatcher("ShopcartListServlet").forward(request, response);
}else {
//失败的话 转到商品浏览页
request.getRequestDispatcher("BooksListServlet").forward(request, response);
}
}else {
//用户没登录,转登录界面
request.getRequestDispatcher("login.jsp").forward(request, response);
}
}
}
service类
//添加到购物车
@Override
public boolean addToCart(String[] booksIds, int uid) {
try {
//首先查询购物车里有没有该商品
for(String bookId:booksIds) {
Cart cartIn = cartDao.get("select * from cart where bid=? and uid=?", Integer.parseInt(bookId),uid);
//没有该商品 就加入改商品,根据自己的表加入相应的字段
if(cartIn == null) {
Cart cartNew = new Cart();
cartNew.setBid(Integer.parseInt(bookId));//商品ID
cartNew.setCount(1); //商品数量(我这里是从1开始,每次加入商品的数量为1)
cartNew.setUid(uid);//用户ID,用来表示是哪个用户添加的商品
cartDao.save(cartNew);
}else {
//购物车里有该商品,购买数量加一
cartIn.setCount(cartIn.getCount()+1);
//更新数据库
cartDao.update(cartIn);
}
}
return true;
}catch(Exception e) {
e.printStackTrace();
}finally {
}
return false;
}
//Vo里封装一些值,用于页面显示用
import java.math.BigDecimal;
import java.util.List;
public class CartVo {
//商品总价格
private BigDecimal totalPrice;
//商品明细
private List<CartItem> datas;
public BigDecimal getTotalPrice() {
return totalPrice;
}
public void setTotalPrice(BigDecimal totalPrice) {
this.totalPrice = totalPrice;
}
public List<CartItem> getDatas() {
return datas;
}
public void setDatas(List<CartItem> datas) {
this.datas = datas;
}
public class CartItem {
private String photo;//商品的图片
private String bname;//商品的名字
private int count;//商品的数量
private BigDecimal price;//商品的单价
private BigDecimal subPrice;//单个商品的总价格
public String getPhoto() {
return photo;
}
public void setPhoto(String photo) {
this.photo = photo;
}
public String getBname() {
return bname;
}
public void setBname(String bname) {
this.bname = bname;
}
//...................
//以下省略get和set方法
service的方法实现
此方法很重要
@Override
public CartVo myCart(int uid) {
CartVo vo = new CartVo();
try {
BigDecimal totalPrice = cartDao.get("SELECT SUM(b.price*c.count) totalPrice from books b INNER JOIN cart c ON b.bid=c.bid where uid=?", new RowMapper<BigDecimal>() {
@Override
public BigDecimal oneRowMapper(ResultSet rs) {
try {
return rs.getBigDecimal(1);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}, uid);
vo.setTotalPrice(totalPrice);
List<CartItem> datas = cartDao.list("select b.photo,b.bname,b.price,c.count,b.price*c.count subPrice from books b INNER JOIN cart c ON b.bid=c.bid where uid=?", new RowMapper<CartItem>() {
@Override
public CartItem oneRowMapper(ResultSet rs) {
try {
CartItem cartItem = new CartItem();
cartItem.setBname(rs.getString("bname"));
cartItem.setPhoto(rs.getString("photo"));
cartItem.setPrice(rs.getBigDecimal("price"));
cartItem.setCount(rs.getInt("count"));
cartItem.setSubPrice(rs.getBigDecimal("subPrice"));
return cartItem;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}, uid) ;
vo.setDatas(datas);
return vo;
} finally {
}
}