Jpetstore把所有同一类的动过都对应到了一个相应Action,然后动态的调用FormBean的不同方法来处理不同的动作。也就是通过对struts-config.xml的配置信息的读取来决定调用的方法。
例如:
"/shop/searchProducts"和"/shop/switchSearchListPage" 请求都对应到了同一个formbean(catalogBean)。
<action path="/shop/searchProducts" 访问路径type="org.apache.struts.beanaction.BeanAction" Action完整类名
name="catalogBean" 对应的formbean名
scope="session" 生命周期为整个session
validate="false"> 不需要验证
<forward name="success" path="/catalog/SearchProducts.jsp"/>返回结果后的跳转路径
</action>
<action path="/shop/switchSearchListPage" type="org.apache.struts.beanaction.BeanAction"
name="catalogBean" scope="session" parameter="switchProductListPage"
validate="false">
<forward name="success" path="/catalog/SearchProducts.jsp"/>
</action>
从上面的代码中,可以知道,BeanAction把控制交给了orderBean这个formBean对象的searchProducts方法,方法名取"path"参数的以"/"分隔的最后一部分。
其实,struts-config.xml有3中映射方式:1,Path中最后一个/后的方法名;2,parameter=”*’直接跳转;3,Parameter中含具体的方法名;
比如一下例子:
<action path="/shop/viewOrder" type="com.ibatis.struts.BeanAction"
name="orderBean" scope="session"
validate="false">
<forward name="success" path="/order/ViewOrder.jsp"/>
</action>
<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>
<action path="/shop/viewOrder" type="com.ibatis.struts.BeanAction"
name="orderBean" parameter="*" scope="session"
validate="false">
<forward name="success" path="/order/ViewOrder.jsp"/>
</action>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
...
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.shtml</url-pattern>
</servlet-mapping>
定义了一个servlet来捕获所有*.shtml请求,并交付给相应的formbean进行处理。
关于formbean的一些理解:
从accountBean.java中我们可以看出,formBean中携带了关于account的所有数据,包括每个数据的get()和set()方法,除此之外,它还有很多关于account的操作,比如增删改等等。可以看得出,formBean几乎囊括了全部的account涉及到的功能和数据,并且这一个实例化的对象在各层次之间进行参数和功能的传递,因此它完成javaBean的使命,“Write once, run anywhere, reuse everywhere”,即“一次性编写,任何地方执行,任何地方重用”。