JavaWeb項目--網上商城 (6-3)


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>
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 購物車模塊
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";
    }

}
OrderServlet 訂單模塊
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;
    }
}
Cart 購物車實體類
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;
    }
    
    
}
CartItem 購物項實體類
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;
    }
    
    
}
OrderItem 訂項單實體類
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;
    }
    
    
}
Order 訂單實體類
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());
    }

}
OrderDaoImpl 訂單dao

 

        

 

 










 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM