引言
现在,开发和管理一个电子商务系统需要高效率的开发和利用网络资源,特别是如果你想让你的顾客在网上购买你的产品或是取得你提供的服务的话,更要注意这一点。构建一个这样的商务网站来实现你商业上的目的并不是一件非常简单的工作,在开发
电子商务网站的时候,我们就要充分的利用搞技术含量的技术,我们可以利用到最先进的Java 技术:Java Server Pages(JSP),Java Servlets 和JavaBeans(甚至是EJB),它们各自都有自己的不同的优点,因此了解在构建一个
电子商务网站时如何合理的利用它们各自的优势,并且把它们联合起来以完成你想达到的效果是非常重要的。
当然,我们可以只使用 JSP来构建电子商务系统,比如一个简单的购物车系统,但是如果你要想完成一个有效的的应用程序,并使它用于商业上,则需要综合以上我所说的三种技术相互补充的力量。让我们来看怎么把它们联合起来以完成最好的效果吧!我们都知道,JSP是Sun公司倡导的用来替代微软ASP的纯Java替代品,JSP技术发展壮大了Java Servlet技术,事实上, JSP引擎在运行JSP时也把JSP页面翻译成 Servlets;而不用我多说,大家一定都知道Servlets在网络编程世界是非常流行的,因为它在理论上和实践上都是可以完全取代 CGI脚本的,Servlets能产生动态的网页,这是通过把静态的HTML与数据库查询或事务性服务提供的内容混合起来实现的。JSP则是通过在HTML页面中内嵌Java代码这条途径来实现生成动态的网页的目的的,把Java代码插入到HTML页的这种能力极大的增加了基于Java Servlet网络体系结构的灵活性。
为了产生 HTML , servlet 必须用println()输出格式化的HTML字符串,如:
out.println("<html>");
out.println("<br><br>购物车系统");
out.println("</html>");
从上面的代码段中可以看出,servlet用println()输出HTML页面,也就是说,当编写一个 Java Servlet时,开发者必须充当程序员和
网页设计师两个身份。而JSP则是在HTML中嵌入简单的Java代码,使普通的HTML
网页设计师也能写出优秀的动态网页,这样就使网站的设计沿着两条平行的轨道,即Java程序设计和HTML页面设计共同进行下去,从而加快
网站开发的速度和开发的质量。JSP也支持业务逻辑组件和现有的组件之间的宽松连接,从而做到可重用性。
下面,我想通过一个简单的购物车程序来说明一下 JSP,Servlet和Bean在网络体系结构中是怎样相互作用的,并且借这个例子解释编写一个实际可用的电子商务应用程序应该注意的一些问题。
简单购物车的实现方案
我们的购物车方案实际上是一种简化了的在线商店的模型:顾客选择商品,添加到他们的购物车中,然后通过一系列形式最终购买这些商品。上图中就显示了我们的应用程序体系结构是如何把 JSP、servlets 和 JavaBeans有机的结合起来的,从图上更可以看出,只使用 JSP来构建一个简单网络应用程序是可行,但是一个有效的应用程序是这三种技术共同作用的结果。
图2解释了model-view-controller( MVC )模式,它把应用程序划分成独立的数据管理(Model),表现形式(View)和控制组件(Controller),成为最先进的图形用户接口的基础,这些划分模块支持独立开发并且可以重复使用组件。我们也能把 MVC 模式应用于我们的网络应用程序中:JSP最适合充当实现网络应用程序的对外表现的部分;而JavaBeans封装了提供给Web网站的服务信息内容并且简化了数据在体系结构组件之间的传输;Servlet则正好充当控制者和协调用户请求和应用程序信息、更新程序数据等功能。
好,前面我们已经有了“CustomerServlet”大致的设计方案,现在让我们来看看编写我们应用程序上的一些细节问题。
代码1 CustomerServlet.java
package shoppingcart;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
public class CustomerServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
// 处理顾客请求
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException {
// 取得请求的Session对象
HttpSession session = request.getSession(true);
BasketBean basket = null;
file://如果没有购物车则创建一个新的如果已存在,则更新它
basket = (BasketBean)session.getAttribute(BasketBean.BASKET);
if(basket == null) {
// 新的顾客,创建一个购物车。
basket = new BasketBean();
session.setAttribute(BasketBean.BASKET, basket);
}
else {
// 已存在的顾客,保存篮中的内容。
basket.savePurchases(request);
}
// 取得当前的工作流程。
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()
.getRequestDispatcher("Purchase.jsp");
}
else if (nextPage.equals(BasketBean.RECEIPT)) {
file:// 提供购买信息
rd = getServletConfig().getServletContext().getRequestDispatcher("Receipt.jsp");
}
if (rd != null) {
rd.forward(request, response);
}
}
}
上面的程序段显示了CustomerServlet类中的doGet()和doPost()方法。CustomerServlet类做了两件事情来控制我们应用程序的工作流程:
一、通过 BasketBean 类实现,保持购物车组件的状态,;
二、它通过一系列的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页。
代码段2:BasketBean类
package shoppingcart;
import javax.servlet.http.HttpServletRequest;
import java.util.Hashtable;
import java.util.Enumeration;
public class BasketBean {
final static public String BASKET = "Basket" ;
final static public String PAGE = "Page" ;
/*
工作流程的状态
*/
final static public String UPDATE = "Update" ;
final static public String PURCHASE = "Purchase" ;
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();
totalPrice += product.getPieces() *
product.getPrice();
}
return totalPrice;
}
/*
取得篮中某个商品