Java Web网上商城——订单实现部分

1. 订单模块

1_准备工作

<a href="${pageContext.request.contextPath}/OrderServlet?method=findMyOrdersWithPage&num=1">我的订单</a>

2_OrderServlet__>findMyOrdersWithPage

      //确认用户登录状态

      //创建订单对象,为订单对象赋值

      //遍历购物项的同时,创建订单项

      //调用业务层功能:保存订单

      //清空购物车

      //将订单放入request

      //转发/jsp/order_info.jsp

确认用户登录状态

request.getSession().getAttribute("loginUI"); 

创建订单对象,为订单对象赋值

1.创建订单对象得有一个Order order = new Order();

2.向订单对象中加入商品,需要购物车里面的各种商品。于是需要新建一个购物车对象。

Cart cart = new Cart(); 我们需要为这个订单生成一些值,比如:订单编号,新建时间,商品总量,状态,订单拥有者。

3.遍历购物项的同时,创建订单项

用for循环 (我们得明白:遍历哪一个,在当前遍历购物项的时候,cart.getCartItems(),之前的遍历变量也自然是CartItem item)

创建订单项的时候,需要注意,在Order.java中我们已经知道了巧妙加入了一个List<CartItem>

setOrder方法是将订单项“加入”订单。

order.getList().add(orderItem); 即完成上述要求

4.保存订单,即调用业务层 ( OrderService OrderService=new OrderServiceImp(); )

OrderService.saveOrder(order); //转到OrderService.java

// saveOrder  将购物车中的信息以订单的形式保存
public String saveOrder(HttpServletRequest req, HttpServletResponse resp) throws Exception {
		//确认用户登录状态
        // 返回Attribute不知道是什么形式,于是要进行强制类型转换
		User user = (User)req.getSession().getAttribute("loginUI");
            //需要对user进行判断,是否为空
		if(user == null) {
			req.setAttribute("msg", "请登录后再下单");
			return "/jsp/order_info.jsp";
		}
		//获取购物车
		Cart cart = new Cart();
		//创建订单对象,为订单对象赋值  
		Order order = new Order();
		//遍历购物项的同时,创建订单项
		order.setOid(UUIDUtils.getCode());
		order.setOrdertime(new Date());
		order.setTotal(cart.getTotal());
		order.setState(1);
		order.setUser(user);
		
		//调用业务层功能:保存订单  保存购物车里面的物品到订单中;
		for(CartItem item : cart.getCartItems()) {
			OrderItem orderItem=new OrderItem();
			orderItem.setItemid(UUIDUtils.getCode());
			orderItem.setQuantity(item.getNum());
			orderItem.setTotal(item.getSubTotal());
			orderItem.setProduct(item.getProduct());
			//以上已经设置好了orderItem 将其加入order(订单处) 
			//利用订单处的list->add方法添加
			orderItem.setOrder(order);
			order.getList().add(orderItem);
			
		}
		//清空购物车
		cart.clearCart();
		//将订单放入request
		req.getSession().setAttribute("order", order);
		//转发/jsp/order_info.jsp
		return "/jsp/order_info.jsp";
	}
	OrderDao orderDao = new OrderDaoImp();
	
	@Override
	public void saveOrder(Order order) throws SQLException {
		//保存订单和订单下所有的订单项(同时成功,失败)
		/*try {
			JDBCUtils.startTransaction();
			OrderDao orderDao=new OrderDaoImp();
			orderDao.saveOrder(order);
			for(OrderItem item:order.getList()){
				orderDao.saveOrderItem(item);
			}
			JDBCUtils.commitAndClose();
		} catch (Exception e) {
			JDBCUtils.rollbackAndClose();
		}
		*/
		Connection conn = null;
		
		try {
			conn = JDBCUtils.getConnection();
			//开启事务
			conn.setAutoCommit(false);
			//保存订单
			orderDao.saveOrder(conn, order);
			//保存订单项
			for(OrderItem orderItem : order.getList()) {
				orderDao.saveOrderItem(conn, orderItem);
			}
			//提交事务
			conn.commit();
		} catch (Exception e) {
			conn.rollback();
		}
	}

