javaEE笔记(八)体育商城项目(三)

任务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;
	}
  1.  
  2. 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页面上显示我的订单数据


<body>
	<jsp:include flush="true" page="/qiantai/inc/incTop.jsp"></jsp:include>
	<div class="page_row">
		<!--左边的 -->
		<div class="page_main_msg left">
			<div class="left_row">
				<div class="list pic_news">
					<div class="list_bar">&nbsp;我的订单</div>
					<table width="99%" border="0" cellpadding="2" cellspacing="1"
						bgcolor="#FFFFFF" align="center" style="margin-top: 8px">
						<tr align="center" bgcolor="#FAFAF1" height="22">
							<td>订单编号</td>
							<td>金额</td>
							<td>下单时间</td>
							<td>订单状态</td>
							<td>编辑</td>
						</tr>
						<c:forEach var="od" items="${orders }">
							<tr align='center' bgcolor="#FFFFFF" height="22">
								<td>${od.order_id }</td>
								<td>¥ ${od.order_jine } <br />
								</td>
								<td>${od.order_time }</td>
								<td><c:choose>
										<c:when test="${od.order_zhuangtai eq 0}">待发货</c:when>
										<c:when test="${od.order_zhuangtai eq 1}">已发货</c:when>
										<c:when test="${od.order_zhuangtai eq 2}">已收货</c:when>
										<c:otherwise>已完成</c:otherwise>
									</c:choose></td>
								<%-- 	 --%>
								<td><a href="${pageContext.request.contextPath}/order.action?method=queryOrderDetail&orderid=${od.order_id }"
								 target="_blank"
									>订单明细</a>
		                          </td>
							</tr>
						</c:forEach>
					</table>
				</div>
			</div>
		</div>
		<!-- 右边的 -->
		<div class="page_other_msg right">
			<div class="left_row">
				<div class="list">
					<div class="list_bar">用户登录</div>
					<div class="list_content">
						<div id="div">
							<jsp:include flush="true" page="/qiantai/userinfo/userlogin.jsp"></jsp:include>
						</div>
					</div>
				</div>
			</div>
			<div class="left_row">
				<div class="list">
					<div class="list_bar">商品分类</div>
					<div class="list_content">
						<div id="div">
							<div style="overflow: hidden;">
								<div id="roll-orig-1607838439">
									 	<!-- 这里需要获取到的所有商品分类数据并显示 -->
									<table width="100%" cellpadding="0" cellspacing="0" border="0">
										<c:forEach var="c" items="${catelogs }">
											<tr>
												<td height="28" id="roll-line-1607838439" width="100%">
													<div class="" style="padding:2px 0px;">
														<div class="f-left">
															<img
																src="${pageContext.request.contextPath}/img/head-mark3.gif"
																align="middle" class="img-vm" border="0" /> <a
																href="${pageContext.request.contextPath}/goods.action?method=queryByCatelog&catelogId=${c.catelog_id}">
																<span style="font-size:12px">${c.catelog_name }</span>
															</a>
														</div>
														<div class="clear"></div>
													</div>
												</td>
											</tr>
										</c:forEach>
									</table>
								</div>
								<div id="roll-copy-1607838439"></div>
							</div>
						</div>
					</div>
				</div>
			</div>
		</div>
		<div style="clear: both"></div>
	</div>

	<div>
		<jsp:include flush="true" page="/qiantai/inc/incFoot.jsp"></jsp:include>
	</div>
</body>

任务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;
	}
  1. 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;
	}
}
  1. 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页面上展示所有订单明细数据

<body class="body" leftmargin="0" rightmargin="0">
	<table cellspacing="1" cellpadding="0" width="100%" border="0"
		bgcolor="#F7F3F7">
		<tr height="26">
			<td class="blackTitle" align="center">商品名称</td>
			<td class="blackTitle" align="center">单价</td>
			<td class="blackTitle" align="center">数量</td>
			<td class="blackTitle" align="center">总价</td>
		</tr>
		<c:forEach var="orderitem" items="${items }">
			<tr class="text" align="center" bgcolor="#FFFFFF">
				<td>${orderitem.goods.goods_name }</td>
				<td>${orderitem.goods.mall_price }</td>
				<td>${orderitem.goods_num }</td>
				<td>${orderitem.goods.mall_price*orderitem.goods_num }</td>
			</tr>
		</c:forEach>
	</table>
