小项目first-任务三-LMLPHP

任务1:提交订单

提交订单需要操作数据库的3张表:
1).向订单表中插入一条订单信息
2).向订单明细表中插入多条记录,每一条记录就是提交订单前的购物项
3).每个订单明细关联了一款商品,修改商品表中该商品的库存数量
需要将以上3个操作放在一个事务中执行,要么都成功(提交事务),要么都失败(回滚事务)
第1步:在购物车页面点击“下一步”,进入到订单确认页面

<a href="${pageContext.request.contextPath}/qiantai/order/orderQueren.jsp">
<img border="0"
 src="${pageContext.request.contextPath}/images/Car_icon_03.gif" /></a>

订单确认页面orderQueren.jsp上回显用户信息,电话和收货地址可以修改

<form
						action="${pageContext.request.contextPath}/order.action?method=addOrder"
						name="f" method="post">
						<table width="99%" border="0" cellpadding="2" cellspacing="1"
							bgcolor="#FFFFFF" align="center" style="margin-top:8px">
							<tr align='center' bgcolor="#FFFFFF" height="22">
								<td>收货人帐号:</td>
								<td><input type="text" readonly="readonly"
									value="${user.user_name }" /></td>
							</tr>
							<tr align='center' bgcolor="#FFFFFF" height="22">
								<td>收货人姓名:</td>
								<td><input type="text" readonly="readonly"
									value="${user.user_realname }" /></td>
							</tr>
							<tr align='center' bgcolor="#FFFFFF" height="22">
								<td>收货人联系电话:</td>
								<td><input type="text" value="${user.user_tel }" /></td>
							</tr>

							<tr align='center' bgcolor="#FFFFFF" height="22">
								<td>收货地址:</td>
								<td><input type="text" name="odderSonghuodizhi"
									value="${user.user_address }" /></td>
							</tr>
							<tr align='center' bgcolor="#FFFFFF" height="22">
								<td>付款方式(暂时只支持货到付款):</td>
								<td><select name="odderFukuangfangshi" style="width:155px;">
										<option value="货到付款">货到付款</option>
								</select> <!-- 隐藏域,存储订单的总金额,就是购物车的总金额 --> <input type="hidden"
									name="totalPrice" value="${cart.totalPrice }" /> <!-- 隐藏域,存储当前用户的id -->
									<input type="hidden" name="userid" value="${user.user_id }" />
								</td>
							</tr>
						</table>
						<table>
							<tr height="7">
								<td></td>
							</tr>
							<tr>
								<td width="120"></td>
								<td><a href="#" onclick="back1()"><img border="0"
										src="${pageContext.request.contextPath}/images/Car_icon_back.gif" /></a></td>
								<!-- 点击提交订单,将表单提交到后台Servlet -->
								<td><img border="0"
									src="${pageContext.request.contextPath}/images/Car_icon_06.gif"
									onclick="javascript:document.f.submit();" /></td>
							</tr>
						</table>
					</form>

第2步:创建OrderDao,添加一个插入订单的方法

