图书购买系统之本地添加购物车(完善版)--实现生成订单和子订单

本文详细介绍了从实现购物车页面、JS交互,到订单提交成功页面的全过程,包括订单和子订单的生成。涉及到的组件包括Ajax检查登录状态、插入订单项等功能,并在用户未登录时引导登录。

1.实现效果图


2.cart.jsp购物车页面

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>cart</title>
		<!--引入bootstrap.css-->
		<link rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/bootstrap/css/bootstrap.css"/>
		<!--引入myscss.css-->
		<link rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/css/myscss.css" />
		<!--bootstrapValidator.css-->
		<link rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/bootstrapvalidate/css/bootstrapValidator.css" />
		<!--引入jquery.js-->
		<script type="text/javascript" src="<%=request.getContextPath()%>/bootstrap/js/jquery-3.1.1.js"></script>
		<!--bootstrap.js-->
		<script type="text/javascript" src="<%=request.getContextPath()%>/bootstrap/js/bootstrap.js"></script>
		<!--cart.js-->
		<script type="text/javascript" src="<%=request.getContextPath()%>/foreground/cart/cart.js"></script>
		<!--bootstrapValidator.js-->
		<script type="text/javascript" src="<%=request.getContextPath()%>/bootstrapvalidate/js/bootstrapValidator.js"></script>
		<!--contextPath-->
		<script type="text/JavaScript">
			var contextPath = "${pageContext.request.contextPath}";
		</script>
		
	</head>
	<body>
		<!--公用头部-->
		<!-- <div id="navhead"></div> -->
		<%@include file="/foreground/common/head.jsp"%>
		<!--主体部分-->
		<div class="container">
			<div class="row">
				<div class="col-md-1"></div>
				<div class="col-md-10">
					<!--content头部图片-->
					<img src="<%=request.getContextPath()%>/img/otherimages/buy1.gif" />
					<!--content中的table-->
					<div class="panel panel-info margintop">
					  	<div class="panel-heading text-center"><h4><strong>购物车列表</strong></h4></div>
					  	<div id="cartable">
					    	<!--<table class="table text-center">
								<tr class="danger">
									<th class="text-center">序号</th>
									<th class="text-center">商品名称</th>
									<th class="text-center">价格</th>
									<th class="text-center">购买数量</th>
									<th class="text-center">库存</th>
									<th class="text-center">小计</th>
								</tr>
								<tr>
									<td>0</td>
									<td>Java模式</td>
									<td>21.5</td>
									<td><a class='glyphicon glyphicon-minus-sign' onclick='subBuyNum(this)'></a>1<a class='glyphicon glyphicon-plus-sign' onclick='addBuyNum(this)'></a></td>
									<td>100</td>
									<td>21.5</td>
								</tr>
								<tr>
									<td>1</td>
									<td>JavaScript</td>
									<td>18.5</td>
									<td>1</td>
									<td>100</td>
									<td>18.5</td>
								</tr>
							</table>-->
					  	</div>
						<div class="panel-footer clearfix"><span id="totalprice" class="pull-right">总计</span></div>
					</div>
					<form id="orderform" class="form-horizontal">
					  	<div class="form-group">
					    	<label for="receiverAddress" class="col-md-1 control-label">地址</label>
					    	<div class="col-md-4">
					      		<input type="text" class="form-control" name="receiverAddress" id="receiverAddress" placeholder="请输入收货地址">
					    	</div>
					  	</div>
					  	<div class="form-group">
					    	<label for="receiverName" class="col-md-1 control-label">收货人</label>
					    	<div class="col-md-4">
					      		<input type="text" class="form-control" id="receiverName" name="receiverName" placeholder="请输入收货人姓名">
					    	</div>
					  	</div>
					  	<div class="form-group">
					    	<label for="receiverPhone" class="col-md-1 control-label">电话</label>
					    	<div class="col-md-4">
					      		<input type="text" class="form-control" id="receiverPhone" name="receiverPhone" placeholder="请输入收货人电话">
					    	</div>
					  	</div>
					  	<div class="form-group">
					    	<div class="col-md-12 text-right">
					      		<a href="<%=request.getContextPath()%>/foreground/book/home.jsp">
					      			<input type="button" value="" style="background:url('<%=request.getContextPath()%>/img/otherimages/gwc_jx.gif') no-repeat;width:130px;height:45px;border:0px"/>
					      		</a>
					      		<a href="<%=request.getContextPath()%>/foreground/user/user.jsp">
					      			<input type="submit" id="submitform" value="" style="background:url('<%=request.getContextPath()%>/img/otherimages/gwc_buy.gif') no-repeat;width:130px;height:45px;border:0px"/>
					      		</a>
					   		</div>
					  	</div>
					</form>
				</div>
				<div class="col-md-1"></div>
			</div>
		</div>
		<!--显示弹出框让用户登录-->
		<div id="showloginform">
		</div>
	</body>