</body>

任务4用户注册

  1. 给登录页面userLogin.jsp上的注册按钮添加onclick事件,点击后打开新的窗口加载注册页面
	function reg() {
		var url = "${pageContext.request.contextPath}/qiantai/userinfo/userReg.jsp";
		window.open(url, "_blank");
	}
  1. 2修改注册页面上表单的请求路径,请求UserServlet

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

  1. 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;
	}

 

  1. 4UserService中添加一个注册的方法
	@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");
	}
  1. 2.在userXinxi.jsp页面回显当前用户的信息
<body>
			<form action="${pageContext.request.contextPath}/user.action?method=updateUser" name="form1" method="post">
				<table width="98%" border="0" align="center" cellpadding="0" cellspacing="1" bgcolor="#CCCCCC">
				    <caption>编辑个人信息</caption>
					<tr>
						<td width="20%" height="30" align="right" bgcolor="#F9F9F9" style="font-size: 11px;">
							用户名:
						</td>
						<td width="80%" bgcolor="#FFFFFF">
							&nbsp;
							<input type="text" name="userName" id="userName" readonly="readonly" value="${sessionScope.user.user_name }"/>
						</td>
					</tr>
					<tr>
						<td height="30" align="right" bgcolor="#F9F9F9" style="font-size: 11px;">
							密 码:
						</td>
						<td bgcolor="#FFFFFF">
							&nbsp;
							<input type="password" name="userPw" value="${sessionScope.user.user_pwd }"/>
						</td>
					</tr>
					<tr>
						<td height="30" align="right" bgcolor="#F9F9F9" style="font-size: 11px;">
							真实姓名:
						</td>
						<td bgcolor="#FFFFFF">
							&nbsp;
							<input type="text" name="userRealname" value="${sessionScope.user.user_realname }"/>
						</td>
					</tr>
					<tr>
						<td height="30" align="right" bgcolor="#F9F9F9" style="font-size: 11px;">
							收货住址:
						</td>
						<td bgcolor="#FFFFFF">
							&nbsp;
							<input type="text" name="userAddress" value="${sessionScope.user.user_address }"/>
						</td>
					</tr>
					<tr>
						<td height="30" align="right" bgcolor="#F9F9F9" style="font-size: 11px;">
							性别:
						</td>
						<td bgcolor="#FFFFFF">
							&nbsp;
							<input type="radio" name="userSex" value="男"  ${user.user_sex eq '男'?'checked':'' }/>男
							&nbsp;&nbsp;&nbsp;&nbsp;
							<input type="radio" name="userSex" value="女"  ${user.user_sex eq '女'?'checked':'' }/>女
						</td>
					</tr>
					<tr>
						<td height="30" align="right" bgcolor="#F9F9F9" style="font-size: 11px;">
							电话:
						</td>
						<td bgcolor="#FFFFFF">
							&nbsp;
							<input type="text" name="userTel" value="${sessionScope.user.user_tel }"/>
						</td>
					</tr>
					<tr>
						<td height="30" align="right" bgcolor="#F9F9F9" style="font-size: 11px;">
							E-mail:
						</td>
						<td bgcolor="#FFFFFF">
							&nbsp;
							<input type="text" name="userEmail" value="${sessionScope.user.user_email }"/>
						</td>
					</tr>
					<tr>
						<td height="30" align="right" bgcolor="#F9F9F9" style="font-size: 11px;">
							QQ:
						</td>
						<td bgcolor="#FFFFFF">
							&nbsp;
							<input type="text" name="userQq" value="${sessionScope.user.user_qq }"/>
						</td>
					</tr>
					<tr>
						<td height="30" align="right" bgcolor="#F9F9F9">
							&nbsp;
						</td>
						<td bgcolor="#FFFFFF">
							&nbsp;
							<!-- 将用户的id存到隐藏域中 -->
							<input type="hidden" name="userId" value="${sessionScope.user.user_id }" />
							<input type="submit" value="保存"/>
							<input type="button" value="取消" onclick="closeOpen()"/>
						</td>
					</tr>
				</table>
			</form>
	</body>