@Override
	public int insert(Order order, List<Orderitem> items) {
		// TODO Auto-generated method stub
		String sql = "insert into t_order values(?, now(),0,?,?,?,?)";
		// 连接对象
		Connection conn = JdbcUtil.getConnection();
		// 预编译SQL的操作对象
		PreparedStatement stmt = null;
		try {
			// 设置事务手动提交
			conn.setAutoCommit(false);
			// 第一:操作订单表,插入一条订单记录
			stmt = conn.prepareStatement(sql);
			// 给?赋值
			// 1.订单编号,值是UUID生成的随机不重复的字符串
			stmt.setString(1, order.getOrder_id());
			// 2.金额
			stmt.setInt(2, order.getOrder_jine());
			// 3.收货地址
			stmt.setString(3, order.getOrder_address());
			// 4.付款方式
			stmt.setString(4, order.getOrder_pay());
			// 5.用户id
			stmt.setInt(5, order.getUser().getUser_id());
			// 执行sql命令
			stmt.executeUpdate();
			// 关闭操作对象,会同时清空预编译时的参数值
			stmt.close();
			// 第二:操作订单明细表
			sql = "insert into t_orderitem(order_id,goods_id,goods_num)
			values(?,?,?)";
			// 产生新的操作对象
			stmt = conn.prepareStatement(sql);
			// 使用一个SQL,要给SQL中占位符赋值多次并执行的操作称为批处理
			for (Orderitem orderitem : items) {
				// 给占位符赋值,
				stmt.setString(1, orderitem.getOrder().getOrder_id());
				stmt.setInt(2, orderitem.getGoods().getGoods_id());
				stmt.setInt(3, orderitem.getGoods_num());
				// 再将一组参数值添加到批处理命令中
				stmt.addBatch();
			}
			// 执行批处理命令
			stmt.executeBatch();
			stmt.close();
			// 第三:修改每个订单明细关联的商品的库存数量
			sql = "update t_goods set stock_num=stock_num-? where goods_id=?";
			// 产生新的操作对象
			stmt = conn.prepareStatement(sql);
			// 使用一个SQL,要给SQL中占位符赋值多次并执行的操作称为批处理
			for (Orderitem orderitem : items) {
				Goods goods = orderitem.getGoods();
				stmt.setInt(1, orderitem.getGoods_num());
				stmt.setInt(2, goods.getGoods_id());
				// 再将一组参数值添加到批处理命令中
				stmt.addBatch();
			}
			// 执行批处理命令
			stmt.executeBatch();
			// 提交事务
			conn.commit();
			return 1;
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			// 回滚事务
			try {
				conn.rollback();
			} catch (SQLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			return 0;
		} finally {
			// 关闭资源
			JdbcUtil.closeAll(null, stmt, conn);
		}

	}

第3步:创建OrderService,加入添加订单的方法

public class OrderServiceImpl implements OrderService {

	private OrderDao orderDao = new OrderDaoImpl();

	@Override
	public void addOrder(Order order, List<Orderitem> items) {
		// TODO Auto-generated method stub
		// 调用OrderDao中的添加订单方法
		orderDao.insert(order, items);
	}
}

第4步:创建OrderServlet,加入处理提交订单的方法

public void addOrder(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// 获取订单确认页面传过来的订单数据
		// 订单总金额
		int totalPrice = Integer.parseInt(request.getParameter("totalPrice"));
		// 用户id
		int userid = Integer.parseInt(request.getParameter("userid"));
		// 收货地址
		String odderSonghuodizhi = request.getParameter("odderSonghuodizhi");
		// 付款方式
		String odderFukuangfangshi = request
				.getParameter("odderFukuangfangshi");
		// 封装一个订单对象
		Order order = new Order();
		order.setOrder_jine(totalPrice);
		// 创建用户对象
		User user = new User();
		user.setUser_id(userid);
		// 建立订单和用户的关联
		order.setUser(user);

		order.setOrder_address(odderSonghuodizhi);
		order.setOrder_pay(odderFukuangfangshi);
		// 设置订单的编号,值是UUID生成的随机不重复的字符串
		order.setOrder_id(UUID.randomUUID().toString());

		// 创建订单明细的集合
		List<Orderitem> itemList = new ArrayList<Orderitem>();
		// 从session中获取购物车,再获取所有购物项
		HttpSession session = request.getSession();
		Cart cart = (Cart) session.getAttribute("cart");
		Collection<CartItem> values = cart.getCartMap().values();
		for (CartItem cartItem : values) {
			// 根据购物项来创建订单明细
			Orderitem item = new Orderitem();
			item.setOrder(order);
			item.setGoods(cartItem.getGoods());
			item.setGoods_num(cartItem.getQuantity());
			// 添加到订单明细集合中
			itemList.add(item);
		}
		// 调用OrderService的添加订单方法
		OrderService service = new OrderServiceImpl();
		service.addOrder(order, itemList);
//清空购物车
		session.removeAttribute("cart");
		// 跳转到orderSubmit.jsp页面
		request.setAttribute("order", order);
		request.getRequestDispatcher("qiantai/order/orderSubmit.jsp").forward(
				request, response);
	}

任务2:查看我的订单

1)修改incTop.jsp页面上”我的订单”超链接,给它加单击事件,调用js函数

 //点击“我的订单”
	function myOrder() {
		<c:if  test="${empty user}">
		alert("请去右边的登录板块去登录!");
		return;
		</c:if>
		 //跳转到后台servlet,调用queryOrders方法,传用户的id过去
		var s = "${pageContext.request.contextPath}/order.action?
		method=queryOrders&uid=${user.user_id}";
		window.location.href = s;
	}

2)在OrderDao中加一个查询指定用户所有订单的方法

@Override
	public List<Order> queryByUserId(int userid) {
		 //查询订单编号,金额,订单时间,状态
		String sql="select order_id,order_jine,order_time,order_zhuangtai
		from t_order where order_userid=?";
		List<Order> orders = this.getList(Order.class, sql, userid);
		return orders;
	}

