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

 

        

 

 










 

posted @ 2017-11-23 16:44  周无极  阅读(2466)  评论(0编辑  收藏  举报