基于iBatis的JPetStore源码的研究(一)

最近没事想研究研究ibatis开源项目,无意间发现了jpetstore。

1:到官网http://ibatis.apache.org/下载jpetstore5.0

2:把项目导入到myeclipse中。

3:打开src包会发现如下包,JPetStore分层分的特别的细。

com/ibatis/jpetstore/domain
        真正的业务实体类,应该属于business层面.
com/ibatis/jpetstore/persistence
        该包属于持久层,包括DaoConfig.java以及Dao.xml,DAO的初始化配置文件.
com/ibatis/jpetstore/persistence/iface
        接口,针对BO(Business Object)的接口,例如AccountDao.java里面定义了实现DAO对Account对象的一些操作方法以待实现.
com/ibatis/jpetstore/persistence/sqlmapdao
        接口的实现,跟iface包里面的接口一一对应,例如AccountSqlMapDao.java就实现了AccountDao.java接口里面定义的所有映射或者操作方法.

com/ibatis/jpetstore/presentation
       
 该包我觉得应该属于显示层,这个包里面都是FormBean,例如AccountBean.java.为Account定义了FormBean.
com/ibatis/jpetstore/service
        为类操作提供的业务类,例如AccountService类就提供了很多对Account等操作的实用方法,这样在AccountBean里面就可以轻松使用了.

com/ibatis/jpetstore/persistence/sqlmapdao/sql
        很简单,每个实体类大致映射到数据库中的一张表,对该库表可能进行的所有sql操作都在这个包里面进行定义.包括对象和表列映射等等.

/properties
        不用说了,配置文件而已.    

/ddl

       建库和建表的sql脚本。(oracle,mysql、mssql、postgres、hsql等数据库)


一、表现层:

BeanAction技术成功地将Action和ActionForm的职责展平,融入到一个类中。它也可以使你从对session、request这样特定于Web的组件的直接访问中解脱出来。这种类型的架构不禁让我们想起了WebWork和JSF。BeanAction技术所以能够将Action和ActionForm的职责展平,是通过一些关键组件完成的:首先是BeanAction类,它扩展了Struts的Action类、BaseBean类,以及ActionContext类。理解这些组件对于理解BeanAction技术如何工作非常重要,

BeanAction ---->ActoinContext

     |

BaseBean ————>AbstractBean------>AccountBean

   

1  BaseBean

在深入研究ActionContext类和BeanAction类之前,理解BaseBean类的功用非常重要。BaseBean扩展了ValidatorActionForm以允许进行标准的Struts验证。有了BaseBean,在自己的应用程序中就只需要扩展它,而再不需要去直接扩展ActionForm了。应该在BaseBean扩展类中包含你需要的属性,就像一个ActionForm通常所作的那样。Struts会像填充ActionForm一样地去填充BaseBean,因为BaseBean就是ActionForm。唯一的区别就在于你的BaseBean扩展类中的页面行为处理方法可以使用一种更为简单的签名:public String methodName()。

2  BeanAction

我们将要介绍的下一个类就是BeanAction类。该类有两个职责。第一,它负责填充Action- Context。其次,它负责将页面行为调用路由到你的BaseBean扩展类中对应的页面行为处理方法上,并且将该方法返回的字符串转化为一个Struts的ActionForward。这也就是为何BaseBean的页面行为处理方法的签名中可以不出现特定于Struts组件的原因所在。当需要决定调用你的BaseBean扩展类中的哪个页面行为处理方法时,BeanAction类会在两个不同的地方查找。首先,它查看Struts配置文件中的动作映射(action mapping)的parameter属性值,以确定你是否显式指定了页面行为与处理方法的对应关系。如果parameter取值非空且不为*(即取值为一个有意义的字符串),则调用BaseBean扩展类中方法名为parameter值的方法;如果parameter取值为*,则不调用BaseBean扩展类中的任何处理方法,而是直接使用name取值为success的forward子元素;如果parameter取值为空或不存在,那么BeanAction会查看path,然后使用其最后一个“/”后的字符串作为BaseBean扩展类中的页面行为处理方法名并调用该方法。例如,对如下代码,就将调用orderBean中的checkOut方法:

<action path="/cart/checkOut" type="com.ibatis.struts.BeanAction"

name="orderBean" scope="session" validate="false">

<forward name="success" path="/order/ViewOrder.jsp"/>

</action>

3  ActionContext

最后,ActionContext用于将你从特定的Web语义中解脱出来。它使你对请求(request)、参数(parameter)、cookies、会话(session)和应用程序(application)这些对象的访问都能够通过一个Map接口完成。这就使你能够减少与Web层的直接依赖关系。ActionContext中的大多数方法可以使你成功地实现与Struts以及Servlet API的隔离。但ActionContext也提供了直接访问Http- ServletRequest和HttpServletResponse对象的方法,当你需要访问它们的时候可以使用。

使用Action Context技术有几个好处。第一,再不需要花时间去将一个ActionForm对象转换为其某个扩展类型了。原因就在于现在的Action就是ActionForm。你只需要直接访问Base- Bean扩展类的实例中的各个特性。其次,那些页面行为处理方法的复杂性大大降低了。通常,Struts的页面行为处理方法(即Action类的execute方法)需要接收4个参数:HttpServletRequest、HttpServletResponse、ActionForm和ActionMapping,并且要求返回一个ActionForward。而BeanAction的页面行为处理方法则远远不需要那么复杂,它不需要任何参数,只需要返回一个字符串。第三,单元测试一个简单的bean毕竟要比单元测试一个ActionForm和Action简单得多。当然可以使用MockObject和StrutsTestCase来对Action类进行彻底的测试。但是,仅仅测试一个bean肯定还是要简单得多。最后,因为BeanAction架构与现存的Struts应用程序协同工作得很好,而BeanAction技术的语意与新一代框架是一致的,这就使你能够轻松地将应用程序的架构从现在的Struts转换为某个新一代框架而不会破坏你之前所有的辛苦劳动。

<!-- page -->

你可能感兴趣的:(DAO,bean,struts,ibatis,单元测试)