实现虚拟购物车(shopping cart)的方法并不唯一。最近我恰好改写了一个传统的ASP购物车,目标是在保留了它原有外观的基础上让它变得更灵活、速度更快。我决定利用XML开发一个跨浏览器的解决方案。现在,请允许我介绍一下在这个过程中我所遇到的问题以及我是如何提高原有设计的。
原有的购物车
由于原有的购物车是为一组指定的客户定做的,因此它的使用更多的依赖于使用训练,而没有很好的易用性。除了完全清空购物车之外,没有任何机制来修改你放在购物车里的内容。因此一旦你在购物车中放置的物品或者物品数量有误的话,你不得不重新开始购物过程,只有这样才可以修正这个错误。
除了界面之外,原有的购物车好像没有其它的优点。它只能显示出有限的行数,客户要查看未显示的条目时,必须向前或者向后翻页(即导航)。这个问题归因于购物车中的所有内容都保存在基于ASP会话ID的表格中。当客户翻查购物车中的项目时,必须执行一个查询。此外,如果会话期结束,购物车的内容就会保存到表格中去,除非你手动删除它。
新的设计方法
我并不想重复已经发生的错误,因此新的购物车是基于XML会话(XML-session)而不是基于表格。这种方法有几个优点。首先,整个购物车存储在客户端的一个XML数据岛中(如清单A所示)。这就消除了简单的导航对表格的查询需求。相反,用到了MozillaDSO()和xmlPage()函数。
除了导航之外,xmlPage()方法还提供了老购物车所没有提供的功能——修改数量和删除商品种类的能力。这是因为它用到了两个XML数据岛:一个绑定了(bound)、另一个则没有,绑定数据岛的改变在更新之前并不会影响到未绑定的数据岛。一旦点击更新按钮,就会有一个机制,例如XMLHTTP,把改变传递给server。如果因为某些原因造成你不能完全信任微软Internet Explorer或者Mozilla的XMLHTTP的话,你可以用一个隐藏框架(即iframe)和表单以及输入框来实现同样的功能。清单B给出了更新函数的javascript。
我在同一个句子中用到了Mozilla和XMLHTTP,这里有书面材料可以证明Mozilla支持XMLHTTP。尽管Mozilla的XMLHTTP的语法与Internet Explorer的有一点点不同,少量javascript不能得到处理是无关紧要的。清单C给出了图A所示的完整的客户端解决方案。
图A
服务器端
完成了客户端的代码之后,我们就应该集中精力解决服务器端的购物车。根据电子商务系统的不同,建立购物车的机制也不尽相同,但是XML数据岛的基本布局还是类似的,如清单D所示。由于这只是一个演示用的程序,客户页面部分的代码(见清单C)并没有创建购物车也没有包含任何数据库逻辑。它只是集中于管理购物车(见清单D)。购物车(在选择第一种商品时构建购物车)是用XML文档对象模型(DOM)或者通过ADO保存方法以及XSLt创建的。后续的商品种类只是用DOM或者XSLT简单的附加到已有的购物车中。
校验过程在数据库逻辑部分实现。我用DOM进行XML购物车的导航,并用Oracle的存储过程来进行更新以及添加新行的操作——这部分用SQL Server或者MySQL实现并不会有多少实质性的帮助。
改进所带来的好处
XML数据岛的使用使得HTML有了清楚的外观。相对于散布在server端的一行又一行的HTML代码或者嵌入在某个循环中的单行HTML,用XML数据岛只需要使用一行HTML。假如在你即将完成购物车时,有人要求你添加一个数据栏(column),那么维护它就如同噩梦一般,用这种方法就可以免除你的苦恼。