</html>

3.cart.js

//购物车动态添加购物车信息
$(function(){
	//1.从localStorage获取购物信息
	var books = localStorage.getItem("carts");
	var bookArr = JSON.parse(books);//将获取到的字符串存放进数组中
	//2.声明一个html用来拼接页面
	var html = "";
	html +=	"<table id='cart' class='table text-center'>";
	html +=		"<tr class='danger'>";
	html +=			"<th class='text-center'>序号</th>";
	html +=			"<th class='text-center'>商品名称</th>";
	html +=			"<th class='text-center'>价格</th>";
	html +=			"<th class='text-center'>购买数量</th>";
	html +=			"<th class='text-center'>库存</th>";
	html +=			"<th class='text-center'>小计</th>";
	html +=		"</tr>";
	//3.遍历数组
	for(var i = 0;i < bookArr.length;i++){
		//获取一本书
		var abook = bookArr[i];
		//将书本的信息填到表格中
		html +=	"<tr>";
		html +=		"<td>"+i+"</td>";
		html +=		"<td>"+abook.name+"</td>";
		html +=		"<td>"+abook.price+"</td>";
		html +=		"<td><a class='glyphicon glyphicon-minus-sign' onclick='subBuyNum(this)'></a>"+abook.buynum+"<a class='glyphicon glyphicon-plus-sign' onclick='addBuyNum(this)'></a></td>";
		html +=		"<td>"+abook.num+"</td>";
		html +=		"<td>"+abook.price*abook.buynum+"</td>";
		html +=	"</tr>";
	}
	html +=	"</table>";
	$("#cartable").html(html);
});
//点击减号按钮
function subBuyNum(caller){
	calFunction(caller,"sub");
}
//点击加号按钮
function addBuyNum(caller){
	calFunction(caller,"add");
}
//优化代码
function calFunction(caller,tag){
	//得到当前调用者的父节点
	var $parent = $(caller).parent();
	//得到当前调用者的父节点的下一个兄弟
	var $bro = $(caller).parent().next();
	//找到父节点的文本信息
	var buyNum = parseInt($parent.text());
	var num = parseInt($bro.text());
	//判断当前是+还是-
	if(tag == "sub"){
		//减号
		if(buyNum>=2){
			buyNum--;
			num++;
		}
	}
	//加号
	else{
		buyNum++;
		num--;
	}
	//4.拼接html信息,把html放到parent中
	var html = "";
	html += "<a class='glyphicon glyphicon-minus-sign' onclick='subBuyNum(this)'></a>"+buyNum+"<a class='glyphicon glyphicon-plus-sign' onclick='addBuyNum(this)'></a>";
	$parent.html(html);

	$bro.html(num);
	
	//5.找到价格元素的信息
	var $price = $parent.prev();
	var price = parseFloat($price.text());
	
	//6.修改小计元素的信息
	var $lastB = $parent.next().next();
	$lastB.text(price*buyNum);
	
	//7.修改总计元素的信息
	calTotal();
	
	//8.修改本地购物车的数量
	//8.1找到序号数列
	var $first = $parent.parent().children(":first-child");
	var n = parseInt($first.text());
	modiyBuyNum(n,buyNum,num);
}

//计算当前购物车的总价格
function calTotal(){
	var $totalPrice = $("#totalprice"); 
	//找到table里面的tbody,其实table的所有正文信息都放在tbody里面
	var $table = $("#cart").children();
	var $children = $table.children(":not(:first)");
	var $rowprices = $children.children(":last-child");
	var totalp = 0;
	$rowprices.each(function(){
		var p = parseFloat($(this).text());
		totalp += p;
	})
	$totalPrice.text("总计:"+totalp);
}

//页面一载入就计算总计购物车的总价信息
$(function(){
	calTotal();
})
//修改本地购物车的数量
function modiyBuyNum(idx,buynum,num){
	//1.获取本地购车的数据(字符串)
	var books = localStorage.getItem("carts");
	//2.把字符串转换为数组对象
	var bookArr = JSON.parse(books);
	//3.从数组中获取指定idx的数据
	var abook = bookArr[idx];
	//4.修改这条数据
	abook.buynum = buynum;
	abook.number = num;
	//5.重新保存购物车
	var booksStr = JSON.stringify(bookArr);
	localStorage.setItem("carts",booksStr);
}