3

  1. 修改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");
		}
	}

任务6创建后台项目

创建一个项目sxt_tysc_system,将资料中的已编译的后台项目sxt_admin_static目录下的静态资源文件拷贝到我们的项目中,如下图:

接下来将jsp文件夹拖到WEB-INF目录下,WEB-INF在web开发中是受保护的目录,

该目录下的资源不能通过客户端请求直接访问(不能用超链接,网址来直接访问),只能通过服务器内部跳转即请求转发的方式来访问。最终我们的后台项目结构:

如果直接访问WEB-INF下的资源,会报错

任务7管理员登录

  1. 在登录页面上显示验证码

 将资料中的验证码文件夹下的AuthCodeServlet添加到项目的servlet包里,AuthCodeUtil添加到util包里面

然后在web.xml中配置AuthCodeServlet

<!-- 生成验证码的servlet -->
	<servlet>
		<servlet-name>authCodeServlet</servlet-name>
		<servlet-class>com.sxt.servlet.AuthCodeServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>authCodeServlet</servlet-name>
		<url-pattern>/authCode.action</url-pattern>
	</servlet-mapping>

2.创建AdminDao,添加根据用户名和密码查询的方法

public class AdminDaoImpl extends BaseDao<Admin> implements AdminDao {

	@Override
	public Admin queryByNameAndPwd(String username, String userpwd) {
		// TODO Auto-generated method stub
		String sql="select *  from t_admin where username=? and userpwd=?";
		Admin admin = this.getBean(Admin.class, sql,username,userpwd );
		return admin;
	}
}

3.在AdminService中添加登录的方法

public class AdminServiceImpl  implements  AdminService{
	private AdminDao  adminDao=new AdminDaoImpl();

	@Override
	public Admin login(String username, String userpwd) {
		// TODO Auto-generated method stub
		Admin admin = adminDao.queryByNameAndPwd(username, userpwd);
		return admin;
	}
}

4.在LoginServlet中处理登录请求

package com.sxt.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.sxt.entity.Admin;
import com.sxt.service.AdminService;
import com.sxt.service.impl.AdminServiceImpl;

public class LoginServlet extends HttpServlet {

	/**
	 * The doGet method of the servlet. <br>
	 * 
	 * This method is called when a form has its tag value method equals to get.
	 * 
	 * @param request
	 *            the request send by the client to the server
	 * @param response
	 *            the response send by the server to the client
	 * @throws ServletException
	 *             if an error occurred
	 * @throws IOException
	 *             if an error occurred
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		this.doPost(request, response);
	}

	/**
	 * The doPost method of the servlet. <br>
	 * 
	 * This method is called when a form has its tag value method equals to
	 * post.
	 * 
	 * @param request
	 *            the request send by the client to the server
	 * @param response
	 *            the response send by the server to the client
	 * @throws ServletException
	 *             if an error occurred
	 * @throws IOException
	 *             if an error occurred
	 */
	// 处理登录请求
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		// 获取表单传来的参数
		String uloginname = request.getParameter("uloginname");
		String upsw = request.getParameter("upsw");
		String code = request.getParameter("code");
		// 判断输入的验证码和session中存的验证码是否一致
		HttpSession session = request.getSession();
		String checkCode = (String) session.getAttribute("code");
		// equalsIgnoreCase:比较字符串是否相等,不区分大小写
		if (code.equalsIgnoreCase(checkCode)) {
			// 调用service的登录方法,传入用户名和密码
			AdminService service = new AdminServiceImpl();
			Admin admin = service.login(uloginname, upsw);
			if (admin != null) {
				// 如果登录成功,跳转到后台主页
				// 1.将管理员对象保存在session
				session.setAttribute("admin", admin);
				// 2.跳转到后台主页
				request.getRequestDispatcher("WEB-INF/jsp/main/index.jsp")
						.forward(request, response);

			} else {
				// 登录失败,跳转到登录页面
				// 1.将错误信息存到request中
				request.setAttribute("errorMsg", "用户名或密码错误");
				// 2.转发到登录页面
				request.getRequestDispatcher("login.jsp").forward(request,
						response);

			}

		} else {
			// 验证码错误,跳转到登录页面
			// 1.将错误信息存到request中
			request.setAttribute("errorMsg", "验证码错误");
			// 2.转发到登录页面
			request.getRequestDispatcher("login.jsp")
					.forward(request, response);

		}
	}

}

