jpetstore的url映射解析

       jpetstore5.0是ibatis的最新示例程序,展示了如何利用ibatis来开发一个典型的J2EE web应用程序,基于struts MVC框架,以ibatis做为持久化层,是ibatis的示例程序,程序设计优雅,层次清晰,可以学习以及做为一个高效率的编程模型参考。

       url映射方式为:http://localhost:8080/jpetstore/shop/viewCategory.shtml?categoryId=FISH ,这个是打开Fish种类的链接,在jpetstore工程中找不到有 viewCategory类的存在,所以的action都映射到一个action里:BeanAction,BeanAction扩展了struts的 Action,url可以映射到bean的方法,简化了struts的编程模式,减少了对struts的依赖,可以把BeanAction很容易地移植到新框架如JSF、Spring中。

       jpetstore的formbean不是普通的formbean,里面除了属性和属性的set、get方法、校验、重置方法,还有了具体的行为,从这个意义上来看,更像一个BO。当访问jpetstore的url时,BeanAction利用反射原理,根据url决定访问formbean的哪个方法(行为),formbean的签名很简单:

public String myActionMethod() {
      //..work
      return "success";
}

       方法返回值是字符串,对应forward的名称,而不是ActionForward对象,创建ActionForward对象的任务由BeanAction代劳。

       另外,程序还提供了ActionContext工具类,该工具类封装了request 、response、form parameters、request attributes、session attributes和 application attributes中的数据存取操作,简单而线程安全,form bean类使用该工具类可以进一步从表现层框架解耦。

       在这里需要特别指出的是,BeanAction类是对struts扩展的一个有益尝试,虽然提供了非常好的应用开发模式,但是它还非常新,一直在发展中。
       下面就让我们开始进一步分析JpetStore5.0的源代码。

BeanAction.java是唯一一个Struts action类,位于org.apache.struts.beanaction包下。正如上文所言,它是一个通用的控制类,利用反射机制,把控制转移到form bean的某个方法来处理。详细处理过程参考其源代码,简单明晰。
Form bean类位于com.ibatis.jpetstore.presentation包下,命名规则为***Bean。Form bean类全部继承于BaseBean类,而BaseBean类实际继承于ActionForm,因此,Form bean类就是Struts的 ActionForm,Form bean类的属性数据就由struts框架自动填充。而实际上,JpetStore4.0扩展了struts中ActionForm的应用: Form bean类还具有行为,更像一个BO,其行为(方法)由BeanAction根据配置(struts-config.xml)的URL来调用。虽然如此,我们还是把Form bean类定位于表现层。

       Struts-config.xml的配置里有3种映射方式 ,来告诉BeanAction把控制转到哪个form bean对象的哪个方法来处理。

       以这个请求连接为例 http://localhost/jpetstore/shop/viewOrder.shtml

1. URL Pattern

<action path="/shop/viewOrder" type="com.ibatis.struts.BeanAction" name="orderBean" scope="session" validate="false"> <forward name="success" path="/order/ViewOrder.jsp"/> </action>  
      此种方式表示,控制将被转发到"orderBean"这个form bean对象 的"viewOrder"方法(行为)来处理。方法名取"path"参数的以"/"分隔的最后一部分。

2. Method Parameter

<action path="/shop/viewOrder" type="com.ibatis.struts.BeanAction" name="orderBean" parameter="viewOrder" scope="session" validate="false"> <forward name="success" path="/order/ViewOrder.jsp"/> </action>  
       此种方式表示,控制将被转发到"orderBean"这个form bean对象的"viewOrder"方法(行为)来处理。配置中的"parameter"参数表示form bean类上的方法。"parameter"参数优先于"path"参数。

3. No Method call

<action path="/shop/viewOrder" type="com.ibatis.struts.BeanAction" name="orderBean" parameter="*" scope="session" validate="false"> <forward name="success" path="/order/ViewOrder.jsp"/> </action>  
       此种方式表示,form bean上没有任何方法被调用。如果存在"name"属性,则struts把表单参数等数据填充到form bean对象后,把控制转发到"success"。否则,如果name为空,则直接转发控制到"success"。

这就相当于struts内置的org.apache.struts.actions.ForwardAction的功能

<action path="/shop/viewOrder" type="org.apache.struts.actions.ForwardAction" parameter="/order/ViewOrder.jsp " scope="session" validate="false"> </action>

       Service类位于com.ibatis.jpetstore.service包下,属于业务层。这些类封装了业务以及相应的事务控制。Service类由form bean类来调用。
       com.ibatis.jpetstore.persistence.iface包下的类是DAO接口,属于业务层,其屏蔽了底层的数据库操作,供具体的Service类来调用。DaoConfig类是工具类(DAO工厂类),Service类通过DaoConfig类来获得相应的DAO接口,而不用关心底层的具体数据库操作,实现了如图2中{耦合2}的解耦。
       com.ibatis.jpetstore.persistence.sqlmapdao包下的类是对应DAO接口的具体实现,在JpetStore4.0中采用了ibatis来实现ORM。这些实现类继承BaseSqlMapDao类,而BaseSqlMapDao类则继承ibatis DAO 框架中的SqlMapDaoTemplate类。ibatis的配置文件存放在com.ibatis.jpetstore.persistence.sqlmapdao.sql目录下。这些类和配置文件位于数据层
       Domain类位于com.ibatis.jpetstore.domain包下,是普通的javabean。在这里用作数据传输对象(DTO),贯穿视图层、业务层和数据层,用于在不同层之间传输数据。
剩下的部分就比较简单了,请看具体的源代码,非常清晰。 

 

猜你喜欢

转载自geeksun.iteye.com/blog/488620