主要內(nèi)容:
l 完成購(gòu)物車的其他基本功能;
l 生成訂單;
l 小結(jié)
1、購(gòu)物車的其它功能
對(duì)購(gòu)物車的物品數(shù)量修改和物品刪除功能是兩外兩個(gè)基本功能。實(shí)現(xiàn)過(guò)程與添加工程比較類似,這里只給出參考代碼:
1.1 模型部分
文件名:CartManager.java(在上一講的基礎(chǔ)上修改,紅色部分為添加的內(nèi)容)
package javabean;
import java.util.ArrayList;
import java.util.Iterator;
public class CartManager
{
// 表示購(gòu)物車
private ArrayList cart;
public void setCart(ArrayList cart)
{
this.cart = cart;
}
public ArrayList getCart()
{
return cart;
}
// 添加的物品&數(shù)量
public ArrayList addToCart(Goods g,int quantity)
{
if(cart==null){
// 實(shí)例化購(gòu)物車對(duì)象
cart=new ArrayList();
// 添加到購(gòu)物車
Item item = new Item(g,quantity);
cart.add(item);
}
else
{
// 轉(zhuǎn)換成數(shù)組
Object items[] = cart.toArray();
boolean find=false; // 表示是否查找到
for(int i=0;i<items.length;i++)
{
Item temp = (Item)items[i];
// 判斷購(gòu)物車中是否存在要添加的物品
if(temp.getGoods().getGoodsid().equals(g.getGoodsid()))
{
temp.setQuantity(temp.getQuantity()+quantity);
find=true;
break;
}
}
if(!find)
{
// 添加到購(gòu)物車
Item item = new Item(g,quantity);
cart.add(item);
}
}
return cart;
}
public void delete(String goodsid)
{
// 轉(zhuǎn)換成Iterator對(duì)象
Iterator i = cart.iterator();
while(i.hasNext())
{
// 得到一個(gè)購(gòu)物項(xiàng)
Item temp = (Item)i.next();
if(temp.getGoods().getGoodsid().equals(goodsid))
{
cart.remove(temp);
break;
}
}
}
public void update(String goodsid,int quantity)
{
Iterator i = cart.iterator();
while(i.hasNext())
{
// 得到一個(gè)購(gòu)物項(xiàng)
Item temp = (Item)i.next();
if(temp.getGoods().getGoodsid().equals(goodsid))
{
temp.setQuantity(quantity);
break;
}
}
}
}
1.2 修改視圖部分
文件名:cart.jsp(在上一講的基礎(chǔ)上修改,紅色部分為添加的內(nèi)容)
<%@ page contentType="text/html;charset=gb2312"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
購(gòu)物車中的信息<br>
<table border=1>
<tr>
<td>物品編號(hào)</td>
<td>物品名稱</td>
<td>價(jià)格</td>
<td>數(shù)量</td>
</tr>
<c:forEach var="item" items="${cart}">
<tr>
<form action="processCart">
<input type="hidden" name="goodsid" value="${item.goods.goodsid}">
<td>${item.goods.goodsid}</td>
<td>${item.goods.goodsname}</td>
<td>${item.goods.price}</td>
<td><input type="text" name="quantity" value="${item.quantity}"></td>
<td><input type="submit" name="action" value="修改"></td>
<td><input type="submit" name="action" value="刪除"></td>
</form>
</tr>
</c:forEach>
</table>
1.3 控制器
刪除和修改功能使用相同的控制器,會(huì)根據(jù)提交按鈕的值確定要完成的功能,參考代碼如下:
文件名:ProcessCart.java
package servlet;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javabean.*;
import java.util.*;
public class ProcessCart extends HttpServlet
{
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws IOException,ServletException
{
//response.setContentType("text/html;charset=gb2312");
//PrintWriter out = response.getWriter();
try{
// request.setCharacterEncoding("gb2312");
// 得到要添加的物品的編號(hào)
String goodsid = request.getParameter("goodsid");
// 得到執(zhí)行命令:刪除還是修改
String action = request.getParameter("action");
action=new String(action.getBytes("8859_1"));
//out.println(action);
String quantity=null;
if(action.equals("修改"))
{
quantity = request.getParameter("quantity");
}
// 創(chuàng)建JavaBean對(duì)象
CartManager cartManager=new CartManager();
// 得到session對(duì)象
HttpSession session = request.getSession(true);
// 得到購(gòu)物車對(duì)象
ArrayList cart = (ArrayList)session.getAttribute("cart");
// 用cart初始化cartManager
cartManager.setCart(cart);
if(action.equals("修改"))
{
cartManager.update(goodsid,Integer.parseInt(quantity));
}else
{
cartManager.delete(goodsid);
}
// 把購(gòu)物車重新存到session
session.setAttribute("cart",cartManager.getCart());
}catch(Exception e){
//out.println(e.toString());
}
response.sendRedirect("cart.jsp");
}
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws IOException,ServletException
{
doGet(request,response);
}
}
2、生成訂單
如果用戶購(gòu)物完成會(huì)下訂單,通常需要輸入個(gè)人的送貨信息等,然后把訂單信息存儲(chǔ)到數(shù)據(jù)庫(kù)中。這里這介紹如何組織信息,存儲(chǔ)信息的過(guò)程不再介紹。
需要兩張表:
l 訂單表
l 訂單明細(xì)表
訂單表中信息:
l 訂單號(hào): 日期+流水號(hào),通常作主鍵
l 訂單的發(fā)出者:通常從session中獲取信息 或者 讓用戶輸入(沒(méi)有登錄的情況下)
l 訂單的日期:
l 訂單的狀態(tài):
l 付款方式
l 送貨地址
l 聯(lián)系電話
l 接收人
訂單明細(xì)表(訂單號(hào)和物品編號(hào)作為聯(lián)合主鍵):
l 訂單號(hào)
l 物品的編號(hào)
l 該物品的數(shù)量
在完成訂單添加的時(shí)候,最好能進(jìn)行事務(wù)處理。
3、小結(jié)
整個(gè)JSP培訓(xùn)基本上按照MVC模式進(jìn)行,自己在完成任何功能的時(shí)候都可以按照這個(gè)思路來(lái)做。
3.1 MVC思路分析
MVC:對(duì)于每個(gè)功能,都分成3部分考慮。
l 先考慮v:表示試圖,與人交戶,分別輸入和輸出。
l M:模型,通常使用JavaBean編寫,對(duì)于每個(gè)功能實(shí)際上對(duì)應(yīng)的一個(gè)方法(或者多個(gè)方法),應(yīng)該考慮整個(gè)方法執(zhí)行的時(shí)候需要的條件(方法的輸入),如何反饋(返回值類型和異常類型),具體功能使用Java代碼實(shí)現(xiàn)。
l C:記住4句話:
n 獲取請(qǐng)求信息:request.getParameter方法,getParameterValues方法
n 調(diào)用JavaBean:創(chuàng)建對(duì)象、實(shí)例化、初始化、調(diào)用方法
n 傳值:request.setAttribute
n 轉(zhuǎn)向: RequestDispatcher或者response.sendRedirect方法
因?yàn)榭刂破鞯墓δ芊浅9潭?,所以掌握上沒(méi)有難度。而模型部分屬于Java代碼,與JSP語(yǔ)法沒(méi)有太大關(guān)系,所以對(duì)讀者來(lái)說(shuō),學(xué)習(xí)JSP的難度主要在視圖部分。
3.2 輸入和輸出
輸入:
l 最基本的方式:表單提交,使用表單元素提交信息,通過(guò)form的action屬性指定處理文件(控制器)。比較典型的隱藏域的使用(修改信息、刪除)。
l 超鏈方法:典型的用法,就是使用“?”傳遞參數(shù),例如分頁(yè)顯示、刪除(超鏈方式)。
l 通過(guò)地址欄。
這些也非常固定。
輸出:
l 靜態(tài)信息的輸出:表頭,直接輸出
l 單個(gè)對(duì)象:例如user,使用${user.屬性名}輸出
l 集合對(duì)象:<c:forEach>標(biāo)簽輸出
l 錯(cuò)誤信息,包括提示信息:${error}
l 特定條件下的信息輸出:<c:if>標(biāo)簽處理
這些相對(duì)比較靈活,主要是JSTL和EL的靈活使用。所以需要把JSTL和EL掌握好。
3.3 文件之間的關(guān)系
靜態(tài):文件之間的關(guān)聯(lián)關(guān)系(多次請(qǐng)求之間):按鈕提交、超鏈、地址欄輸入
動(dòng)態(tài):文件之間的關(guān)系(一次請(qǐng)求):<jsp:forward> <jsp:include> response.sendRedirect RequestDispatcher <%@ include file=”” %>。
3.4 信息的存儲(chǔ):
l 持久存儲(chǔ):就是使用數(shù)據(jù)庫(kù)存儲(chǔ),主要使用JDBC技術(shù)(O/R映射,JPA)。
l 臨時(shí)存儲(chǔ):內(nèi)存存儲(chǔ),request(MVC模式傳值)、session(登錄用戶的信息、購(gòu)物車信息)、appliction(公開的聊天室)