我们已经实现了在页面上显示数据库表中所有书籍信息的book.jsp 当用户点击时 它会链接到显示图书详细信息的 displayBook.jsp页面中,并且把isbn作为参数 传递过去,这样在displayBook.jsp页面中就可以根据isbn来取出相应的图书详细信息 以供用户点击放入购物车中...
一:displayBook.jsp
< % @ page contentType= "text/html; charset=GBK" import = "java.util.*,ShopBean.*,ShopDB.*" % > < % //从session中读取对象 List titles = ( List) session. getAttribute( "titles" ) ; int size = titles. size( ) ; BookBean book = null ; String isbn = request. getParameter( "isbn" ) ; int i = 0; while ( i< size) { book = ( BookBean) titles. get( i) ; if ( isbn. equals( book. getIsbn( ) ) ) { //保存书籍到session对象中 session. setAttribute( "bookToAdd" , book) ; //isbn匹配当前的书籍,退出循环 break ; } i+ + ; } % > < html > < head > < / head > < body > < table style = "TEXT-ALIGN:center" width = "590" > < tbody > < tr > < td colspan = "5" > < h2 > < % = book. getTitle( ) % > < / h2 > < / td > < / tr > < tr > < td rowspan = "5" > < img alt = "" src = "images/<%=book.getImageFile() %>" / > < / td > < td align = "left" > 书籍编号: < / td > < td align = "left" > < % = book. getIsbn( ) % > < / td > < / tr > < tr align = "left" > < td align = "left" > 价格: < / td > < td align = "left" > < % = book. getPrice( ) % > < / td > < / tr > < tr align = "left" > < td > 版本号: < / td > < td > < % = book. getEditionNumber( ) % > < / td > < / tr > < tr align = "left" > < td > 版权: < / td > < td > < % = book. getCopyright( ) % > < / td > < / tr > < tr align = "left" > < td > < form action = "AddBookToCart" method = "POST" > < input type = "submit" value = "放入购物车" / > < / form > < / td > < td > < form action = "viewCart.jsp" method = "GET" > < input type = "submit" value = "查看购物车" / > < / form > < / td > < / tr > < / tbody > < / table > < / body > < / html >
这样,在displayBook.jsp中 就可以根据isbn的值动态的显示用户所选书籍的详细信息了,并且为用户提供两种选择:刚入购物车和查看购物车
二:为了能够保存用户购买商品的信息,我们创建一个CartItemBean.java 它包括书籍本身的信息(图书名称,图书价格等)和购买书籍的数量
CartItemBean.java
package ShopBean; import java. io. Serializable; public class CartItemBean implements Serializable { private BookBean book; / / 当前书籍 private int quantity; / / 当前车中的数量 public CartItemBean( BookBean bookToAdd, int number) { book = bookToAdd; quantity = number; } / / 返回book public BookBean getBook( ) { return book; } / / 设定数量 public void setQuantity( int number) { quantity = number; } / / 返回数量 public int getQuantity( ) { return quantity; } }
让我们再回想一下:当我们在商场购物时,为了方便商品的拿取,我们都会首先把商品放入购物车中,在电子商城中我们也采用类似的方法,来处理商品的存取,我们使用集合类中的Map来保存用户购买的商品 他们之间的关系为:有书籍类(BookBean.java)和购买书籍的数量构成了购物车内商品信息的描述类(CartItemBean.java ),再把CartItemBean类的对象存放到HashMap中,其中HashMap中的Key值是书籍的编号isbn,value值是CartItemBean类对象,然后把保存了书籍信息的HashMap对象保存到session中 这样我们就可以操作session中的数据来实现不同用户的购买功能
三:用servlet实现把用户购买的物品放入购物车内,当在displayBook.jsp中用户选择放入购物车中时,程序所要完成的任务就是把当前信息添加到Map中去 再把Map保存在session中,这些工作由servlet AddBookToCart完成 代码如
package ShopServlet; import javax. servlet. * ; import javax. servlet. http. * ; import java. io. * ; import java. util. * ; import ShopBean. BookBean; import ShopBean. CartItemBean; ; public class AddBookToCart extends HttpServlet { private static final String CONTENT_TYPE = "text/html; charset=GBK" ; / / Initialize global variables public void init( ) throws ServletException { } / / Process the HTTP Get request public void doGet( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost( request, response) ; response. setContentType( CONTENT_TYPE) ; PrintWriter out = response. getWriter( ) ; } / / Process the HTTP Post request public void doPost( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request. getSession( false) ; RequestDispatcher dispatcher; / / 如果 session不存在, 则转向books. jsp if( session = = null) { dispatcher = request. getRequestDispatcher( "books.jsp" ) ; dispatcher. forward( request, response) ; } BookBean book = ( BookBean) session . getAttribute( "bookToAdd" ) ; / / 取出购物车添加的书籍 Map cart = ( Map ) session . getAttribute( "cart" ) ; / / 如果购物车不存在, 则创建购物车 if( cart = = null) { cart = new HashMap( ) ; / / 将购物车放入session中 session . setAttribute( "cart" , cart) ; } / / 判断书籍是否在购物车中 CartItemBean cartItem = ( CartItemBean) cart. get( book. getIsbn( ) ) ; / / 如果书籍在 则更新其数量 / / 否则, 创建一个条目到Map中 if( cartItem!=null) cartItem. setQuantity( cartItem. getQuantity( ) + 1) ; else cart. put( book. getIsbn( ) , new CartItemBean( book, 1) ) ; dispatcher = request. getRequestDispatcher( "viewCart.jsp" ) ; dispatcher. forward( request, response) ; } / / Clean up resources public void destroy( ) { } }
四:现在用jsp页面显示购物车列表 viewCart.jsp
< % @ page contentType= "text/html; charset=GBK" import = "java.util.*,java.text.*,ShopBean.*,ShopServlet.*" % > < % Map cart = ( Map) session. getAttribute( "cart" ) ; double total = 0; if ( cart = = null | | cart. size( ) = = 0) out. println( "<p>购物车当前为空</p>" ) ; else { //创建用于显示内容的变量 Set cartItems = cart. keySet( ) ; Object [ ] isbn = cartItems. toArray( ) ; BookBean book; CartItemBean cartItem; int quantity; double price, subtotal; % > < html > < head > < / head > < body > < table cellspacing = "0" cellpadding = "0" width = "590" border = "1" > < thead > < tr align = "center" > < th > 酷衣名称< / th > < th > 数量< / th > < th > 价格< / th > < th > 小计< / th > < / tr > < / thead > < % int i = 0; while ( i< isbn. length ) { //计算总和 cartItem = ( CartItemBean) cart. get( isbn[ i] ) ; book = cartItem. getBook( ) ; quantity = cartItem. getQuantity( ) ; price = book. getPrice( ) ; subtotal = quantity* price; total + = subtotal; i+ + ; % > < tr > < td > < % = book. getTitle( ) % > < / td > < td align = "center" > < % = quantity % > < / td > < td class = "right" > < % = new DecimalFormat( "0.00" ) . format( price) % > < / td > < td class = "bold right" > < % = new DecimalFormat( "0.00" ) . format( subtotal) % > < / td > < / tr > < % } % > < tr > < td colspan = "4" class = "bold right" > < b > 总计: < / b > < % = new DecimalFormat( "0.00" ) . format( total) % > < / td > < / tr > < / table > < % session. setAttribute( "total" , new Double ( total) ) ; } % > < p > < a href = "books.jsp" > 继续购物< / a > < / p > < form action = "order.html" method = "GET" > < p > < input type = "submit" value = "结 帐" / > < / p > < / form > < / body > < / html >
现在我们已经实现也将物品添加至购物车中 而且给了用户两种选择:继续购物和结账