任务8分页显示所有会员

  1. 修改后台主页jsp/main/index.jsp上会员管理菜单的超链接请求路径
<a
				href="${pageContext.request.contextPath}/user.action"
				target="right"><span class="icon-caret-right"></span>会员管理</a>
  1. 在UserDao中添加查询数据集合的方法queryData和查询总记录数的方法queryCount,代码略
package com.sxt.dao;

import java.util.List;

import com.sxt.entity.User;
import com.sxt.util.PageBean;

public interface UserDao {
       //根据页号,每页记录数,查询当前页的用户数据集合
	  List<User>  queryData(PageBean<User>  pb);
	  //查询总记录数
	  int queryCount();
}
package com.sxt.dao.impl;

import java.util.List;

import com.sxt.dao.BaseDao;
import com.sxt.dao.UserDao;
import com.sxt.entity.User;
import com.sxt.util.PageBean;

public class UserDaoImpl extends BaseDao<User> implements UserDao {

	@Override
	public List<User> queryData(PageBean<User> pb) {
		// TODO Auto-generated method stub
		String sql="select *  from t_user limit ?,?";
		List<User> list = this.getList(User.class, sql, (pb.getCurrentPage()-1)*pb.getPageSize(),pb.getPageSize());
		return list;
	}

	@Override
	public int queryCount() {
		// TODO Auto-generated method stub
		String sql="select count(*) from t_user";
		int total = this.getTotal(sql);
		return total;
	}
}
  1. 在userService中添加分页查询用户的方法
public class UserServiceImpl implements UserService {

	private UserDao dao = new UserDaoImpl();

	@Override
	public void getPageBean(PageBean<User> pb) {
		// TODO Auto-generated method stub
		List<User> list = dao.queryData(pb);
		int totalCount = dao.queryCount();
		// 设置pageBean的其它2个属性
		pb.setData(list);
		pb.setTotalCount(totalCount);
	}
}
  1. 在Userservlet中处理分页查询用户的请求
// 处理分页查询前台用户的请求
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 获取请求的页号,即要查询第几页数据,假设请求参数名currentPage
		String pageStr = request.getParameter("currentPage");
		// 保存请求的页号
		int currentPage = 1;
		if (pageStr != null) {
			currentPage = Integer.parseInt(pageStr);
		}
		// 每页条数
		int pageSize = 2;
		// 封装成PageBean,它只有2个数据currentPage和pageSize
		PageBean<User> pb = new PageBean<>();
		pb.setCurrentPage(currentPage);
		pb.setPageSize(pageSize);
		// 调用UserService,传入PageBean
		UserService service = new UserServiceImpl();
		service.getPageBean(pb);
		// 把PageBean存到request域中
		request.setAttribute("pb", pb);
		// 转发到WEB-INF/jsp/user/list.jsp
		request.getRequestDispatcher("WEB-INF/jsp/user/list.jsp").forward(
				request, response);

	}