//表单验证的方法,使用bootstrapValidator插件来完成
$(function(){
	$("#orderform").bootstrapValidator({
		feedbackIcons : {
			valid : 'glyphicon glyphicon-ok',
			invalid : 'glyphicon glyphicon-remove',
			validating : 'glyphicon glyphicon-refresh'
		},
		fields : {
			receiverAddress : {
				validators : {
					notEmpty : {
						message : '地址不能为空'
					},
					stringLength : {
						min : 2,
						max : 18,
						message : '地址必须在2到18位之间'
					}
				}
			},
			receiverName : {
				validators : {
					notEmpty : {
						message : '姓名不能为空'
					},
					stringLength : {
						min : 2,
						max : 18,
						message : '姓名长度必须在2到18位之间'
					}
				}
			},
			receiverPhone : {
				validators : {
					notEmpty : {
						message : '电话不能为空'
					},
					regexp : {
						regexp : /^1[0-9]{10}$/,
						message : '电话格式不正确'
					}
				}
			}
		}
	}).on("success.form.bv", function(e) {
		/*alert("sucess");*/
	});
});
//在购物车没有数据、用户没有输入送货地址等信息的情况下,不需要检查用户的登录情况(不需要发送ajax)
$(function(){
	$("#submitform").click(function(){
		//1.从localStorage获取所存的购物车信息
		var books = localStorage.getItem("carts");
		var bookArr = JSON.parse(books);
		//2.如果bookArr不存在或者数据长度为0,则不允许提交表单
		if(bookArr == null){
			return false;
		}
		if(bookArr.length == 0){
			return false;
		}
		//3.如果输入框没有内容,禁止提交表单
		var inputisnull = false;
		$(":text").each(function(){
			if($(this).val().length == 0){
				inputisnull = true;
			}
		});
		if(inputisnull == true){
			alert("请输入地址,收货人和电话");
			return false;
			
		}
		//4.使用Ajax检查用户是否登录
		var sendUrl = contextPath+"/AjaxCheckIsLoginServlet?time="+new Date().getTime();
		$.ajax({
			type:"post",
			url:sendUrl,
			asasync:true,
			//请求成功回调函数
			success:function(backData,textStatus,xmlHttpRequest){
				if(backData == "yes"){
					//提交订单
					commitOrder();
				}
				//如果用户没有登录
				else{
					alert("sdfsdf");
					//显示登录页面
					showLoginPage();
				}
			}
		});
		return false;
	});
});
//发送ajax请求,提交订单
function commitOrder(){
	//1.从localStorage获取所存的购物车信息
	var orderitems = localStorage.getItem("carts");
	//2.发送ajax请求,订单提交数据
	var sendUrl = contextPath+"/AjaxMakeOrderServlet?"+"time"+new Date().getTime()+"&totalprice="+$("#totalprice").text().substr(3);
	$.ajax({
		type:"post",
		url:sendUrl,
		data:{
			"orderitems":orderitems,
			"receiverAddress":$("#receiverAddress").val(),
			"receiverName":$("#receiverName").val(),
			"receiverPhone":$("#receiverPhone").val()
		},
		async:true,
		success:function(backData,textStatus,xmlHttpRequest){
			var jsonobj = JSON.parse(backData);
			if("success" == jsonobj.status){
				//清空购物车
				localStorage.removeItem("carts");
				//跳转页面 
				window.location.href = contextPath+"/foreground/cart/makeordersuccess.jsp?orderid="+jsonobj.orderid+"&totalprice="+jsonobj.totalprice;
			}
		}
	});
}
//显示登录弹出的模态框
function showLoginPage(){
	alert("OK");
	var html = ""; 
	html+="<div>";
	html+=	"<div class='modal fade' tabindex='0' id='myModal2'>";
	html+=	  	"<div class='modal-dialog' >";
	html+=	    	"<div class='modal-content'>";
	html+=	      		"<div class='modal-header text-center'>";
	html+=	        		"<button type='button' class='close' data-dismiss='modal'><span>×</span></button>";
	html+=	        		"<h4 class='modal-title'>用户登录</h4>";
	html+=	      		"</div>";
	html+=	      		"<div class='modal-body paddingtop'>";
	html+=					"<p class='text-danger text-center' id='loginmsg'></p>"
	html+=	        		"<form id='loginform' class='form-horizontal'>";
	html+=	        			"<div class='form-group'>";
	html+=        					"<label for='name' class='col-md-4 control-label'>用户名</label>";
	html+=							"<div class='col-md-4'>";
	html+=						    	"<input type='text' class='form-control' name='name' id='name' placeholder='请输入用户名'>";
	html+=						    "</div>";
	html+=	        			"</div>";
	html+=	        			"<div class='form-group'>";
	html+=						    "<label for='pass' class='col-md-4 control-label'>密码</label>";
	html+=						    "<div class='col-md-4'>";
	html+=						      	"<input type='password' class='form-control' id='pass' name='pass' placeholder='请输入密码'>";
	html+=							"</div>";
	html+=						"</div>";				  
	html+=				 		"<div class='form-group text-center'>";
	html+=				   			"<input type='button' onclick='submitlogin()' class='btn btn-success' style='width: 200px;' value='登录'/>";
	html+=				 		"</div>";
	html+=	        		"</form>";
	html+=	    		"</div>";
	html+=  		"</div>";
	html+=		"</div>";
	html+=	"</div>";
	html+="</div>";
	$("#showloginform").html(html);
	$("#myModal2").modal('show');
}
//用户在弹出登录框中输入用户密码,提交表单的事件
function submitlogin(){
	var formData = $("#loginform").serialize();
	var sendUrl = contextPath+"/AjaxDoCartLoginServlet?&time="+new Date().getTime();
	$.ajax({
		type:"post",
		url:sendUrl,
		data:formData,
		async:true,
		success:function(backData,textStatus,xmlHttpRequest){
			if("success" == backData){
				$("#loginmsg").html("登录成功,3秒后跳转页面");
				var time = setInterval(function(){
					clearInterval(time);
					//提交order表单数据,生成订单
					commitOrder();
				},3000);
			}
			else{
				//提示登录出错信息
				$("#loginmsg").html(backData);
			}
		}
		
	});
}

