JAVA 购物车实现
当然,我们可以只使用JSP来构建电子商务系统,比如一个简单的购物车系统,但是如果你要想完成一个有效的的应用程序,并使它用于商业上,则需要综合以上我所说的三种技术相互补充的力量。让我们来看怎么把它们联合起来以完成最好的效果吧!我们都知道,JSP是Sun公司倡导的用来替代微软ASP的纯Java替代品,JSP技术发展壮大了Java Servlet技术,事实上, JSP引擎在运行JSP时也把JSP页面翻译成Servlets;而不用我多说,大家一定都知道Servlets在网络编程世界是非常流行的,因为它在理论上和实践上都是可以完全取代CGI脚本的,Servlets能产生动态的网页,这是通过把静态的HTML与数据库查询或事务性服务提供的内容混合起来实现的。JSP则是通过在HTML页面中内嵌Java代码这条途径来实现生成动态的网页的目的的,把Java代码插入到HTML页的这种能力极大的增加了基于Java Servlet网络体系结构的灵活性。
解释了model-view-controller( MVC )模式,它把应用程序划分成独立的数据管理(Model),表现形式(View)和控制组件(Controller),成为最先进的图形用户接口的基础,这些划分模块支持独立开发并且可以重复使用组件。我们也能把MVC模式应用于我们的网络应用程序中:JSP最适合充当实现网络应用程序的对外表现的部分;而JavaBeans封装了提供给Web网站的服务信息内容并且简化了数据在体系结构组件之间的传输;Servlet则正好充当控制者和协调用户请求和应用程序信息、更新程序数据等功能。
throws ServletException, IOException {
doPost(request, response);
}
//处理顾客请求
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException {
final static public String RECEIPT = "Receipt" ;
/*
当前购物篮中有那些商品。
主键是商品号,值为Product对象
*/
private Hashtable products_ = new Hashtable();
public BasketBean() {
}
/*
计算篮中的商品的总价值。
*/
public double getTotal() {
double totalPrice = 0.0 ;
Enumeration e = products_.elements();
while(e.hasMoreElements()) {
Product product = (Product)e.nextElement();
.getRequestDispatcher("Purchase.jsp");
}
else if (nextPage.equals(BasketBean.RECEIPT)) {
file://提供购买信息
rd = getServletConfig().getServletContext().getRequestDispatcher("Receipt.jsp");
totalPrice += product.getPieces() *
product.getPrice();
}
return totalPrice;
}
/*
取得篮中某个商品的个数。
*/
public double getPieces(Product p_in_inv) {
int SKU = p_in_inv.getSKU();
if(basket == null) {
//新的顾客,创建一个购物车。
basket = new BasketBean();
session.setAttribute(BasketBean.BASKET, basket);
}
else {
//已存在的顾客,保存篮中的内容。
basket.savePurchases(request);
二、它通过一系列的JSP页面向顾客发送请求。
一旦我们的购物车与某一个特定的顾客session相联系,顾客的BasketBean对象的实例就会存储在HttpSession对象中。一个以普通ID进入CustomerServlet工作流程的客户,他会产生很多动作,servlet引擎提供了HttpSession对象来组织并存储这一系列的相互作用(Session对象为存储和取回任何使用唯一的键/值对的Java对象提供了方便的方法)。在CustomerServlet类中,我们首先通过HttpSession session = request.getSession(true)从servlet引擎中取得Session对象,大家都可以看到,我们传递了true值,意思是我们告诉Servlet引擎,如果一个session对象已经不存在了,就新建一个;然后我们查看Session中是否有我们的购物车,如果我们找不到购物车,我们就知道这个购物Session刚刚开始,我们必须新建一辆购物车,并且把它保存在Session对象中,如果我们能够在Session中找到购物车,那我们就知道顾客正处在一个购物期间,那时就必须存储购物车当前的状态。在查看了购物车的状态之后,我们把顾客的请求发送到相应的JSP页中去,请求本身包含一个状态参数(BasketBean.PAGE)告诉CustomerServlet把请求发送到哪里,我们的控制器取回这个参数,然后使用一个RequestDispatcher对象把请求提交给下一个JSP页。
下面,我想通过一个简单的购物车程序来说明一下JSP,Servlet和Bean在网络体系结构中是怎样相互作用的,并且借这个例子解释编写一个实际可用的电子商务应用程序应该注意的一些问题。
简单购物车的实现方案
我们的购物车方案实际上是一种简化了的在线商店的模型:顾客选择商品,添加到他们的购物车中,然后通过一系列形式最终购买这些商品。上图中就显示了我们的应用程序体系结构是如何把JSP、servlets和JavaBeans有机的结合起来的,从图上更可以看出,只使用JSP来构建一个简单网络应用程序是可行,但是一个有效的应用程序是这三种技术共同作用的结果。
好,前面我们已经有了“CustomerServlet”大致的设计方案,现在让我们来看看编写我们应用程序上的一些细节问题。
代码1 CustomerServlet.java
package shoppingcart;
import javax.servlet.*;
import javax.servlet.http.*;
final static public String BASKET ="Basket" ;
final static public String PAGE = "Page" ;
/*
工作流程的状态
*/
final static public String UPDATE = "Update" ;
final static public String PURCHASE = "Purchase" ;
Product[] products = InventoryBean.getCatalogue();
String[] lbValues = request.getParameterValues("pieces" );
if (lbValues != null) {
products_.clear();
for (int i = 0 ; i<lbValues.length; i++) {
}
//取得当前的工作流程。
RequestDispatcher rd = null;
String nextPage = request.getParameter(BasketBean.PAGE);
if (nextPage == null ||
nextPage.equals(BasketBean.UPDATE)) {
//从目录中查找选择
rd = getServletConfig().getServletContext().getRequestDispatcher("Inventory.jsp");
}
else if (nextPage.equals(BasketBean.PURCHASE)) {
//提供购买信息
rd = getServletConfig().getServletContext()
import java.io.IOException;
public class CustomerServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
}
if (rd != null) {
rd.forward(request, response);
}
}
}
上面的程序段显示了CustomerServlet类中的doGet()和doPost()方法。CustomerServlet类做了两件事情来控制我们应用程序的工作流程:
一、通过Basketrvlet必须用println()输出格式化的HTML字符串,如:
out.println("<html>");
out.println("<br><br>购物车系统");
out.println("</html>");