購物車功能實現
購物車功能的實現:
一、建立購物車類:
框架:
1. 購物車可以有很多不同種類的商品,可以將購物車傳入泛型;
2. 定義一個Map型別
Map<T,Integer> carMap;
public Car(){
//建立的hashMap應為有序的,鍵不重複值可重複的部分,所以使用LinkedHashMap
carMap=new LinkedHashMap<T,Integer>();
}
//獲取購物車
public Map<T,Integer> getCarMap(){
return
}
3. 購物車會實現增加商品,減少商品,和清空購物車的功能,因為可新增對應方法:public void saveOrUpdate(T p,Integer q){
//如果當前的購物車包含商品
if(carMap.containsKey(p)){
//獲取當前商品的數量
int qq=carMap.get(p);
//將商品和數量放置到購物車中
carMap.put(p, qq+q);
}else{
//如果當前的購物車沒有商品,將當前的購物車數量放置到Map中
carMap.put(p, q);
}
}
二、car.jsp頁面操作:
1.引入<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
這樣能夠使用jstl語句;
2.購物車中有繼續購物,清除購物車和新增訂單的功能;所以在jsp頁面上設定對應的連結,實現相關操作:
<div align="right">
<a href="${pageContext.request.contextPath}/ProdListServlet">
<a href="${pageContext.request.contextPath}/CleanServlet">清空購物車</a>
<a href="${pageContext.request.contextPath}/addOrder.jsp">新增訂單</a>
</div>
3.購物車中也有金額實現,定義變數money,初始化值為0;
<c:set var="money" value="0"></c:set>
4. 購物車中:縮圖、商品名稱、種類、單價、數量、總價、操作內容
使用<c:forEach>方式進行遍歷,裡面分別有傳入縮圖的路徑;商品的名稱,種類、單價、數量、總價、操作;詳見程式碼:
<table>
<c:forEach items="${car.carMap}" var="entry">
<tr>
<td><img src="${pageContext.request.contextPath}/ImgServlet?id=${entry.key.id}&type=s"></td>
<td>${entry.key.name }</td>
<td>${entry.key.category }</td>
<td>${entry.key.price }元</td>
<td><input type="text" value="${entry.value}" onchange="changeNum('${entry.key.id}',this)"></td>
<td>${entry.key.price*entry.value }元</td>
<c:set var="money" value="${money+ entry.key.price*entry.value }"></c:set>
<td><a href="${pageContext.request.contextPath}/DelCarServlet?id=${entry.key.id}">刪除</a></td>
</tr>
</c:forEach>
</table>
在jsp頁面的右下角,設定總金額:
<div align="right">
<font color="red" size="6">總價:${money}元</font>
</div>
三、servlet相關操作:
⑴ProdListServlet功能實現:繼續購物,就是轉回到購物列表中;
1.宣告ProdService類物件,便於查詢所有商品
ProdService service=(ProdService) BasicFactory.getFactory().getInstance("ProdService");
2.在doPost或doGet方法中呼叫findAllProds()方法:
//獲取所有商品,並將其返回到列表中
List<Prod> list=service.findAllProds();
request.setAttribute("list", list);
request.getRequestDispatcher("/prodList.jsp").forward(request, response);
3.因為涉及到findAllProds()方法,所以在ProductDaoImpl實現findAllProds()操作;
1)定義sql語句:
String sql = "select * from products";
2)QueryRunner runner=new QueryRunner(DaoUtils.getSource());
3)Runner.update(sql,new BeanListHandler<Prod>(Prod.class));
⑵CleanServlet功能實現,清空購物車:
首先需要獲取car物件,然後呼叫clean方法
Car<Prod> car=(Car<Prod>) request.getSession().getAttribute("car");
Car.clean();
當購物車清空完畢後,跳轉到car.jsp頁面
response.sendRedirect(request.getContextPath()+"/car.jsp");
四、設定刪除購物車商品的功能:
建立連結:
<td><a href="${pageContext.request.contextPath}/DelCarServlet?id=${entry.key.id}">刪除</a></td>
在DelCarServlet實現刪除操作:
1)首先獲取ProdService物件
ProdService service = (ProdService) BasicFactory.getFactory().getInstance("ProdService");
2)獲取商品的id
String id = request.getParameter("id");
3)根據商品的id獲取商品物件
Prod prod = service.findProdById(Integer.valueOf(id));
4)獲取session中的car物件
Car<Prod> car=(Car<Prod>)request.getSession().getAttribute(“car”);
5)讓購物車實現刪除商品的操作:
car.delete(prod);
6)當刪除完商品後,重定向到car.jsp頁面中
response.sendRedirect(request.getContextPath()+"/car.jsp");
五、頁面金額隨著點選數目,而做出總額改變的功能:
在car.jsp頁面中,設定初始化變數money,它的值為0
<c:set var=”money” value=”0”><c:set>
//遍歷的內容是car的map類,這樣可以使用jstl直接呼叫屬性值;如下程式碼顯示,${entry.key.id}可以獲取carMap的id值;
<c:forEach items="${car.carMap}" var="entry">
<td><input type="text" value="${entry.value}" onchange="changeNum('${entry.key.id}',this)"></td>
</c:forEach>
遍歷後,為了方便展示總價,使用此樣式
<div align="right">
<font color="red" size="6">總價:${money}元</font>
</div>
六、縮圖功能的實現:
Jsp頁面顯示:
<c:forEach items="${car.carMap}" var="entry">
<tr>
<td><img src="${pageContext.request.contextPath}/ImgServlet?id=${entry.key.id}&type=s"></td>
</tr>
Servlet進行操作:
先獲取id和type.
String id=request.getParameter(“id”);
String type=request.getParameter(“type”);
//獲取商品物件
Prod prod=service.findProdById(Integer.valueOf(id));
String s=null;
判斷當前type是否為s,因為在PicUtils中使用s來判斷縮圖,如果是縮圖,就將縮圖的地址傳到s中;
If(“s”.equals(type)){
//獲取縮圖的地址
s = prod.getImgurls();
}else{
//獲取普通圖的地址
s = prod.getImgurl();
}
//進行轉發
request.getServletContext().getRequestDispatcher(s).forward(request, response);
Service進行操作:
@Override
public Prod findProdById(Integer id) {
// TODO Auto-generated method stub
return dao.findProdById(id);
}
Dao進行操作:
定義sql語句:
String sql = "select * from products where id=?";
//獲取連線物件
QueryRunner runner = new QueryRunner(DaoUtils.getSource());
//使用更新
Prod prod=runner.query(sql, newBeanHandler<Prod>(Prod.class),id);
return prod;