5在用户列表页面上分页显示用户,做分页超链接的排版

	<!-- 当前页是第1页时,首页,上一页直接显示,  
					 <a class="nocls">首页</a>   <a class="nocls">上一页</a>
					   不是第1页时,点击后跳转页面,onclick指定函数 -->
						<c:choose>
							<c:when test="${pb.currentPage eq 1}">
								<a class="nocls">首页</a>
								<a class="nocls">上一页</a>
							</c:when>
							<c:otherwise>
								<a href="javascript:void(0)" onclick="changePageNum(1)">首页</a>
								<a href="javascript:void(0)"
									onclick="changePageNum(${pb.currentPage-1})">上一页</a>
							</c:otherwise>
						</c:choose>
						<!-- 生成一组页号 -->
						<!-- 当前页显示在span里面,其它页点击后跳转页面 -->
						<c:forEach var="sn" begin="1" end="${pb.totalPage }">
							<c:choose>
								<c:when test="${pb.currentPage eq  sn}">
									<span class="current">${sn }</span>
								</c:when>
								<c:otherwise>
									<a href="javascript:void(0)" onclick="changePageNum(${sn})">${sn }</a>
								</c:otherwise>
							</c:choose>
						</c:forEach>

						<!-- 	<a href="javascript:void(0)" onclick="alert(1);">1</a> <span
							class="current">2</span> -->
						<!-- 当前页是尾页时,尾页,下一页直接显示,  
					 <a class="nocls">下一页</a>   <a class="nocls">尾页</a>
					   不是尾页时,点击后跳转页面,onclick指定函数 -->

						<c:choose>
							<c:when test="${pb.currentPage eq pb.totalPage}">
								<a class="nocls">下一页</a>
								<a class="nocls">尾页</a>
							</c:when>

					         <c:otherwise>
								<a href="javascript:void(0)" onclick="changePageNum(${pb.currentPage+1})">下一页</a>
								<a href="javascript:void(0)"
									onclick="changePageNum(${pb.totalPage})">尾页</a>
							</c:otherwise>
						</c:choose>

任务9:显示商品类别(无分页)

   1)修改main/index.jsp页面上的商品类别管理超链接

<a
				href="${pageContext.request.contextPath}/catelog.action?method=queryAll"
				target="right"><span class="icon-caret-right"></span>商品类别管理</a>

2.创建CatelogDao接口,添加查询所有商品类别的方法,代码略

package com.sxt.dao;

import java.util.List;

import com.sxt.entity.Catelog;

public interface CatelogDao {
     //全查询商品类别
	List<Catelog>  queryAll();
}
package com.sxt.dao.impl;

import java.util.List;

import com.sxt.dao.BaseDao;
import com.sxt.dao.CatelogDao;
import com.sxt.entity.Catelog;

public class CatelogDaoImpl extends BaseDao<Catelog> implements CatelogDao {

	 
	@Override
	public List<Catelog> queryAll() {
		// TODO Auto-generated method stub
		String sql="select *  from t_catelog";
		List<Catelog> list = this.getList(Catelog.class, sql);
		return list;
	}

}

3.创建CatelogService接口,加入获取所有类别的方法,代码略

package com.sxt.service;

import java.util.List;

import com.sxt.entity.Catelog;

public interface CatelogService {
   //获取所有商品类别
	List<Catelog>  getAllCatelogs();
}
package com.sxt.service.impl;

import java.util.List;

import com.sxt.dao.CatelogDao;
import com.sxt.dao.impl.CatelogDaoImpl;
import com.sxt.entity.Catelog;
import com.sxt.service.CatelogService;

public class CatelogServiceImpl implements CatelogService {

	private CatelogDao  dao=new CatelogDaoImpl();
	@Override
	public List<Catelog> getAllCatelogs() {
		// TODO Auto-generated method stub
		List<Catelog> list = dao.queryAll();
		return list;
	}

}

4.创建CatelogServlet,处理获取所有商品类别的请求

//获取所有商品类别
	public void queryAll(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//直接调用Service的方法,返回商品类别的集合
		CatelogService service=new CatelogServiceImpl();
		List<Catelog> list = service.getAllCatelogs();
		//把商品类别的集合存到request域中
		request.setAttribute("list", list);
		//转发到catelog/list.jsp
		request.getRequestDispatcher("WEB-INF/jsp/catelog/list.jsp").forward(
				request, response);
	}

猜你喜欢

转载自blog.csdn.net/qq_41532872/article/details/87950646