OSGi原理与最佳实践:第二章 基于Spring-DM实现Petstore(2)

 由  ValRay 发布

2.1.3 Petstore的设计

2.1.3.1 数据库表设计

从前面列出的 Petstore 的功能看,我们要保存的数据有:类目数据,产品数据,产品的具体条目数据,购物车数据。在这个 Petstore 的例子中,我们购物车的数据采用非持久的方式来保存(有兴趣的读者可以改造这部分,完成购物车数据的持久保存)。然后剩下的三种数据,我们采用三张表来存储。我们先来看以下三种数据的关系,如图 2-1 所示。

数据库表设计 Category 和 Product 是 1 对多的关系,而 Product 和 Item 也是 1 对多的关系(见表 2-1~表 2-3)。

【图 2-1 Category、Product 与 Item 三种数据的关系 】

表 2-1 Category表字段设计

字段名称 

类型  

是否允许为空  

是否主键  

是否外键  

描述  

catid 

varchar(10) 

类目标识  

name 

varchar(80) 

类目名称  

logo 

varchar(80) 

类目图片  

descn 

varchar(255) 

类目描述  

2-2 Product 表字段设计

字段名称  

类型  

是否允许为空  

是否主键  

是否外键  

描述  

productid 

varchar(10) 

产品标识  

category 

varchar(10) 

所属类目  

name 

varchar(80) 

产品名称  

logo 

varchar(80) 

产品图片  

descn 

varchar(255) 

产品描述  

2-3 Item 表字段设计

字段名称  

类型  

是否允许为空  

是否主键  

是否外键  

描述  

itemid 

varchar(10) 

条目标识  

productid 

varchar(10) 

所属产品  

listprice 

decimal(10,2) 

价格  

unitcost 

decimal(10,2) 

成本  

quantity 

int 

数量  

status 

varchar(2) 

状态  

attr1 

varchar(80) 

属性  

attr2 

varchar(80) 

属性  

attr3 

varchar(80) 

属性  

attr4 

varchar(80) 

属性  

attr5 

varchar(80) 

属性  

2.1.3.2 模块层次划分

完成了数据库表的结构设计,我们接下来对模块的层次做一个划分。

Petstore 是一个 B/S 系统,一般来说,B/S 系统可以分为三个层次:展现层、业务逻辑层、数据访问层。因为在我们的需求中没有很复杂的业务逻辑,所以我们可以省去业务逻辑层,因此我们把系统的模块分为展现层和数据访问层两个部分,展现层用于和用户进行交互,实现对用户请求的处理和页面的展现,而数据访问层提供数据访问服务。

2.1.3.3 模块划分

根据需求分析,我们将数据的访问分为两个部分。

>产品数据

对类目数据、产品数据、条目数据的存取。

>购物车数据

购物车信息的访问的存取。

而展现层我们可以分为三个部分。

>产品展示

   显示类目列表。

   显示类目中包含的产品。

 显示产品中包含的条目。

    购买产品。

>产品维护

   显示类目列表。

   显示类目中包含的产品。

 显示产品中包含的条目。

>购物车展示

   显示购物车中的条目。

 修改已经购买的商品的数量。

 删除已经购买的商品。

按照上面的分析,我们把展现层和数据访问层的功能分为 5 个模块。

在传统的 B/S 应用中,我们是将整个应用打成一个 war 包,部署在应用服务器下。在 OSGi 中,可以通过 HttpService 或通过 Equinox 的 Bridge 方式和 Web 应用服务器集成来部署 Web 应用。我们在 Petstore 的例子中采用直接通过 OSGi 的 HttpService 来注册 Web 应用,提供服务。

OSGi 通过 Http Service 将相应的 Servlet 及资源文件绑定至相应的路径的请求上,当访问此路径时,Http Service 会转发到相应的 Servlet 进行处理,在前面的章节,我们已经看到过这样的例子。在 Petstore 的例子中,我们有一个专门的 ControllerServlet,统一响应用户的请求,然后从请求中获取 URI,通过 URI 查找对应的处理类(ActionHandler)来进行后续的处理。并且,ControllerServlet 本身也控制了整个页面的布局,我们把页面从上至下分为三个部分:Header、PageContent、Footer。 ActionHandler 要对用户请求进行处理,然后返回 PageContent 的内容。Header 中,我们将会显示菜单式的链接入口,以切换不同的页面显示,Footer 主要显示一些版权信息。

对于页面的展示,因为我们展现的功能并不是非常的复杂,所以我们没有选择使用模板引擎,而是在 ActoinHandler 中完成对页面的构建。为了简化处理,我们增加了一个 Bootstrap 模块,这个模块向 HttpService 中注册了 ControllerServlet,并且处理了 Header 和 Footer 的展现。

另外,在 Bootstrap 模块中,除了前面提到的功能外,还要处理 Header 中的模块菜单显示以及系统默认页面的显示。我们的 Petstore 是一个即插即用、即拔即停的系统,所以系统默认的页面以及菜单是动态的。这个功能的实现也放到了 Bootstrap 中。另外,我们还添加了一个 utils 模块,把模块中通用的功能部分放到了 utils 这个模块儿中。

通过我们对系统的分析,我们一共要实现 7 个功能模块。分别是:

启动和控制模块——Bootstrap

产品展示——ProductList

库存管理——ProductManagement

购物车——ShoppingCart

产品数据管理——ProductDal

购物车数据管理——ShoppingCartDal

工具——Utils

在下一节,我们来完成模块的设计。

查看评论