day3
1.解耦合思想 用配置文件解决
<?xml version="1.0" encoding="UTF-8"?> <beans> <bean id="ProductDao" class="com.itheima.dao.impl.ProductDaoImpl"/> <!-- <bean id="ProductDao" class="com.itheima.dao.impl.ProductDaoHibImpl"/> --> <bean id="UserDao" class="com.itheima.dao.impl.UserDaoImpl"/> <bean id="CategoryDao" class="com.itheima.dao.impl.CategoryDaoImpl"/> <bean id="OrderDao" class="com.itheima.dao.impl.OrderDaoImpl"/> <bean id="ProductService" class="com.itheima.service.impl.ProductServiceImpl"/> <bean id="UserService" class="com.itheima.service.impl.UserServiceImpl"/> <bean id="CategoryService" class="com.itheima.service.impl.CategoryServiceImpl"/> <bean id="OrderService" class="com.itheima.service.impl.OrderServiceImpl"/> </beans>
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")); } }
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; } }
package com.itheima.web.servlet; import java.io.IOException; import java.util.Date; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.itheima.constant.Constant; import com.itheima.domain.Cart; import com.itheima.domain.CartItem; import com.itheima.domain.Order; import com.itheima.domain.OrderItem; import com.itheima.domain.User; import com.itheima.service.OrderService; import com.itheima.utils.BeanFactory; import com.itheima.utils.UUIDUtils; import com.itheima.web.servlet.base.BaseServlet; /** * 订单模块 */ public class OrderServlet extends BaseServlet { private static final long serialVersionUID = 1L; /** * 保存订单 * @param request * @param response * @return * @throws ServletException * @throws IOException */ public String save(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { //-1.从session中获取user User user=(User) request.getSession().getAttribute("user"); if(user == null){ //未登录 提示 request.setAttribute("msg", "请先登录!"); return "/jsp/msg.jsp"; } //0.获取购物车 Cart cart=(Cart) request.getSession().getAttribute("cart"); //1.封装订单对象 //1.1创建对象 Order order = new Order(); //1.2设置oid order.setOid(UUIDUtils.getId()); //1.3设置ordertime order.setOrdertime(new Date()); //1.4设置total 购物车中 order.setTotal(cart.getTotal()); //1.5设置state order.setState(Constant.ORDER_WEIFUKUAN); //1.6设置user order.setUser(user); //1.7设置items(订单项列表) 遍历购物项列表 for (CartItem ci : cart.getCartItems()) { //1.7.1封装成orderitem //a.创建orderitem OrderItem oi = new OrderItem(); //b.设置itemid uuid oi.setItemid(UUIDUtils.getId()); //c.设置count 从ci中获取 oi.setCount(ci.getCount()); //d.设置subtotal 从ci中获取 oi.setSubtotal(ci.getSubtotal()); //e.设置product 从ci中获取 oi.setProduct(ci.getProduct()); //f.设置order oi.setOrder(order); //1.7.2 将orderitem加入order 的items中 order.getItems().add(oi); } //2.调用orderservice完成保存操作 OrderService os = (OrderService) BeanFactory.getBean("OrderService"); os.save(order); //3.请求转发到 order_info.jsp request.setAttribute("bean", order); } catch (Exception e) { } return "/jsp/order_info.jsp"; } }
package com.itheima.domain; import java.util.Collection; import java.util.HashMap; import java.util.Map; /** * 购物车 * @author Administrator * */ public class Cart { private Map<String, CartItem> itemMap=new HashMap<String, CartItem>(); private Double total=0.0; /** * 获取所有的购物项 * @return */ public Collection<CartItem> getCartItems(){ return itemMap.values(); } public Map<String, CartItem> getItemMap() { return itemMap; } public void setItemMap(Map<String, CartItem> itemMap) { this.itemMap = itemMap; } public Double getTotal() { return total; } public void setTotal(Double total) { this.total = total; } /** * 加入到购物车 * @param item */ public void add2cart(CartItem item){ //获取商品的id String pid = item.getProduct().getPid(); //判断购物车中是否有 if(itemMap.containsKey(pid)){ //有 修改数量 = 原来数量+新加的数量 //原有的购物项 CartItem oItem = itemMap.get(pid); oItem.setCount(oItem.getCount()+item.getCount()); }else{ //无 itemMap.put(pid, item); } //修改总金额 total += item.getSubtotal(); } /** * 从购物车移除一个购物项 * @param pid */ public void removeFromCart(String pid){ //1.从购物车(map)移除 购物项 CartItem item = itemMap.remove(pid); //2.修改总金额 total -= item.getSubtotal(); } /** * 清空购物车 */ public void clearCart(){ //1.清空map itemMap.clear(); //2.修改总金额 = 0 total=0.0; } }
package com.itheima.domain; /** * 购物项 * @author Administrator * */ public class CartItem { //商品 private Product product; //小计 private Double subtotal; //数量 private Integer count; public Product getProduct() { return product; } public void setProduct(Product product) { this.product = product; } /** * 获取商品小计 * @return */ public Double getSubtotal() { return product.getShop_price()*count; } /*public void setSubtotal(Double subtotal) { this.subtotal = subtotal; }*/ public Integer getCount() { return count; } public void setCount(Integer count) { this.count = count; } public CartItem(Product product, Integer count) { super(); this.product = product; this.count = count; } }
package com.itheima.domain; /** * 订项单 * @author Administrator * */ public class OrderItem { /* * `itemid` varchar(32) NOT NULL, `count` int(11) DEFAULT NULL, `subtotal` double DEFAULT NULL, `pid` varchar(32) DEFAULT NULL, `oid` varchar(32) DEFAULT NULL, */ private String itemid; private Integer count; private Double subtotal; //表示包含那个商品 private Product product; //表示属于那个订单 private Order order; public String getItemid() { return itemid; } public void setItemid(String itemid) { this.itemid = itemid; } public Integer getCount() { return count; } public void setCount(Integer count) { this.count = count; } public Double getSubtotal() { return subtotal; } public void setSubtotal(Double subtotal) { this.subtotal = subtotal; } public Product getProduct() { return product; } public void setProduct(Product product) { this.product = product; } public Order getOrder() { return order; } public void setOrder(Order order) { this.order = order; } }
package com.itheima.domain; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * 订单 * @author Administrator * */ public class Order { /** * `oid` varchar(32) NOT NULL, `ordertime` datetime DEFAULT NULL, `total` double DEFAULT NULL, `state` int(11) DEFAULT NULL, `address` varchar(30) DEFAULT NULL, `name` varchar(20) DEFAULT NULL, `telephone` varchar(20) DEFAULT NULL, `uid` varchar(32) DEFAULT NULL, */ private String oid; private Date ordertime; private Double total; private Integer state;//订单状态 0:未付款 1:已付款 2:已发货 3.已完成 private String address; private String name; private String telephone; //表示当前订单属于那个用户 private User user; //表示当前订单包含的订单项 private List<OrderItem> items = new ArrayList<>(); public String getOid() { return oid; } public void setOid(String oid) { this.oid = oid; } public Date getOrdertime() { return ordertime; } public void setOrdertime(Date ordertime) { this.ordertime = ordertime; } public Double getTotal() { return total; } public void setTotal(Double total) { this.total = total; } public Integer getState() { return state; } public void setState(Integer state) { this.state = state; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getTelephone() { return telephone; } public void setTelephone(String telephone) { this.telephone = telephone; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } public List<OrderItem> getItems() { return items; } public void setItems(List<OrderItem> items) { this.items = items; } }
package com.itheima.dao.impl; import org.apache.commons.dbutils.QueryRunner; import com.itheima.dao.OrderDao; import com.itheima.domain.Order; import com.itheima.domain.OrderItem; import com.itheima.utils.DataSourceUtils; public class OrderDaoImpl implements OrderDao { @Override /** * 保存订单 */ public void save(Order o) throws Exception { QueryRunner qr = new QueryRunner(); /** * `oid` varchar(32) NOT NULL, `ordertime` datetime DEFAULT NULL, `total` double DEFAULT NULL, `state` int(11) DEFAULT NULL, `address` varchar(30) DEFAULT NULL, `name` varchar(20) DEFAULT NULL, `telephone` varchar(20) DEFAULT NULL, `uid` varchar(32) DEFAULT NULL, */ String sql = "insert into orders values(?,?,?,?,?,?,?,?)"; qr.update(DataSourceUtils.getConnection(), sql, o.getOid(),o.getOrdertime(),o.getTotal(), o.getState(),o.getAddress(),o.getName(), o.getTelephone(),o.getUser().getUid()); } @Override /** * 保存订单项 */ public void saveItem(OrderItem oi) throws Exception { QueryRunner qr = new QueryRunner(); /* * `itemid` varchar(32) NOT NULL, `count` int(11) DEFAULT NULL, `subtotal` double DEFAULT NULL, `pid` varchar(32) DEFAULT NULL, `oid` varchar(32) DEFAULT NULL, */ String sql = "insert into orderitem values(?,?,?,?,?)"; qr.update(DataSourceUtils.getConnection(), sql, oi.getItemid(),oi.getCount(),oi.getSubtotal(), oi.getProduct().getPid(),oi.getOrder().getOid()); } }