4.makeordersuccess.jsp,订单提交成功页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
	<title>Insert title here</title>
	<!--引入bootstrap.css-->
	<link rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/bootstrap/css/bootstrap.css"/>
	<!--引入myscss.css-->
	<link rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/css/myscss.css" />
	<!--引入jquery.js-->
	<script type="text/javascript" src="<%=request.getContextPath()%>/bootstrap/js/jquery-3.1.1.js"></script>
	<!--bootstrap.js-->
	<script type="text/javascript" src="<%=request.getContextPath()%>/bootstrap/js/bootstrap.js"></script>
</head>
<body>
	<%@ include file="/foreground/common/head.jsp" %>
	<div class="container">
		<h3 class="text-success">订单提交成功,请您尽快支付!订单号:${param.orderid }</h3>
		<p class="text-warning">请在24小时之内完成支付,否则订单会被自动取消</p>
		<p class="text-danger">应付款金额:${param.totalprice }</p>
	</div>
</body>
</html>

5.OrderDao.java,OrderDao接口

package com.chinasoft.dao;

import java.sql.SQLException;
import java.util.List;

import com.chinasoft.entity.Order;

public interface OrderDao {
	//添加一个订单
	public void addOrder(Order order) throws SQLException;
	//根据用户id查找该用户的所有订单
	public List<Order> findOrdersByUserId(int id) throws SQLException;
	//根据订单id查询订单
	public Order findOrdersByOrderId(String orderid) throws SQLException;
	//跟新指定订单id的订单状态信息
	public void modifyOrderState(String orderid) throws SQLException;
	//删除订单
	public void deleteOrder(Order order) throws SQLException;
}

6.OrderItemDao.java,OrderItem接口

package com.chinasoft.dao;

import java.sql.SQLException;
import java.util.List;

import com.chinasoft.entity.Order;
import com.chinasoft.entity.OrderItem;

public interface OrderItemDao {
	//添加一个订单子单项
	public void addOrderItem(Order order) throws SQLException;
	//根据订单id查询该订单的所有订单项
	public List<OrderItem> findOrderItemsByOrderId(String orderid) throws SQLException;
	//根据子单的订单id删除订单子单
	public void deleteOrderItem(OrderItem orderitem) throws SQLException;
}

7.ImplOrderDao.java,OrderDao实现类

package com.chinasoft.dao.impl;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;

import com.chinasoft.dao.OrderDao;
import com.chinasoft.entity.Order;
import com.chinasoft.entity.OrderItem;
import com.chinasoft.entity.User;
import com.chinasoft.util.C3P0Util;

