继续写我们的项目,上一篇博客已经实现了对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默认事件。这样我们就写完了购物车的基本操作,
具体代码如下:
当然,最后还是提醒大家修改web.xml文件中的servlet-mapping