记下来上面的代码;其中保存订单和保存订单项是需要根据自己写的项目的改变而改变。调用数据层Dao来使用

 

saveOrder 和 saveOrderItem 利用Object数组进行储值,调用update方法

@Override
public void saveOrder(Connection conn, Order order) throws Exception {
	String sql="INSERT INTO orders VALUES(?,?,?,?,?,?,?,?)";
	QueryRunner qr=new QueryRunner();
	Object[] params={order.getOid(),order.getOrdertime(),order.getTotal(),order.getState(),order.getAddress(),order.getName(),order.getTelephone(),order.getUser().getUid()};
		qr.update(conn,sql,params);
}

@Override
public void saveOrderItem(Connection conn, OrderItem item) throws Exception {
	String sql="INSERT INTO orderitem VALUES(?,?,?,?,?)";
	QueryRunner qr=new QueryRunner();
	Object[] params={item.getItemid(),item.getQuantity(),item.getTotal(),item.getProduct().getPid(),item.getOrder().getOid()};
	qr.update(conn,sql,params);
}

2. 订单查询

1. jsp代码中需要修改订单的一些参数

在header中需要修改:

<a href="${pageContext.request.contextPath}/OrderServlet?method=findMyOrdersWithPage&num=1">我的订单</a>

  2.     

      获取用户信息

       获取当前页

       调用业务层功能:查询当前用户订单信息,返回PageModel

       将PageModel放入request

       转发到/jsp/order_list.jsp

//findMyOrdersWithPage
public String findMyOrdersWithPage(HttpServletRequest req, HttpServletResponse resp) throws Exception {
		//获取用户信息
		User user=(User)req.getSession().getAttribute("loginUser");
		//获取当前页
		int curNum=Integer.parseInt(req.getParameter("num"));
		//调用业务层功能:查询当前用户订单信息,返回PageModel
		OrderService OrderService=new OrderServiceImp();
		//SELECT * FROM orders WHERE uid=? limit ? , ? 
		//PageModel:1_分页参数 2_url  3_当前用户的当前页的订单(集合) ,每笔订单上对应的订单项,以及订单项对应的商品信息
		PageModel pm=OrderService.findMyOrdersWithPage(user,curNum);
		//将PageModel放入request
		req.setAttribute("page", pm);
		//转发到/jsp/order_list.jsp
		return "/jsp/order_list.jsp";
}

3. OrderServiceImp

        //1_创建PageModel对象,目的:计算并且携带分页参数

             <1>计算某个用户订单项总共组成多少页

             <2>形成PageModel对象,第一个参数是 当前页的位置;第二个参数是一共有多少;第三个参数是一页有多少个商品。

        //2_关联集合 

             <1>调用数据访问层,第一个参数是针对某个用户;第二个参数是开始的元素;第三个参数是结束的参数;

        //3_关联url 

             <1> 

以上三条可以看做,分页模块的业务层模板

@Override
	public PageModel findMyOrdersWithPage(User user, int curNum) throws Exception {
		//1_创建PageModel对象,目的:计算并且携带分页参数
		//select count(*) from orders where uid=?
		int totalRecords=orderDao.getTotalRecords(user);
		PageModel pm=new PageModel(curNum, totalRecords, 3);
		//2_关联集合  select * from orders where uid=? limit ? ,?
		List list=orderDao.findMyOrdersWithPage(user,pm.getStartIndex(),pm.getPageSize());
		pm.setList(list);
		//3_关联url
		pm.setUrl("OrderServlet?method=findMyOrdersWithPage");
		return pm;
	}

