完成购物车、订单功能
实体说明
- 购物车Cart,Map<String, CartItem>、Double total
- 购物项CartItem ,Product product、Integer count 、Double subtotal
- 订单Order中有String Oid, Date ordertime等属性,还有List<CartItem> items保存多个订单项
- 订单项OrderItem其实和购物项类似
案例实现
案例1-将商品添加到购物车
需求说明:在商品信息页面,写好数量,点击加入购物车,跳转到购物车页面,展示购物车内容。
步骤分析:
- 一个购物车Cart中包含多个购物项Map<String, CartItem> 、购物车总金额total
- 一个购物项CartItem包含商品信息、商品数量、小计金额
- 只需根据商品详情页 提交的 商品id 和 商品数量 ,查询商品信息,拼装成CartItem,再通过Session获取购物车Cart,向里面添加CartItem, 再页面重定向。
技术实现:
- 编写form表单,点击加入购物车,提交到/cart?method=add
<form action="/day18/cart?method=add" method="post" id="formId">
...
<input ... onclick=addCart() >
</form>
<script type="text/javascript">
function addCart(){
//获取表单form 点击提交
$("#formId").submit();
//document.getElementById("formId").submit();
}
</script>
- 编写CartServlet中的add方法
1.获取商品的pid和商品数量count
2.获取购物车Cart session域中
2.1 如果session中没有Cart就创建
Cart cart = new Cart();
request.getSession().setAttribute("cart", cart);
2.2 若有则直接获取
Cart cart = (Cart) request.getSession().getAttribute("cart");
3.调用Service 根据pid查询商品信息 拼装成CartItem
Product product = new ProductServiceImpl().getInfoById(pid);
4.将CartItem添加到Cart中
5.请求转发 展示购物车Cart
案例2-将商品从购物车中移除
需求描述:点击购物车中删除按钮,移除该购物车项
实现步骤:
- 给按钮添加onclick事件,点击时弹出确认框
function remove(pid){
if(confirm("真的要删除吗?"){
location.href = "/day18/cart?method=remove&pid="+pid;
}
}
- 确认后,将该CartItem.product.pid 发送到CartServlet,获取购物车,map.remove(pid)
- 页面重定向 "/jsp/cart.jsp"刷新
案例3-清空购物车
步骤分析:
- 点击清空购物车,/day18/cart?method=clear
- 获取session中的购物车Cart,map.clear();
案例4-生成订单
需求说明:将购物车所有项生成一个订单
技术分析:
- 理清实体之间的关系
- 点击生成订单,OrderServlet判断用户登录、设置订单属性、遍历购物车中的购物车项,将购物车项CartItem依次改写为OrderItem,并依次加入Order的List<OrderItem>中
- 将order加入request域中
- 清空购物车
知识总结:
1. 对象和引用变量
理清对象和对象的引用,需要先了解java中的两块存储区域
- 栈:保存基本类型变量和对象的引用变量
- 堆:保存由new指令创建的对象和数组
引用变量保存在栈中,用于引用该类的实例,和指针类似。
class Dog{
String name;
int age;
}
Dog dog = new Dog();
1. new Dog 在堆空间中创建一个Dog类对象
2. ()表示创建对象后 立即调用构造函数对其初始化
3. Dog dog 创建了一个可以指向Dog类的引用变量dog
4. = 即让dog引用了该对象,dog就相当于实例的名称
5. 现在可以通过修改dog来实现对原对象的修改
2. 将Map中的value值 封装成集合 ,写成bean属性 便于前端展示
//Cart.java
Map<String , CartItem> map = new LinkedHashMap<>();
// 有了getItems()方法 ,items就相当于bean属性,可通过${Cart.items}访问
public Collection<CartItem> getItems(){
Collection<CartItem> values = map.values();
return values;
}
3. 事务
1. 默认为自动事务,手动事务需手动开启
2. 操作数据库前 手动开启, 操作完之后提交
try{
DataSourceUtils.startTransaction();
OrderDao od = (OrderDao) BeanFactory.getBean("OrderDao");
od.add(order);
...
DataSourceUtils.commitAndClose();
} catch(Exception e) {
DataSourceUtils.rollbanckAndClose();
throw e;
}
3. 创建Queryrunner时,不能提供连接
QueryRunner qr = new QueryRunner();
//执行操作时,需传入连接
qr.update(DataSourceUtils.getConnection(), sql, params...);
4. 数据备份
- 导出:
- 图形操作 右键数据库back up database as sql dump...
- 通过命令备份
mysqldump -uroot -p123456 store28>d:\1.sql
- 还原
1.图形 右键 restore from sql dump..
5.input 隐藏域
使用form表单,post方法提交时,可以通过input隐藏域提交数据
<input type="hidden" name="pid" value="${p.pid}">
网友评论