主要内容:
l 完成购物车的其他基本功能;
l 生成订单;
l 小结
1、购物车的其它功能
对购物车的物品数量修改和物品删除功能是两外两个基本功能。实现过程与添加工程比较类似,这里只给出参考代码:
1.1 模型部分
文件名:CartManager.java(在上一讲的基础上修改,红色部分为添加的内容)
package javabean;
import java.util.ArrayList;
import java.util.Iterator;
public class CartManager
{
// 表示购物车
private ArrayList cart;
public void setCart(ArrayList cart)
{
this.cart = cart;
}
public ArrayList getCart()
{
return cart;
}
// 添加的物品&数量
public ArrayList addToCart(Goods g,int quantity)
{
if(cart==null){
// 实例化购物车对象
cart=new ArrayList();
// 添加到购物车
Item item = new Item(g,quantity);
cart.add(item);
}
else
{
// 转换成数组
Object items[] = cart.toArray();
boolean find=false; // 表示是否查找到
for(int i=0;i<items.length;i++)
{
Item temp = (Item)items[i];
// 判断购物车中是否存在要添加的物品
if(temp.getGoods().getGoodsid().equals(g.getGoodsid()))
{
temp.setQuantity(temp.getQuantity()+quantity);
find=true;
break;
}
}
if(!find)
{
// 添加到购物车
Item item = new Item(g,quantity);
cart.add(item);
}
}
return cart;
}
public void delete(String goodsid)
{
// 转换成Iterator对象
Iterator i = cart.iterator();
while(i.hasNext())
{
// 得到一个购物项
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())
{
// 得到一个购物项
Item temp = (Item)i.next();
if(temp.getGoods().getGoodsid().equals(goodsid))
{
temp.setQuantity(quantity);
break;
}
}
}
}
1.2 修改视图部分
文件名:cart.jsp(在上一讲的基础上修改,红色部分为添加的内容)
<%@ page contentType="text/html;charset=gb2312"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
购物车中的信息<br>
<table border=1>
<tr>
<td>物品编号</td>
<td>物品名称</td>
<td>价格</td>
<td>数量</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 控制器
删除和修改功能使用相同的控制器,会根据提交按钮的值确定要完成的功能,参考代码如下:
文件名: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");
// 得到要添加的物品的编号
String goodsid = request.getParameter("goodsid");
// 得到执行命令:删除还是修改
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");
}
// 创建JavaBean对象
CartManager cartManager=new CartManager();
// 得到session对象
HttpSession session = request.getSession(true);
// 得到购物车对象
ArrayList cart = (ArrayList)session.getAttribute("cart");
// 用cart初始化cartManager
cartManager.setCart(cart);
if(action.equals("修改"))
{
cartManager.update(goodsid,Integer.parseInt(quantity));
}else
{
cartManager.delete(goodsid);
}
// 把购物车重新存到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、生成订单
如果用户购物完成会下订单,通常需要输入个人的送货信息等,然后把订单信息存储到数据库中。这里这介绍如何组织信息,存储信息的过程不再介绍。
需要两张表:
l 订单表
l 订单明细表
订单表中信息:
l 订单号: 日期+流水号,通常作主键
l 订单的发出者:通常从session中获取信息 或者 让用户输入(没有登录的情况下)
l 订单的日期:
l 订单的状态:
l 付款方式
l 送货地址
l 联系电话
l 接收人
订单明细表(订单号和物品编号作为联合主键):
l 订单号
l 物品的编号
l 该物品的数量
在完成订单添加的时候,最好能进行事务处理。
3、小结
整个JSP培训基本上按照MVC模式进行,自己在完成任何功能的时候都可以按照这个思路来做。
3.1 MVC思路分析
MVC:对于每个功能,都分成3部分考虑。
l 先考虑v:表示试图,与人交户,分别输入和输出。
l M:模型,通常使用JavaBean编写,对于每个功能实际上对应的一个方法(或者多个方法),应该考虑整个方法执行的时候需要的条件(方法的输入),如何反馈(返回值类型和异常类型),具体功能使用Java代码实现。
l C:记住4句话:
n 获取请求信息:request.getParameter方法,getParameterValues方法
n 调用JavaBean:创建对象、实例化、初始化、调用方法
n 传值:request.setAttribute
n 转向: RequestDispatcher或者response.sendRedirect方法
因为控制器的功能非常固定,所以掌握上没有难度。而模型部分属于Java代码,与JSP语法没有太大关系,所以对读者来说,学习JSP的难度主要在视图部分。
3.2 输入和输出
输入:
l 最基本的方式:表单提交,使用表单元素提交信息,通过form的action属性指定处理文件(控制器)。比较典型的隐藏域的使用(修改信息、删除)。
l 超链方法:典型的用法,就是使用“?”传递参数,例如分页显示、删除(超链方式)。
l 通过地址栏。
这些也非常固定。
输出:
l 静态信息的输出:表头,直接输出
l 单个对象:例如user,使用${user.属性名}输出
l 集合对象:<c:forEach>标签输出
l 错误信息,包括提示信息:${error}
l 特定条件下的信息输出:<c:if>标签处理
这些相对比较灵活,主要是JSTL和EL的灵活使用。所以需要把JSTL和EL掌握好。
3.3 文件之间的关系
静态:文件之间的关联关系(多次请求之间):按钮提交、超链、地址栏输入
动态:文件之间的关系(一次请求):<jsp:forward> <jsp:include> response.sendRedirect RequestDispatcher <%@ include file=”” %>。
3.4 信息的存储:
l 持久存储:就是使用数据库存储,主要使用JDBC技术(O/R映射,JPA)。
l 临时存储:内存存储,request(MVC模式传值)、session(登录用户的信息、购物车信息)、appliction(公开的聊天室)