张 蕾
(河西学院信息技术中心 甘肃 734000)
网上书店系统目前主要是以B2C的方式进行经营,向读者出售书籍。本文系统的开发理念更贴近于消费者,引入C2C的经营理念,增加读者开店的功能,读者可以将自己不需要的书本或音像资料售给需要它的人,从而吸引更多的消费者,增加用户粘性,更为书店市场打开一个新的渠道。本系统面向以学生为主的用户群体,为他们提供C2C交易的平台。卖者发布出售商品的信息,买者也可发布求购信息。本系统的用户分为普通用户、个人店铺用户和管理员。通过Struts+Spring+Hibernate架构开发。
系统中主要的角色包括未注册用户、已注册用户和管理员。
未注册用户:该角色可以对系统进行最基本的查看、搜索商品操作,如果该角色想进行更多操作,则需进行用户注册操作,成为该交易平台的会员之一。
已注册用户:该角色在未开店之前,角色功能仍是买家,可以进行查看/修改个人资料,查看/搜索商品,查看/修改个人收藏夹,查看订单,购物,留言等操作。而在注册开店之后,除去买家角色,还增加了个卖家角色,可以上传自己想卖出的商品,对自己的商品信息进行增、删、改、查等操作,还可以查看有无已购买但未发货的商品,并进行发货确认。
管理员:前2个角色主要体现在前台,而该角色是在后台中运行,系统管理员可以对下层管理员进行注册和权限操作,管理员登陆后台界面后,可以对应自己的权限进行操作,主要起到监控、管理和中介的作用。用例图如下:
图1 用例图
平台主要有2个外部实体:用户和管理员。这两个实体是存在于软件本身系统之外的人员,指出了数据信息所需要的发源地或系统所产生的数据的归属地。而加工之地就是业务中心,描述了输入数据流通过业务中心的加工处理后变成了输出数据。本系统的具体顶层数据流情况如图
图2 顶层数据流
本系统中所涉及的可以抽象出来的实体模型有用户(user)、管理员(admin)、商店(shop)、商品(merchandise)、商品类别(kind)、留言(message)、收藏夹(favourite)、订单(orders)、选购记录(cartselectedmer)、购物车(cart)、账户(account)、公告(affiche),具体的关系数据模型图如图。
图3 关系数据模型图
用户在注册开店之后,除去买家角色,还增加了个卖家角色,可以上传自己想卖出的商品,对自己的商品信息进行增、删、改、查等操作。
增、删、改和查四个操作是管理系统中最基本的功能。下面以增加商品为例,分析这个操作在系统中是如何设计和实现的。
视图层上,增加商品操作在JSP页面addMerchandise.jsp中实现,当店铺用户填毕想添加的商品的信息并提交后,Struts把用户输入的表单数据(包括商品的种类、名称、价格、存货数量和描述等商品信息)保存在merchandiseForm Bean中,通过它来进行视图和控制器之间表单数据的传递。通过在struts-config.xml配置文件中的这段代码,可以看出merchandiseForm在经过validate后把表单数据传送给了Action类MerchandiseAction。
attribute="merchandiseForm" parameter="method"path="/add" type="com.moon.struts.action.MerchandiseAcion" /> 然后,该Action类会调用MerService的实现类中的addMer()方法来添加商品,saveImage()方法来保存用户上传的图片。保存图片的代码如下: //MerchandiseAction类中 FormFile ff = f.getPic();//定义图片文件,并赋值 boolean res = MerService.saveImage(uploadPath,ff);//保存图片到磁盘 //MerServiceImpl类中,保存图片方法 //参数:保存图片的物理路径,封装图片的文件 public boolean saveImage(String path,FormFile f){ boolean result = false; //定义返回类型,并赋值为false; try { //定义输出流对象,并实例化 OutputStream out = new FileOutputStream(new File(path)); byte[]b = f.getFileData();//获取图片文件的字节数; out.write(b); //向磁盘写入图片 out.close(); //关闭输出流 result = true; } catch(Exception e){ result = false; // TODO Auto-generated catch block e.printStackTrace(); } return result; } 这里的上传文件用到了struts技术,首先在jsp文件中使用标记生成文件上传控件。由于Struts针对上传文件进行了相应的处理,所以,在MerchandiseAction中对上传文件的访问也就变得异常简单了,直接通过MerchandiseForm中所定义的Formfile对象就可以操作用户所上传的文件。 通过上面的代码实现可以看到,通过FormFile对象可以得到用户上传文件/图片的字节数。此外,还可以得到文件的名称、类型,如果是一般文件,还能得到文件的内容信息。在本系统实现中,将用户上传的文件保存到指定的磁盘上。 因为系统统一使用了struts+spring+hibernate框架,所以这里在编写代码时的原则仍不变,即利用Spring框架,方便地把执行业务逻辑(这里是增加商品)、调用持久层方法、从表示层获得用户请求、进行数据库事务处理和异常处理这几个任务通过Bean管理器进行管理,使系统可以在最大程度上降低程序的复杂度和耦合度。Spring通过反转控制(IoC)或者设置依赖注入(Dependency Injection)将配置在扩展的XML文件中的这些对象联系起来,这样可以自由地创建各种对象以及降低系统的耦合度。 图4 时序图 MerchandiseAction类调用了业务逻辑接口的实现类中的方法后,MerServiceImpl实现类分别调用了MerchandiseDao接口、ShopDao接口和UserDao接口来进行实际的添加商品操作。具体的操作是首先由实现后两个接口的Support类取得添加商品的用户帐号和商店id信息,然后把这2个参数传给MerchandiseDao接口实现类,通过sql语句和Merchandise数据表进行实际添加操作。如果保存图片成功且添加商品成功,则会给出成功提示,否则就弹出对话框告知用户添加失败,但是不论失败还是成功,事务完成后都仍跳转到添加商品页面。具体时序图如图4所示: [1][美]Xin Chen 著,温昱,靳向阳译,应用框架的设计与实现.电子工业出版社.2006. [2]陈天河 等著,Struts,Hibernate,Spring集成开发宝典.电子工业出版社.2007. [3]阳雪峰,陈文臣著,Java Web 2.0:基于Spring、Struts、Hibernate轻量级架构开发.机械工业出版社.2009. [4]刘乃丽.精通Java EE项目案例.人民邮电出版社.2008.