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

 由  ValRay 发布

2.2.4 ProductDal模块

在 Petstore 中,我们有两个数据访问的模块,一个就是当前要实现的 ProductDal 模块,另外一个是 ShoppingCarDal 模块。数据访问模块也是基础的模块,不依赖内部的其他模块,而本身是提供服务给其他模块使用。下面就来看一下 ProductDal 模块的实现。

1.Imported Packages

代码如下:

 org.springframework.core
 org.springframework.dao
 org.springframework.jdbc.core

2.添加Dao接口

代码如下:

 org.osgichina.petstore.productdal.dao.CategoryDao处理和类目相关的数据 
 org.osgichina.petstore.productdal.dao.ProductDao 处理和产品相关的数据 
 org.osgichina.petstore.productdal.dao.ItemDao 处理和条目相关的数据

3.添加数据对象(DataObject)

代码如下:

 org.osgichina.petstore.productdal.dataobject.Category 
 org.osgichina.petstore.productdal.dataobject.Product 
 org.osgichina.petstore.productdal.dataobject.Item

4.实现Dao接口

在 ProductDal 例子中,我们对于 Dao 的实现是通过 JDBC 来操作数据完成的。代码相应的在

org.osgichina.petstore.productdal.dao.impl.CategoryDaoImpl
org.osgichina.petstore.productdal.dao.impl.ProductDaoImpl 
org.osgichina.petstore.productdal.dao.impl.ItemDaoImpl

这三个类中。

5.Exported Packages

代码如下:

org.osgichina.petstore.productdal.dao
org.osgichina.petstore.productdal.dataobject

6.Spring-dm配置

Bean 的定义——productdal.xml

<bean name="_productDao" 
      class="org.osgichina.petstore.productdal.dao.impl.ProductDaoImpl"/> 
 <bean name="_categoryDao" 
      class="org.osgichina.petstore.productdal.dao.impl.CategoryDaoImpl"/> 
 <bean name="_itemDao"
     class="org.osgichina.petstore.productdal.dao.impl.ItemDaoImpl" /> 
 <bean id="jdbcTemplate"
     class="org.springframework.jdbc.core.JdbcTemplate"/>

引用的服务和暴露的服务的定义——productdal-osgi.xml

 <osgi:reference id="dataSource" interface="javax.sql.DataSource" />  
 <osgi:service id="productDao" ref="_productDao" 
    interface="org.osgichina.petstore.productdal.dao.ProductDao"> 
 </osgi:service> 
 <osgi:service id="categoryDao" ref="_categoryDao" 
    interface="org.osgichina.petstore.productdal.dao.CategoryDao"> 
 </osgi:service> 
 <osgi:service id="itemDao" ref="_itemDao" 
    interface="org.osgichina.petstore.productdal.dao.ItemDao"> 
 </osgi:service>

好,到这里,我们完成了 ProductDal 模块,下面我们再接再厉,完成另外一个数据访问模块— —ShoppingCartDal 模块。

2.2.5 ShoppingCartDal模块

ShoppingCartDal 模块和 ProductDal 模块比较类似,都是提供数据访问服务,不过 ShoppingCartDal 的实现更加简单,数据是非持久的,也就是数据只是放到内存当中。在实现的过程中,和 ProductDal 是基本一样的,所以,我们在这里也不再详细列出 ShoppingCartDal 模块的具体实现步骤了,大家可以参考源码中的 Petstore\ShoppingCartDal 下的代码。

2.2.6 ProductList模块

介绍了基础的模块后,我们接下来看到的三个模块都是展现层的模块。我们先来看下 ProductList模块。

1.Imported Packages

代码如下:

org.osgi.service.http 
org.osgichina.petstore.bootstrap.actionhandler
org.osgichina.petstore.bootstrap.menu 
org.osgichina.petstore.bootstrap.pagetemplate 
org.osgichina.petstore.productdal.dao 
org.osgichina.petstore.productdal.dataobject 
org.osgichina.petstore.shoppingcartdal.dao

org.osgichina.petstore.util 2.添加Required Plug-ins

代码如下:

 javax.servlet

3.MenuItemImpl

这个类实现了 MenuItem 接口,提供了 ProductList 模块要注册的一个菜单项。

4.ProductListDefaultPage

这个类实现了 DefaultPage 接口,设置了 ProductList 模块提供的默认的 URI。

5.ActionHandler相关实现

BaseActionHandler

BaseActoinHandler 实现了 ActionHandler 接口,是 ProductList 模块中其他 ActionHandler 实现类的父类。主要功能是管理 WebResourceMgr 对象,实现了统一的 getHeadInfo 方法,提供了生成图片 URL 的方法,方便了 ActionHandler 中处理图片 URL 的代码的编写。