4. OrderDaoImp(什么时候用Map->对多表进行操作的时候)

   *_利用MapListHandler封装多表查询结果

        List<Map<String,Object>> list02 = qr.query(sql,new MapListHandler(),oid);

        MapListHandler

   *_多表查询语句

        select * from orderItem o,product p where o.pid=p.pid and o.pid=?

   *_BeanUtils自动填充数据

        利用BeanUtils的代码popular函数 赋值

@Override
public List findMyOrdersWithPage(User user, int startIndex, int pageSize) throws Exception {
		String sql="select * from orders where uid=? limit ? , ?";
		QueryRunner qr=new QueryRunner(JDBCUtils.getDataSource());
		List<Order> list=qr.query(sql, new BeanListHandler<Order>(Order.class),user.getUid(),startIndex,pageSize);
		
		//遍历所有订单
		for (Order order : list) {
			//获取到每笔订单oid   查询每笔订单下的订单项以及订单项对应的商品信息
			String oid=order.getOid();
			sql="select * from orderItem o ,product p where o.pid=p.pid and oid=?";
			List<Map<String, Object>> list02 = qr.query(sql, new MapListHandler(),oid);
			//遍历list
			for (Map<String, Object> map : list02) {
				OrderItem orderItem=new OrderItem();
				Product product=new Product();
				// 由于BeanUtils将字符串"1992-3-3"向user对象的setBithday();方法传递参数有问题,手动向BeanUtils注册一个时间类型转换器
				// 1_创建时间类型的转换器
				DateConverter dt = new DateConverter();
				// 2_设置转换的格式
				dt.setPattern("yyyy-MM-dd");
				// 3_注册转换器
				ConvertUtils.register(dt, java.util.Date.class);
				
				//将map中属于orderItem的数据自动填充到orderItem对象上
				BeanUtils.populate(orderItem, map);
				//将map中属于product的数据自动填充到product对象上
				BeanUtils.populate(product, map);
				
				//让每个订单项和商品发生关联关系
				orderItem.setProduct(product);
				//将每个订单项存入订单下的集合中
				order.getList().add(orderItem);
				
			}
		}
		return list;
}

3. 订单详情

1. 修改order_list.jsp的链接

<a href="${pageContext.request.contextPath}/OrderServlet?method=findOrderByOid&oid=${o.oid}">付款</a>

