任务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");
}
}