CategoryListActionHandler

这是针对类目显示页面的一个 ActionHandler,获取类目列表,循环显示类目列表中的产品信息。

ProductListActionHandler

这是针对某一个产品显示详细信息页面的 ActionHandler,能获取这个产品的信息,以及属于这个产品的条目,并进行显示。

6.Spring-DM配置

Bean 的定义——productlist.xml

<bean name="_menuItem"

class="org.osgichina.petstore.productlist.menuitem.MenuItemImpl"/>


引用的服务和暴露的服务的定义——productlist-osgi.xml

<osgi:service id="menuItem" ref="_menuItem" 
    interface="org.osgichina.petstore.bootstrap.menu.MenuItem" />      
<osgi:service id="actionHandlerMap" ref="_actionHandlerMap"
     interface="org.osgichina.petstore.bootstrap.actionhandler. 
      ActionHandlerMap" /> 
 
<osgi:service id="defaultPage" ref="_defaultPage"
     interface="org.osgichina.petstore.bootstrap.pagetemplate. 
       DefaultPage" /> 
 
<osgi:reference id="productDao" 
     interface="org.osgichina.petstore.productdal.dao.ProductDao" /> 
   
<osgi:reference id="categoryDao" 
     interface="org.osgichina.petstore.productdal.dao.CategoryDao" /> 
 
<osgi:reference id="itemDao" 
     interface="org.osgichina.petstore.productdal.dao.ItemDao" /> 
 
<osgi:reference id="cartDao" 
     interface="org.osgichina.petstore.shoppingcartdal.dao.CartDao" /> 
 
<osgi:reference id="webConfigMgr"
     interface="org.osgichina.petstore.util.WebConfigMgr" />
好,到这里,我们完成了 ProductList 模块,我们再次运行一下我们的 Petstore,然后在浏览器中 输入 http://localhost/petstore/app,则会看到类似图 2-11 的页面显示。

【图 2-11 产品浏览的展现 】

我们可以点击某个分类下的一个产品,比如“Amazon Parrot”,然后会看到如图 2-12 的显示。

可以看到,有一个“放到购物车”的按钮,我们会在接下来实现购物车的功能。

这个时候,我们在 OSGi 的控制台上停止 ProductList 模块,然后刷新一下页面,可以看到类似 2-13 的页面。

【图 2-12 展品详细信息的展现 】

【图 2-13 卸载模块后的展现 】

大家会发现,这个页面和开始没有 ProductList 模块时的显示是一样的,而我们这个时候再次启动 ProductList 模块,会发现又回到了刚才产品信息的页面了。

好,下面我们继续来完成剩下的两个展现层的模块。

2.2.7 ShoppingCart模块

ShoppingCart 模块主要展示了目前用户购物车中的条目列表信息,并且可以删除某个条目或者修改某个条目的数量。整体上的实现步骤和 ProductList 是类似的,这里就不再列出具体的步骤了。

2.2.8 ProductManagement模块

ProductManagement 模块是进行产品维护的模块。在例子程序中,我们在 ProductManagement 模 块中,完成了对现有类目的显示,以及对类目下每个产品具体信息的显示。读者可以扩充这个模块,增加添加、删除类目和产品的功能,以及修改条目数量的功能。实现这个模块的步骤这里就不再详细列出了。

2.3 部署

到这里,我们已经在 Eclipse 的开发环境里完成了 Petstore 的例子,我们对于 Pestore 的实现是在 OSGi 的容器中嵌入了 Web 服务器。在前面一章,我们提到了如何对 OSGi 应用进行打包部署。因此我们参照之前章节的内容,即可完成 Petstore 例子的打包、部署,脱离 Eclipse 环境来启动 Petstore 应用。

2.4 Petstore的扩展

在这一章中,我们实现了一个很简单的 Petstore。这个例子主要向读者展现的是如何用 Spring-DM 来构建一个 Petstore,以及如何做到即插即用。在目前这个 Petstore 的基础上,有几个方面是可以再扩展完善的,比如在展现的时候,我们没有用任何的框架,读者可以使用自已熟悉的 Web 框架或一些模板引擎来进行扩展,而 Dal 的部分,我们使用的是 JDBC 直接访问数据库的方式,读者同样可以根据自己的情况采用一些框架来完成这个工作,比如 Hibernate 或 iBatis,另外,我们 Dal 的接口和实现是定义在一个工程中,这里这么做是因为是演示程序,为了少创建工程而放在一起的,在实际产品中,我们是会把接口的定义独立出来放到一个工程中的。

查看评论