2. findOrderByOid

      获取到订单oid (由于订单oid并没有存在于session中,所以直接getparameter取值即可)

      调用业务层功能:根据订单编号查询订单信息 

          自然而然想到 new 实现(ServiceImp)     

          Service.XXX(调用Dao层的方法来查询)

          将订单放入request  (request.setAttribute("order",order);

      转发到/jsp/order_info.jsp                                 

public String findOrderByOid(HttpServletRequest req, HttpServletResponse resp) throws Exception {
//		 获取到订单oid
		String oid = req.getParameter("oid");
		
//		 调用业务层功能:根据订单编号查询订单信息
		OrderService orderService = new OrderServiceImp();
		Order order = orderService.findOrderByOid(oid);
//	      将订单放入request
		req.setAttribute("order", order);
		
//	      转发到/jsp/order_info.jsp
		return "/jsp/order_info.jsp";
}

3. OrderService -> 直接调用Dao层代码

@Override
public Order findOrderByOid(String oid) throws Exception {
	return orderDao.findOrderByOid(oid);
		
}

4.OrderDaoImp

   根据订单oid查询当前订单  

   根据订单oid查询订单下所有的订单项以及订单项关联的商品

       关联操作:利用orderItem.setProduct(product);——>order.getList().add(orderItem);

@Override
public Order findOrderByOid(String oid) throws Exception {
		String sql = "select * from order where id = ?";
		QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
//		根据订单oid查询当前订单   
		Order order = qr.query(sql, new BeanHandler<Order>(Order.class),oid);

//		根据订单oid查询订单下所有的订单项以及订单项关联的商品
		sql = "select * from orderitem o, product p where o.pid=p.pid and oid=?";
		List<Map<String,Object>> list02 = qr.query(sql, new MapListHandler(),oid);
		for (Map<String, Object> map : list02) {
			OrderItem orderItem=new OrderItem();
			Product product=new Product();
			// 由于BeanUtils将字符串"1992-3-3"向user对象的setBithday();方法传递参数有问题,手动向BeanUtils注册一个时间类型转换器
			// 1_创建时间类型的转换器
			DateConverter dt = new DateConverter();
			// 2_设置转换的格式
			dt.setPattern("yyyy-MM-dd");
			// 3_注册转换器
			ConvertUtils.register(dt, java.util.Date.class);
			
			//将map中属于orderItem的数据自动填充到orderItem对象上
			BeanUtils.populate(orderItem, map);
			//将map中属于product的数据自动填充到product对象上
			BeanUtils.populate(product, map);
			
			//让每个订单项和商品发生关联关系
			orderItem.setProduct(product);
			//将每个订单项存入订单下的集合中
			order.getList().add(orderItem);
		}
		
		return order;
}

总结:订单模块自己写的时候出现的问题还是很多的,这是我的总结,可能只有我看的懂了。

 

  • 14
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.sql.*; public class system extends JFrame { JDesktopPane deskpane = new JDesktopPane();//在窗体里建立虚拟桌 JPanel p = new JPanel();//创建一个面板并实例化 public system(){//构造函数 setTitle("订单管理系统");//设置窗体标题 Container con = getContentPane(); con.setLayout(new BorderLayout());//创建一个布局 con.add(deskpane,BorderLayout.CENTER);//实例虚拟桌面的布局 Font f =new Font("新宋体",Font.PLAIN,12); JMenuBar mb = new JMenuBar();//实例化菜单栏 mb.setOpaque(true); setJMenuBar(mb); mb.setOpaque(true); setJMenuBar(mb); JMenu systemM = new JMenu("系统管理"); systemM.setFont(f); mb.add(systemM); JMenuItem land = new JMenuItem("重新登陆"); land.setFont(f); JMenuItem exit = new JMenuItem("退出系统"); exit.setFont(f); systemM.add(land); systemM.add(exit); JMenu userM = new JMenu("用户管理"); userM.setFont(f); mb.add(userM); JMenuItem password = new JMenuItem("密码修改"); password.setFont(f); JMenuItem addDelete = new JMenuItem("添加/删除用户"); addDelete.setFont(f); userM.add(password); userM.add(addDelete); JMenu mesM = new JMenu("信息管理"); mesM .setFont(f); mb.add(mesM ); JMenu addM= new JMenu("添加信息"); addM.setFont(f); JMenu viewM = new JMenu("查看信息"); viewM.setFont(f); JMenu modifM = new JMenu("修改信息"); modifM.setFont(f); JMenu deleteM = new JMenu("删除信息"); deleteM.setFont(f); mesM.add(addM); mesM.add(viewM); mesM.add(modifM); mesM.add(deleteM); JMenuItem addgoods = new JMenuItem("添加商品信息"); addgoods.setFont(f); addM.add(addgoods); JMenuItem addclient = new JMenuItem("添加客户信息"); addclient.setFont(f); addM.add(addclient); JMenuItem viewgoods= new JMenuItem("查看商品信息"); viewgoods.setFont(f); viewM.add(viewgoods); JMenuItem viewclient = new JMenuItem("查看客户信息"); viewclient.setFont(f); viewM.add(viewclient); JMenuItem modifgoods = new JMenuItem("修改商品信息"); modifgoods.setFont(f); modifM.add(modifgoods); JMenuItem modifclient = new JMenuItem("修改用户信息"); modifclient.setFont(f); modifM.add(modifclient); JMenuItem deletegoods = new JMenuItem("删除商品信息"); deletegoods.setFont(f); deleteM.add(deletegoods); JMenuItem deleteclient = new JMenuItem("删除用户信息"); deleteclient.setFont(f); deleteM.add(deleteclient); JMenu orderM = new JMenu("订单管理"); orderM.setFont(f); mb.add(orderM); JMenuItem addO= new JMenuItem("添加订单"); addO.setFont(f); JMenuItem viewO = new JMenuItem("查看订单"); viewO.setFont(f); JMenuItem modifO = new JMenuItem("修改订单"); modifO.setFont(f); JMenuItem deleteO = new JMenuItem("删除订单"); deleteO.setFont(f); orderM.add(addO); orderM.add(viewO); orderM.add(modifO); orderM.add(deleteO); //主界面上标出学号、姓名、及所作系统名 JLabel jlabel1=new JLabel(); jlabel1.setFont(new Font("宋体",Font.BOLD,15)); //设置字体 jlabel1.setHorizontalAlignment(SwingConstants.CENTER); //设置位置 jlabel1.setText("简易订单管理系统学号:070810228" + " 姓名:廖太春指导老师:周老师"); jlabel1.setBounds(450,350, 200, 200); deskpane.add(jlabel1); password.addActionListener(new ActionListener(){//密码修改监听 public void actionPerformed(ActionEvent e){ System.out.println("修改密码"); deskpane.add(new modifpsw()); } }); land.addActionListener(new ActionListener(){//重新登陆监听 public void actionPerformed(ActionEvent e){ System.out.println("登录"); setVisible(false); new Land(); } }); addDelete.addActionListener(new ActionListener(){//添加/删除用户监听 public void actionPerformed(ActionEvent e){ deskpane.add(new AddDeleteUser()); } }); addgoods.addActionListener(new ActionListener(){//添加商品信息 public void actionPerformed(ActionEvent e){ deskpane.add(new addgoods()); } }); addclient.addActionListener(new ActionListener(){//添加用户信息 public void actionPerformed(ActionEvent e){ deskpane.add(new addclient()); } }); viewgoods.addActionListener(new ActionListener(){//查看商品信息 public void actionPerformed(ActionEvent e){ System.out.println("查看商品信息"); deskpane.add(new viewgoods()); } }); viewclient.addActionListener(new ActionListener(){//查看客户信息 public void actionPerformed(ActionEvent e){ System.out.println("查看客户信息"); deskpane.add(new viewclient()); } }); modifgoods.addActionListener(new ActionListener(){//修改商品信息 public void actionPerformed(ActionEvent e){ System.out.println("修改商品信息"); deskpane.add(new modifgoods()); } }); modifclient.addActionListener(new ActionListener(){//修改用户信息 public void actionPerformed(ActionEvent e){ System.out.println("修改用户信息"); deskpane.add(new modifclient()); } }); deletegoods.addActionListener(new ActionListener(){//删除商品信息 public void actionPerformed(ActionEvent e){ System.out.println("删除商品信息"); deskpane.add(new deletegoods()); } }); deleteclient.addActionListener(new ActionListener(){//删除用户信息 public void actionPerformed(ActionEvent e){ System.out.println("删除用户信息"); deskpane.add(new deleteclient()); } }); addO.addActionListener(new ActionListener(){//添加订单 public void actionPerformed(ActionEvent e){ deskpane.add(new addO()); } }); viewO.addActionListener(new ActionListener(){//查看订单 public void actionPerformed(ActionEvent e){ deskpane.add(new viewO()); } }); modifO.addActionListener(new ActionListener(){//修改订单 public void actionPerformed(ActionEvent e){ System.out.println("修改订单"); deskpane.add(new modifO()); } }); deleteO.addActionListener(new ActionListener(){//删除订单 public void actionPerformed(ActionEvent e){ System.out.println("/删除订单"); deskpane.add(new deleteO()); } }); exit.addActionListener(new ActionListener(){//退出系统监听 public void actionPerformed(ActionEvent e){ setVisible(false); } }); this.setBounds(200,200,700,600); setVisible(true); } public static void main(String[] args){ new Land(); } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值