Spring Web Flow 2.0入门 : 在购物车示例应用中配置 Spring Web Flow
 

2009-03-13 作者:吕焱飞 来源:developerWorks

 

实现示例应用的购物车流程,可按以下步骤操作:

在 /WEB-INF/lib 目录下导入相关类库

在 webmvc-config.xml 中添加与 Spring Web Flow 集成的配置

添加 Spring Web Flow 的配置文件 webflow-config.xml

添加 flow 定义文件 shopping.xml

添加三个 jsp 页面

修改 index.jsp

在 /WEB-INF/lib 目录下导入相关类库

将以下几个 jar 包导入 /WEB-INF/lib 目录:

org.springframework.webflow-2.0.2.RELEASE.jar

org.springframework.js-2.0.2.RELEASE.jar

org.springframework.binding-2.0.2.RELEASE.jar

jboss-el.jar

在 webmvc-config.xml 中添加配置

Spring Web MVC 相关的配置前面已经分析过了,完整的配置见清单 13 :

清单 13 webmvc-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans
 xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans.xsd">
 <bean
  id="viewResolver"
  class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="viewClass" value="org.springframework.web.servlet.view.JstlView">
  </property>
  <property name="prefix" value="/WEB-INF/jsp/">
  </property>
  <property name="suffix" value=".jsp">
  </property>
 </bean>
 <bean
  id="viewMappings"
  class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
  <!-- /shopping.do 请求由 flowController 来处理 -->
  <property name="mappings">
   <value> /shopping.do=flowController </value>
  </property>
  <property name="defaultHandler">
  <!-- UrlFilenameViewController 会将 "/index" 这样的请求映射成名为 "index" 的视图 -->
   <bean class="org.springframework.web.servlet.mvc.UrlFilenameViewController" />
  </property>
 </bean>
 <bean
  id="flowController"
  class="org.springframework.webflow.mvc.servlet.FlowController">
  <property name="flowExecutor" ref="flowExecutor"/>
 </bean>
</beans>

添加配置文件 webflow-config.xml

在 /WEB-INF/config 目录下添加 webflow-config.xml 文件, schema 名字空间可直接复制清单 14 中的内容。

清单 14 webflow-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans
 xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:webflow="http://www.springframework.org/schema/webflow-config"
 xsi:schemaLocation=" http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  http://www.springframework.org/schema/webflow-config
  http://www.springframework.org/schema/webflow-config/spring-webflow-config-2.0.xsd">
 <webflow:flow-executor id="flowExecutor"/>
 <!— 所有 flow 定义文件位置在此配置, flow-builder-services 用于配置 flow 的特性 -->
 <webflow:flow-registry id="flowRegistry" flow-builder-services="flowBuilderServices">
  <webflow:flow-location path="/WEB-INF/flows/shopping.xml" id="shopping"/>
 </webflow:flow-registry>
 <!—Web Flow 中的视图通过 MVC 框架的视图技术来呈现 -->
 <webflow:flow-builder-services id="flowBuilderServices"
  view-factory-creator="mvcViewFactoryCreator"/>
 <!— 指明 MVC 框架的 view resolver ,用于通过 view 名查找资源 -->
 <bean id="mvcViewFactoryCreator"
  class="org.springframework.webflow.mvc.builder.MvcViewFactoryCreator">
  <property name="viewResolvers" ref="viewResolver"/>
 </bean>
</beans>

webflow-config.xml 创建完成以后,不要忘记在 web-application-config.xml 中添加 import 元素,将 webflow-config.xml 文件导入。

清单 15 在 web-application-config.xml 中导入 webflow-config.xml。

<import resource="webflow-config.xml"/>

添加 flow 定义文件 shopping.xml

在 /WEB-INF/flows 目录下创建 shopping.xml 文件,描述了图 2 所示的流程。

清单 16 shopping.xml

<?xml version="1.0" encoding="UTF-8"?>
<flow xmlns="http://www.springframework.org/schema/webflow"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/webflow
http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd">
<view-state id="viewCart" view="viewCart">
<transition on="submit" to="viewOrder">
</transition>
</view-state>
<view-state id="viewOrder" view="viewOrder">
<transition on="confirm" to="orderConfirmed">
</transition>
</view-state>
<view-state id="orderConfirmed" view="orderConfirmed">
<transition on="returnToIndex" to="returnToIndex">
</transition>
</view-state>
<end-state id="returnToIndex" view="externalRedirect:servletRelative:/index.jsp">
</end-state>
</flow>

与清单 1 相比,在 view-state 元素中指定了 view 属性的名字,这个名字也是 Spring Web MVC 中 viewResolver 所查找的 view 的名字。从清单 16 的配置中可以知道,这三个 view-state 元素所对应的视图资源分别应该是: viewCart.jsp 、 viewOrder.jsp 和 orderConfirmed.jsp 。清单 16 中最后的 end-state 指明了当 flow 执行结束后跳转到初始的 index.jsp 页面,在此处的 view 属性的名字需要解释一下。 externalRedirect 用在 view 名字中,表示所指向的资源是在 flow 的外部, servletRelative 则表明所指向资源的路径起始部分与 flow 所在 servlet 相同。 Spring Web Flow 2.0还提供了其他几个关键词用于重定向,这里就不多介绍了。

添加三个 jsp 页面

在 /WEB-INF/jsp 目录下创建三个 flow 所需的视图资源。以下清单只给出 jsp 页面中 body 元素以内的代码,其余省略。

清单 17 viewCart.jsp

<h1>View Cart</h1>
<a href="${flowExecutionUrl}&_eventId=submit">Submit</a>

清单 18 viewOrder.jsp

<h1>Order</h1>
<a href="${flowExecutionUrl}&_eventId=confirm">Confirm</a>

清单 19 orderConfirmed.jsp

<h1>Order Confirmed</h1>
<a href="${flowExecutionUrl}&_eventId=returnToIndex">Return to index</a>

这几个页面都使用了变量 flowExecutionUrl ,表示 flow 执行到当前状态时的 URL 。 flowExecutionUrl 的值已经由 Spring Web Flow 2.0 框架的代码进行赋值,并放入相应的 model 中供 view 访问。 flowExecutionUrl 的值包含 flow 在执行过程中会为每一状态生成的唯一的 key ,因此不可用其他手段来获取。请求参数中 _eventId 的值与清单 16 中 transition 元素的 on 属性的值是对应的,在接收到_eventId参数后,相应transition会被执行。

修改 index.jsp 页面

在 index.jsp 页面中添加启动 flow 的链接,从 webmvc-config.xml 配置文件中可以看出,要启动 flow ,只需提供 /shopping.do 链接即可。

清单 20 index.jsp

<h1>Hello!</h1><br/>
<a href="shopping.do">View Cart</a>

运行应用程序

将应用程序发布到 Tomcat 服务器,访问 index.jsp ,并启动 flow ,测试页面的跳转。效果如图 5所示:

图 4 flow 运行效果


火龙果软件/UML软件工程组织致力于提高您的软件工程实践能力,我们不断地吸取业界的宝贵经验,向您提供经过数百家企业验证的有效的工程技术实践经验,同时关注最新的理论进展,帮助您“领跑您所在行业的软件世界”。
资源网站: UML软件工程组织