图书商城【6】

继续写我们的项目,上一篇博客已经实现了对product的基本操作,这篇博客我们写一下购物车模块,在showCart中,写了对商品数量操作和删除的js代码。当点击+ -按钮时会调用函数changeCount(商品的id,商品修改数量,商品的库存)οnclick="changeCount('${entry.key.id }','${entry.value-1}','${entry.key.pnum}')" 在js中它是没数据类型的,那么当传递参数时,在函数中,可能认为它是一个字符串,那么就会引起问题。通过parseInt()函数将数值转换成数字. 在函数中处理数据后,会将数据传递到服务器端 location.href = "${pageContext.request.contextPath}/cart?method=update&id=" + id+ "&count=" + count;然后在CartServlet中通过判断method=update完成操作. 1.得到要修改商品的id,在得到要修改的商品数量值count. 2.直接对购物车中的商品进行操作.3.为什么直接创建一个Product对象,将id值赋值给它,就可以直接修改商品数量. 原因:对Product类中的equals方法进行了重写,只比较商品的id.在重写equalse方法时,也将hashCode方法重写了.文本框失去焦点时,也调用οnblur="changeCount('${entry.key.id}',this.value,'${entry.key.pnum}')注意:传递了this.value,它代表的是文本框中的值通过对文本添加onkeydown事件操作,当键盘按下时,会调用一个函数.numbText(event)在函数中通过判断按下键的keyCode值,就是键码值,来判断当前是否按下的是指定的按钮。 注意:对于firefox或ie浏览器,它们获取事件对象event有区别。code = e.which; 判断firefox浏览器  得到键码值. code = window.event.keyCode; 判断是ie浏览器,得到键码值. if (!(code >= 48 && code <= 57 || code == 8 || code == 46)) 这是判断当前按下的不是0-9  delete  backspace这时就要阻止事件的默认行为.e.preventDefault();  firefox阻止默认行为执行,window.event.returnValue = false; ie浏览器阻止默认行为执行.

接下来我们在CartServlet中开始实现这些功能,还是先在doGet方法里确定传递过来的method,然后进行相应的操作。比如说添加商品到购物车操作,我们要先得到商品的id,然后根据id查找到商品,然后我们获取到购物车的session,如果得到的相应session为空,则说明此用户购物车为空,我们要为用户创建一个HashMap。然后我们再从购物车里查看所要添加的商品数量是否为空,如果为空,我们就将数量设置为1,如果不为空,则只要给数量+1即可,做完这些后,我们只要再将这些值存储到session中就完成了商品对购物车的添加和数量修改操作,同时在showCart页面中,也可以通过el表达式算出总价。其次就是删除操作,删除时只要找到商品id,然后通过对Map的remove方法即可进行删除操作,在确认删除操作时可以直接在href中 触发js函数,询问用户是否确认,如果确认,location.href 发起删除请求 ---<a href="javasript:confirmDel();" >...</a>在href中 触发js函数,询问用户是否确认,如果确认,location.href 发起删除请求 --- <a href="javasript:confirmDel();" >...</a>会有一种写法是<a href="/delCart?id=xx" οnclick="confirmDel(); "></a> 在链接中添加 onclick事件 ,询问用户是否确认,如果用户取消,通过JS阻止href事件提交,阻止href默认事件 : e.preventDefault()。个人并不推荐第二种写法,因为ie浏览器会阻止href默认事件。这样我们就写完了购物车的基本操作,

具体代码如下:

package cn.itcast.estore.web.servlet;

import java.io.IOException;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

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 cn.itcast.estore.domain.Product;
import cn.itcast.estore.service.ProductServiceImpl;

/**
 * Servlet implementation class CartServlet
 */
public class CartServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public CartServlet() {
		super();
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.getWriter().append("Served at: ").append(request.getContextPath());
		String method = request.getParameter("method");
		if ("add".equals(method)) {// 添加商品到购物车
			add(request, response);
		} else if ("remove".equals(method)) { // 从购物车删除商品
			remove(request, response);
		} else if ("update".equals(method)) {// 修改购物车商品
			update(request, response);
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

	// 添加商品到购物车
	public void add(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 1.得到要添加到购物车中的商品的id
		String id = request.getParameter("id");
		// 2.根据id查找商品
		try {
			Product p = new ProductServiceImpl().findById(id);
			// 3.得到购物车
			HttpSession session = request.getSession();
			Map<Product, Integer> cart = (Map<Product, Integer>) session.getAttribute("cart");
			if (cart == null) {// 如果cart不存在,说明是第一次购物.
				cart = new HashMap<Product, Integer>();
			}
			// 判断购物车中是否有要添加商品。
			Integer count = cart.put(p, 1);
			if (count != null) {
				// 说明有
				cart.put(p, count + 1);
			}
			session.setAttribute("cart", cart);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		response.sendRedirect(request.getContextPath() + "/index.jsp");
	}

	// 从购物车中删除商品
	public void remove(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String id = request.getParameter("id");

		Product p = new Product();
		p.setId(id);

		// 得到购物车
		Map<Product, Integer> cart = (Map<Product, Integer>) request.getSession().getAttribute("cart");

		cart.remove(p);

		if (cart.size() == 0) {
			request.getSession().removeAttribute("cart");
		}

		response.sendRedirect(request.getContextPath() + "/showCart.jsp");
	}

	// 修改购物车中商品数量
	public void update(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 得到要修改的商品的数量与商品id。
		String id = request.getParameter("id");
		int count = Integer.parseInt(request.getParameter("count"));

		// 这是要修改的商品
		Product p = new Product();
		p.setId(id);

		// 得到购物车
		Map<Product, Integer> cart = (Map<Product, Integer>) request.getSession().getAttribute("cart");

		// 修改商品的数量
		if (count == 0) {
			cart.remove(p); // 将商品从购物车中移除
		} else {
			cart.put(p, count);
		}
		request.getSession().setAttribute("cart", cart);
		response.sendRedirect(request.getContextPath() + "/showCart.jsp");
	}

}

当然,最后还是提醒大家修改web.xml文件中的servlet-mapping
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值