public class ImplOrderDao implements OrderDao{

	/**
	 * 添加一个订单
	 */
	@Override
	public void addOrder(Order order) throws SQLException {
		QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
		//插入订单基本信息
		qr.update("insert into orders(id,money,receiverAddress,receiverName,receiverPhone,payState,user_id) values(?,?,?,?,?,?,?)",
				order.getId(),order.getMoney(),order.getReceiverAddress(),order.getReceiverName(),order.getReceiverPhone(),order.getPaystate(),order.getUser().getId());
		
		//订单的子单信息(具体所买的商品信息)
		ImplOrderItemDao implOrderItemDao = new ImplOrderItemDao();
		implOrderItemDao.addOrderItem(order);
	}

	/***
	 * 查找某个用户的所有订单
	 */
	@Override
	public List<Order> findOrdersByUserId(int id) throws SQLException {
		QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
		//1.查找该用户的所有订单
		List<Order> orders = qr.query("select * from orders where user_id = ?", new BeanListHandler<>(Order.class),id);
		//2.根据用户id查询该用户的具体信息
		ImplUserDao implUserDao = new ImplUserDao();
		User u = implUserDao.findUserById(Integer.toString(id));
		//3.订单子单项的实现类
		ImplOrderItemDao implOrderItemDao = new ImplOrderItemDao();
		//4.遍历每一个订单
		for(Order o : orders){
			//查询该订单的具体子单项
			List<OrderItem> items = implOrderItemDao.findOrderItemsByOrderId(o.getId());
			//子单项设置对应 的订单信息
			for(OrderItem item:items){
				item.setOrder_id(o.getId());
			}
			//该订单设置对应的子单和用户信息
			o.setOrderitems((ArrayList<OrderItem>)items);
			o.setUser(u);
		}
		return orders;
	}

	
	/**
	 * 根据订单id查询指定订单
	 */
	@Override
	public Order findOrdersByOrderId(String orderid) throws SQLException {
		QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
		Order order = qr.query("select * from orders where id = ?", new BeanHandler<>(Order.class),orderid);
		return order;
	}

	/**
	 * 修改订单状态
	 */
	@Override
	public void modifyOrderState(String orderid) throws SQLException {
		QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
		qr.update("update orders set paystate = ? where id = ?", "1",orderid);
	}

	/**
	 * 删除订单
	 */
	@Override
	public void deleteOrder(Order order) throws SQLException {
		QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
		//先删OrderItem表
		for(OrderItem item : order.getOrderitems()){
			ImplOrderItemDao implOrderItemDao = new ImplOrderItemDao();
			implOrderItemDao.deleteOrderItem(item);
		}
		
		//再删Order表
		qr.update("delete from orders where id = ?",order.getId());
	}

}

8.ImplOrderItemDao.java,OrderItemDao实现类

package com.chinasoft.dao.impl;

import java.sql.SQLException;
import java.util.List;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;

import com.chinasoft.dao.OrderItemDao;
import com.chinasoft.entity.Order;
import com.chinasoft.entity.OrderItem;
import com.chinasoft.entity.Product;
import com.chinasoft.util.C3P0Util;

public class ImplOrderItemDao implements OrderItemDao{

	/**
	 * 添加订单的子单项
	 */
	@Override
	public void addOrderItem(Order order) throws SQLException {
		QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
		//把每一个订单的子单插入到数据库
		for(OrderItem item : order.getOrderitems()){
			qr.update("insert into orderitem values(?,?,?)", order.getId(),item.getProduct_id(),item.getBuynum());
		}
	}

	
	/**
	 * 查找某一个订单的所有子单
	 */
	@Override
	public List<OrderItem> findOrderItemsByOrderId(String orderid) throws SQLException {
		QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
		//根据订单查询所有的订单项
		List<OrderItem> items = qr.query("select * from orderitem where order_id = ?", new BeanListHandler<>(OrderItem.class), orderid);
		ImplProductDao implProductDao = new ImplProductDao();
		for(OrderItem item : items){
			//查询订单项的书籍信息
			Product product = implProductDao.findBookById(item.getProduct_id());
			//订单项关联书籍
			item.setProduct(product);
		}
		return items;
	}

	
	/**
	 * 根据子单的订单id删除订单子单
	 */
	@Override
	public void deleteOrderItem(OrderItem orderitem) throws SQLException {
		QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
		qr.update("delete from orderitem where order_id = ?",orderitem.getOrder_id());
	}

}


