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