3)在OrderService中加一个获取用户的所有订单的方法

@Override
	public List<Order> getAllOrders(int userid) {
		// TODO Auto-generated method stub
		List<Order> list = orderDao.queryByUserId(userid);
		return list;
	}

4)在OrderServlet中处理查看订单的请求

 //查看“我的订单”
	public void queryOrders(HttpServletRequest request,
			HttpServletResponse response) throws ServletException,
			IOException {
		//获取用户编号
		int  uid=Integer.parseInt(request.getParameter("uid"));
		//调用OrderService的方法获取用户的所有订单
		OrderService  service=new OrderServiceImpl();
		List<Order> allOrders = service.getAllOrders(uid);
		//存到request域中
		request.setAttribute("orders", allOrders);
		//转发到myOrder.jsp页面
		request.getRequestDispatcher("qiantai/order/myOrder.jsp")
		.forward(request, response);
	}

5)在myOrder.jsp页面上显示我的订单数据

任务3:查看订单详情

1)修改myOrder.jsp的“订单明细”超链接

<a href="${pageContext.request.contextPath}/order.action?
method=queryOrderDetail&orderid=${od.order_id }"
	 target="_blank">订单明细</a>

2)创建OrderItemDao,加入一个查询订单明细的方法

@Override
	public List<Orderitem> queryAllByOrderId(String orderId) {
		// TODO Auto-generated method stub
		String sql = "select goods_name, mall_price,goods_num  from

		t_orderitem  t1 join  t_goods t2   on  t1.goods_id=t2.goods_id "


		+ " where t1.order_id=?";

		// 手动处理结果集
		Connection conn = JdbcUtil.getConnection();
		PreparedStatement stmt = null;
		ResultSet rs = null;
		// 返回值
		List<Orderitem> list = new ArrayList<Orderitem>();
		try {
			stmt = conn.prepareStatement(sql);
			stmt.setString(1, orderId);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Orderitem item = new Orderitem();
				Goods goods = new Goods();
				goods.setGoods_name(rs.getString("goods_name"));
				goods.setMall_price(rs.getInt("mall_price"));
				item.setGoods(goods);
				item.setGoods_num(rs.getInt("goods_num"));
				// 添加到集合中
				list.add(item);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			JdbcUtil.closeAll(rs, stmt, conn);
		}
		return list;
	}

3)创建OrderItemService,添加获取某个订单的所有订单明细的方法

public class OrderItemServiceImpl implements OrderItemService {

	 private OrderItemDao  dao=new OrderItemDaoImpl();
	@Override
	public List<Orderitem> getAllItems(String orderId) {
		// TODO Auto-generated method stub
		List<Orderitem> items = dao.queryAllByOrderId(orderId);
		return items;
	}
}

4)在OrderServlet中加一个方法获取订单明细

//查看某个订单的订单明细
	public void queryOrderDetail(HttpServletRequest request,
			HttpServletResponse response) throws ServletException,
			IOException {
		//获取订单编号
		String orderId=request.getParameter("orderid");
		//调用Service的方法获取订单的明细,传入订单编号
		OrderItemService  service=new OrderItemServiceImpl();
		List<Orderitem> allItems = service.getAllItems(orderId);
		//存到request域中
		request.setAttribute("items", allItems);
		//转发到orderDetail.jsp页面
		request.getRequestDispatcher("qiantai/order/orderDetail.jsp")
		.forward(request, response);

	}

5)在orderDetail.jsp页面上展示所有订单明细数据

任务4:用户注册

1)给登录页面userLogin.jsp上的注册按钮添加onclick事件,点击后打开新的窗口加载注册页面

	function reg() {
		var url =
		"${pageContext.request.contextPath}/qiantai/userinfo/userReg.jsp";
		window.open(url, "_blank");
	}

2)修改注册页面上表单的请求路径,请求UserServlet

<form action="${pageContext.request.contextPath}/user.action?
method=addUser" name="form1" method="post">

3)在UserDao中加入一个添加用户方法

	@Override
	public int insert(User user) {
		// TODO Auto-generated method stub
		String sql = "insert into
		t_user(user_name,user_pwd,user_realname,
		user_address,user_sex,user_tel,user_email,user_qq)"

				+ " values(?,?,?,?,?,?,?,?)";
		int i = JdbcUtil.executeUpdate(sql, user.getUser_name(),
				user.getUser_pwd(), user.getUser_realname(),
				user.getUser_address(), user.getUser_sex(), user.getUser_tel(),
				user.getUser_email(), user.getUser_qq());
		return i;
	}