9.AjaxCheckIsLoginServlet.java,检测用户是否登录

package com.chinasoft.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.chinasoft.entity.User;

/**
 * @author jf
 * 功能:检测用户是否登录
 */
@WebServlet("/AjaxCheckIsLoginServlet")
public class AjaxCheckIsLoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
    public AjaxCheckIsLoginServlet() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		//获取浏览器中存储的session对象
		User user = (User) request.getSession().getAttribute("user");
		//user不为空,说明用户已经登录
		if(user!=null){
			response.getWriter().write("yes");
		}else{
			response.getWriter().write("no");
		}
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

10.AjaxMakeOrderServlet.java,向数据库插入订单项

package com.chinasoft.servlet;

import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.UUID;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.chinasoft.dao.impl.ImplOrderDao;
import com.chinasoft.entity.Order;
import com.chinasoft.entity.OrderItem;
import com.chinasoft.entity.User;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

/**
 * @author jf
 * 功能:向数据库插入订单项
 */
@WebServlet("/AjaxMakeOrderServlet")
public class AjaxMakeOrderServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public AjaxMakeOrderServlet() {
        super();
    }

	@SuppressWarnings({ "unchecked", "static-access" })
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//1.获取请求参数
		String receiverAddress = request.getParameter("receiverAddress");
		String receiverName = request.getParameter("receiverName");
		String receiverPhone = request.getParameter("receiverPhone");
		String oitems = request.getParameter("orderitems");
		String totalPrice = request.getParameter("totalprice");
		//2.引入json需要的jar包
		//3.把oitems解析长订单的子单对象
		JSONArray jarr = JSONArray.fromObject(oitems);
		List<OrderItem> orderItems = jarr.toList(jarr,OrderItem.class);
		
		//4.生成订单对象
		Order order = new Order();
		order.setId(UUID.randomUUID().toString());
		order.setMoney(Float.parseFloat(totalPrice));
		order.setReceiverAddress(receiverAddress);
		order.setReceiverName(receiverName);
		order.setReceiverPhone(receiverPhone);
		order.setPaystate(0);
		
		//5.遍历订单子单,设置子单关联的订单id
		for(OrderItem item : orderItems){
			item.setOrder_id(order.getId());
		}
		//6.设置订单关联的子单以及订单关联的用户信息
		order.setOrderitems((ArrayList<OrderItem>)orderItems);
//		ImplUserDao implUserDao = new ImplUserDao();
		User user = (User) request.getSession().getAttribute("user");
		order.setUser(user);
		//7.插入订单
		ImplOrderDao implOrderDao = new ImplOrderDao();
		try {
			implOrderDao.addOrder(order);
			//8.拼接JSON数据返回客户端
			HashMap<String,String> map = new HashMap<>();
			map.put("totalprice", totalPrice);
			map.put("orderid", order.getId());
			map.put("status", "success");
			String json = JSONObject.fromObject(map).toString();
			response.getWriter().write(json);
		} catch (SQLException e) {
			e.printStackTrace();
			System.out.println(e.getMessage());
		}
		
		
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

11.AjaxDoCartLoginServlet.java提交购物车的时候,如果用户没有登录,则弹出登录框让用户登录,此处处理弹出框登录的逻辑

package com.chinasoft.servlet;

import java.io.IOException;
import java.sql.SQLException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.chinasoft.dao.impl.ImplUserDao;
import com.chinasoft.entity.User;

/**
 * @author jf
 * 功能:提交购物车的时候,如果用户没有登录,则弹出登录框让用户登录,此处处理弹出框登录的逻辑
 */
@WebServlet("/AjaxDoCartLoginServlet")
public class AjaxDoCartLoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public AjaxDoCartLoginServlet() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//1.获取ajax请求过来的账号和密码
		String name = request.getParameter("name");
		String pass = request.getParameter("pass");
		
		//2.根据账号密码查询数据库
		ImplUserDao implUserDao = new ImplUserDao();
		try {
			//2-1找到用户保存用户
			User user = implUserDao.findUserByUserNameAndPassword(name, pass);
			if(user!=null){
				request.getSession().setAttribute("user", user);
				response.getWriter().write("success");
			}
			//2-2没有找到用户存储,没有找到用户信息
			else{
				response.getWriter().write("此用户不存在");
			}
			//2-3发生错误储存错误信息
		} catch (SQLException e) {
			response.getWriter().write(e.getMessage());
			e.printStackTrace();
		}
		
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}





评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值