zoukankan      html  css  js  c++  java
  • 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

            










  • 相关阅读:
    JS中location.search和setTimeout()和 setInterval()
    javascript的AJAX和Serialize(),解码
    php的变量和基本语法
    isnan
    Urllib 库的基础和实用(2)
    urllib 库的基础和实用(1)
    python获取网页精准爬取数据
    eclipse配置
    搭建JAVA WEB开发环境(tomcat)
    JDK环境变量配置
  • 原文地址:https://www.cnblogs.com/ou-pc/p/7885678.html
Copyright © 2011-2022 走看看