JavaWeb项目--网上商城 (6-3)
分类:
IT文章
•
2022-07-18 19:49:25
day3
1.解耦合思想 用配置文件解决
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean />
<!-- <bean /> -->
<bean />
<bean />
<bean />
<bean />
<bean />
<bean />
<bean />
</beans>
beans.xml
package com.itheima.utils;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
* 获取javabean的工厂
* @author Administrator
*
*/
public class BeanFactory {
public static Object getBean(String id){
try {
//1.获取document对象
Document doc=new SAXReader().read(BeanFactory.class.getClassLoader().getResourceAsStream("beans.xml"));
//2.调用api selectSingleNode(表达式)
Element beanEle=(Element) doc.selectSingleNode("//bean[@id='"+id+"']");
//3.获取元素的class属性
String classValue = beanEle.attributeValue("class");
//4.通过反射返回实现类的对象
Object newInstance = Class.forName(classValue).newInstance();
return newInstance;
} catch (Exception e) {
e.printStackTrace();
System.out.println("获取bean失败");
}
return null;
}
public static void main(String[] args) throws Exception {
System.out.println(getBean("ProductDao1"));
}
}
BeanFactory 获取javabean的工厂
2.模块分析
案例1-添加到购物车
需求: 在商品的详情页面,输入购买数量,点击加入购物车,将该商品添加到购物车了
技术分析: 1. session 涉及到实体:
2.购物车(cart) 属性: 购物项(商品购买信息)的集合 Map<String pid,CartItem> 总金额(total)
. 方法: 加入购物车 add2cart(CartItem item){
//1.判断购物车是否有该商品
//有:
修改购买数量(原来的数量+item.getCount)
修改总金额(原来的金额+item.getSubtotal())
//无:直接put进去 修改总金额(原来的金额+item.getSubtotal())
}
从购物车中移除 removeFromCart(String pid){
从map中移除指定购物项
修改总金额
}
清空购物车 clearCart(){
清空map
修改总金额=0.0
}
3.购物项(cartItem) 属性: 商品对象(product) 购买数量(count) 小计(subtotal)
方法:
重新编写
getSubtotal(){
return product.getShop_price*count
}
步骤分析:
1.修改商品详情页面(product_info.jsp) 添加一个表单: 要执行方法:method=add2cart 商品的pid:pid=xxx 商品的购买数量:count=123123
点击"加入购物车",将表单提交 /store/cart
2.编写cartServlet 继承baseservlet 编写add2cart (){
获取商品的pid和count
调用productservice通过pid获取商品
封装cartItem
new cartItem(Product,count)
将cartitem加入购物车
获取购物车(session中获取)
调用购物车的add2cart方法即可
重定向到cart.jsp上
}
案例2-从购物车移除一个商品
需求: 在cart.jsp上,点击某一个商品的 删除 ,弹出一个提示"您忍心抛弃我吗?",点击确定,从购物车中移除.否则不删
步骤分析:
1.给 删除 添加连接 /store/cart?method=remove&pid=xxx
2.在cartservlet中编写remove方法 获取pid 获取cart,执行removeFromCart()方法 重定向到cart.jsp
案例3-清空购物车
需求: 点击cart.jsp上的 清空购物车,需要将购物车中所有商品移除掉
步骤分析:
1.修改 清空购物车的连接 /store/cart?method=clear
2.编写clear方法 获取购物车,执行clearCart() 重定向到cart.jsp上
3.判断购物车中是否有商品, 有则展示 无则提示
案例4-生成订单
需求: 在cart.jsp上,点击 "提交订单",将购物车中的商品,最终保存到数据库中.
实体分析:
1. 用户 订单 商品 用户和订单 :一对多 订单和商品 :多对多
表分析 用户 商品 订单
2. 用户和订单是一对多,在订单表中添加外键
3.订单和商品是多对多,引入一张中间表(orderitem)
4. 订单表 orders: id state订单状态 total订单金额 ordertime下单时间 `address收货人信息 user_id(外键关联用户id)
订单项表: itemid pid oid 某个商品的购买数量 小计
5. 实体具体分析:
订单 orders 属性: id 订单状态 订单金额 下单时间 收货人信息 user对象 订单项列表 List<OrderItem> list
订单项属性:(OrderItem) itemid product对象 order 某个商品的购买数量(count) 小计(subtotal)
步骤分析:
1. 保存订单: 在orders中插入一条数据 在orderitem中插入多条数据
2.在cart.jsp上,点击提交订单 发送请求 路径: /store/order?method=save
3.编写orderservlet,编写save方法
4. 封装订单对象 创建order对象 设置id (uuidutils)
设置订单状态 :0 [ 0去付款,1已付款,2已发货,3已完成 ]
获取购物车中总金额 设置下单时间 (当前时间)
设置 收货人信息 null
设置user对象 (session中获取)
设置订单项列表:List<OrderItem> list(遍历购物车中购物项,获取每一个购物项)
封装成orderitem 设置product对象( 购物中获取product)
设置order order
设置itemid UUIDUtils
设置某个商品的购买数量(count)(购物项中获取)
设置小计(subtotal) (购物项中获取)
调用orderservice,执行保存操作 请求转发到订单详情页面
4.编写service:开启事务 向orders保存一条 向orderitem中保存多条
3.代码区
package com.itheima.web.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.itheima.domain.Cart;
import com.itheima.domain.CartItem;
import com.itheima.domain.Product;
import com.itheima.service.ProductService;
import com.itheima.utils.BeanFactory;
import com.itheima.web.servlet.base.BaseServlet;
/**
* 购物车模块
*/
public class CartServlet extends BaseServlet {
private static final long serialVersionUID = 1L;
public String clear(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取购物车 执行清空操作
getCart(request).clearCart();
//2.重定向
response.sendRedirect(request.getContextPath()+"/jsp/cart.jsp");
return null;
}
/**
* 从购物车移除商品
* @param request
* @param response
* @return
* @throws ServletException
* @throws IOException
*/
public String remove(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取商品的pid
String pid = request.getParameter("pid");
//2.获取购物车 执行移除
getCart(request).removeFromCart(pid);
//3.重定向
response.sendRedirect(request.getContextPath()+"/jsp/cart.jsp");
return null;
}
/**
* 加入购物车
* @param request
* @param response
* @return
* @throws ServletException
* @throws IOException
*/
public String add2cart(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
//1.获取pid count
String pid = request.getParameter("pid");
int count = Integer.parseInt(request.getParameter("count"));
//2.封装cartitem
//调用service获取product
ProductService ps = (ProductService) BeanFactory.getBean("ProductService");
Product product = ps.getById(pid);
//创建cartitem
CartItem cartItem = new CartItem(product, count);
//3.将cartitem加入购物车
//获取购物车
Cart cart=getCart(request);
cart.add2cart(cartItem);
//4.重定向
response.sendRedirect(request.getContextPath()+"/jsp/cart.jsp");
} catch (Exception e) {
e.printStackTrace();
request.setAttribute("msg", "加入购物车失败");
return "/jsp/msg.jsp";
}
return null;
}
/**
* 获取购物车
* @param request
* @return
*/
private Cart getCart(HttpServletRequest request) {
Cart cart = (Cart) request.getSession().getAttribute("cart");
if(cart == null){
cart = new Cart();
//将cart放入session中
request.getSession().setAttribute("cart", cart);
}
return cart;
}
}
CartServlet 购物车模块