4)UserService中添加一个注册的方法

	@Override
	public boolean register(User user) {
		// TODO Auto-generated method stub
		int i = userDao.insert(user);
		return i>0;
	}

5) 创建UserServlet,处理添加用户请求

//处理添加用户请求
	public void addUser(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//获取请求参数值
		String userName=request.getParameter("userName");
		String userPw=request.getParameter("userPw");
		String userRealname=request.getParameter("userRealname");
		String userAddress=request.getParameter("userAddress");
		String userSex=request.getParameter("userSex");
		String userTel=request.getParameter("userTel");
		String userEmail=request.getParameter("userEmail");
		String userQq=request.getParameter("userQq");
		//封装一个用户对象
		User  user=new User();
		user.setUser_name(userName);
		user.setUser_pwd(userPw);
		user.setUser_realname(userRealname);
		user.setUser_address(userAddress);
		user.setUser_sex(userSex);
		user.setUser_tel(userTel);
		user.setUser_email(userEmail);
		user.setUser_qq(userQq);
		//调用service的注册方法
		UserService  service=new UserServiceImpl();
		boolean flag = service.register(user);
		if(flag){
			//注册成功,跳转到网站首页上 
			response.sendRedirect(request.getContextPath()+"/goods.action?
			method=queryFive");
		}
	}

任务5:修改我的信息

1)点击“我的信息”时跳转到userXinxi.jsp页面

<A href="javascript:void(0)" onclick="myXinxi()"
		target="_self" rel="CMenuMultiLevel-332774-43069-213">我的信息</A>
函数
//点击"我的信息"
	function myXinxi() {
		<c:if  test="${empty user}">
		alert("请去右边的登录板块去登录!");
		return;
		</c:if>

		var url =
		"${pageContext.request.contextPath}/qiantai/userinfo/userXinxi.jsp";
		window.open(url, "_blank");
	}

2)在userXinxi.jsp页面回显当前用户的信息
3)修改userXinxi.jsp页面上表单的请求路径

<form action="${pageContext.request.contextPath}/user.action?
method=updateUser" name="form1" method="post">

4)在UserDao中加入修改用户的方法,实现类方法代码

	@Override
	public int update(User user) {
		// TODO Auto-generated method stub
		String sql="update t_user set
		user_name=?,user_pwd=?,user_realname=?,user_address=?,user_sex=?,user_tel
		=?,user_email=?,user_qq=?"+
		" where user_id=?";
		Object[] params=
		{user.getUser_name(),user.getUser_pwd(),user.getUser_realname(),
				user.getUser_address(), user.getUser_sex(), user.getUser_tel(),
				user.getUser_email(), user.getUser_qq(),user.getUser_id()};
		int i=JdbcUtil.executeUpdate(sql,params );
		return i;
	}

5)在UserService中加入修改用户的方法

@Override
	public boolean updateUser(User user) {
		// TODO Auto-generated method stub
		int i = userDao.update(user);
		return i>0;
	}
}

6 ) 在UserServlet中加入修改用户的方法

//处理修改用户的请求
	public void updateUser(HttpServletRequest request, HttpServletResponse response)

			throws ServletException, IOException {
		//获取请求参数值
		String userName=request.getParameter("userName");
		String userPw=request.getParameter("userPw");
		String userRealname=request.getParameter("userRealname");
		String userAddress=request.getParameter("userAddress");
		String userSex=request.getParameter("userSex");
		String userTel=request.getParameter("userTel");
		String userEmail=request.getParameter("userEmail");
		String userQq=request.getParameter("userQq");
		int userId=Integer.parseInt(request.getParameter("userId"));
		//封装成象一个用户对象
		User  user=new User();
		user.setUser_name(userName);
		user.setUser_pwd(userPw);
		user.setUser_realname(userRealname);
		user.setUser_address(userAddress);
		user.setUser_sex(userSex);
		user.setUser_tel(userTel);
		user.setUser_email(userEmail);
		user.setUser_qq(userQq);
		user.setUser_id(userId);
		//调用service的修改用户的方法
		UserService  service=new UserServiceImpl();
		boolean flag = service.updateUser(user);
		if(flag){
			//将session中的用户换成新用户
			HttpSession session = request.getSession();
			session.setAttribute("user",user);
			//修改成功,跳转到网站首页上 
			response.sendRedirect(request.getContextPath()+"/goods.action?
			method=queryFive");
		}
	}
02-27 05:02