Spring Web Flow 入门demo(一)简单页面跳转



Spring Web Flow (SWF)是Spring Framework的一个脱离模块。这个模块是Spring Web应用开发模块栈的一部分,Spring Web包含Spring MVC。

Spring Web Flow的目标是成为管理Web应用页面流程的最佳方案。当你的应用需要复杂的导航控制,例如向导,在一个比较大的事务过程中去指导用户经过一连串的步骤的时候,SWF将会是一个功能强大的控制器。

 

下面我们还是从一个简单的demo开始了解它:

 

这个例子是结合Springmvc来实现,项目结构:




Web.xml配置:

[html]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">  
  3.   <display-name>CartApp</display-name>  
  4.   
  5. <!-- 配置springmvc需要的servlet -->  
  6.   
  7. <servlet>  
  8.   <servlet-name>CartServlet</servlet-name>  
  9.   <servlet-class>  
  10.   org.springframework.web.servlet.DispatcherServlet  
  11.   </servlet-class>  
  12.   <init-param>  
  13.     <param-name>contextConfigLocation</param-name>   
  14.     <param-value>   
  15.     /WEB-INF/config/web-application-config.xml   
  16.     </param-value>   
  17.   </init-param>   
  18.   <load-on-startup>1</load-on-startup>  
  19. </servlet>  
  20.   
  21.     <servlet-mapping>  
  22.         <servlet-name>CartServlet</servlet-name>  
  23.         <url-pattern>/spring/*</url-pattern>  
  24.     </servlet-mapping>  
  25.    
  26.   <welcome-file-list>    
  27.     <welcome-file>index.jsp</welcome-file>  
  28.   </welcome-file-list>  
  29. </web-app>  

对应的SpringMVC的配置文件:web-application-config.xml


[html]  view plain  copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"  
  4.     xsi:schemaLocation="http://www.springframework.org/schema/beans   
  5.     http://www.springframework.org/schema/beans/spring-beans-2.5.xsd   
  6.     http://www.springframework.org/schema/context   
  7.     http://www.springframework.org/schema/context/spring-context-2.5.xsd">  
  8.       
  9.     <!-- SpringMVC的配置文件-2015年6月14日15:45:54 -->  
  10.     <!-- 搜索 samples.webflow 包里的 @Component 注解,并将其部署到容器中 -->  
  11.     <context:component-scan base-package="samples.webflow" />  
  12.     <!-- 启用基于注解的配置 -->  
  13.     <context:annotation-config />  
  14.     <import resource="webmvc-config.xml" />  
  15.     <import resource="webflow-config.xml" />  
  16. </beans>  

其中引入的两个配置文件:webmvc-config.xml


[html]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="http://www.springframework.org/schema/beans   
  5.     http://www.springframework.org/schema/beans/spring-beans.xsd">  
  6.       
  7.     <!-- SpringMVC的配置文件-2015年6月14日15:45:54 -->  
  8.       
  9.     <!-- 对转向页面的路径解析。prefix:前缀, suffix:后缀 -->     
  10.     <bean id="viewResolver"  
  11.         class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
  12.         <property name="viewClass"  
  13.             value="org.springframework.web.servlet.view.JstlView">  
  14.         </property>  
  15.         <property name="prefix" value="/WEB-INF/jsp/">  
  16.         </property>  
  17.         <property name="suffix" value=".jsp">  
  18.         </property>  
  19.     </bean>  
  20.     <!--  如何根据http请求选择合适的controller是MVC中一项十分关键的功能,在Spring MVC中,HandlerMapping接口是这一活动的抽象 -->  
  21.     <!-- SimpleUrlHandlerMapping  通过配置文件,把一个URL映射到Controller -->  
  22.     <bean id="viewMappings"  
  23.         class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">  
  24.         <!-- /shopping.do 请求由 flowController 来处理 -->  
  25.         <!-- 不管设成 /shopping.do 还是设成 /shopping ,或者 /shopping.htm ,效果都是一样的, flowController 都会去找 id 为 shopping的flow来执行 -->  
  26.         <property name="mappings">  
  27.             <value> /shopping.do=flowController </value>  
  28.         </property>  
  29.          <property name="defaultHandler">  
  30.             <!-- UrlFilenameViewController 会将 "/index" 这样的请求映射成名为 "index" 的视图 -->  
  31.             <bean class="org.springframework.web.servlet.mvc.UrlFilenameViewController" />  
  32.         </property>   
  33.     </bean>  
  34.     <!-- 我们只要明白 FlowController 可根据客户端请求的结尾部分,找出相应的 flow 来执行。配置 FlowController只需指定FlowExecutor即可 -->  
  35.     <bean id="flowController" class="org.springframework.webflow.mvc.servlet.FlowController">  
  36.         <property name="flowExecutor" ref="flowExecutor" />  
  37.     </bean>  
  38. </beans>  

对于UrlFilenameViewController类,此处理解为由于我们并不是通过访问controller来返回页面的形式,那么我们如何可以访问Web-INF下的保护类资源呢,就是通过这个类的作用来实现。此处的理解有什么偏差还请各位提出宝贵意见!

 

webflow-config.xml:


[html]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:webflow="http://www.springframework.org/schema/webflow-config"  
  4.     xsi:schemaLocation=" http://www.springframework.org/schema/beans   
  5.     http://www.springframework.org/schema/beans/spring-beans-2.5.xsd   
  6.     http://www.springframework.org/schema/webflow-config   
  7.     http://www.springframework.org/schema/webflow-config/spring-webflow-config-2.0.xsd">  
  8.       
  9.     <!-- 流程的配置文件-2015年6月14日15:45:46 -->  
  10.       
  11.     <!-- FlowExecutor 是 Spring Web Flow 的一个核心接口,启动某个 flow ,都要通过这个接口来进行。  
  12.         从配置角度来说,只要保证有个 FlowExecutor 就可以了, Spring Web Flow 的默认行为已经足够 -->  
  13.     <!-- FlowExecutor 就是通过 id 来找出要执行的 flow 。至于这个 id ,则是要由用户来指定的。  
  14.         在默认配置情况下,如果客户端发送了如下URL请求:http://localhost:8080/CartApp/spring/shopping。  
  15.         则从 Spring Web Flow 的角度来看,这个 URL 就表示客户想要执行一个 id 为“ shopping ”的 flow ,  
  16.         于是就会在 FlowRegistry 中查找名为“ shopping ”的 flow,由FlowExecutor负责执行。 -->  
  17.     <webflow:flow-executor id="flowExecutor" />  
  18.       
  19.     <!-- 所有 flow的定义文件它的位置在这里进行配置, flow-builder-services 用于配置 flow 的特性 -->  
  20.     <!-- FlowRegistry 是存放 flow 的仓库,每个定义 flow 的 XML 文档被解析后,都会被分配一个唯一的 id ,并以 FlowDefinition 对象的形式存放在 FlowResigtry 中 -->  
  21.     <!-- 每个 flow 都必须要有 id 来标识,如果在配置中省略,那么该 flow 默认的 id 将是该定义文件(xml文件)的文件名去掉后缀所得的字符串  
  22.     (例如本例中如果去掉id="shopping",那么flow的id就是shopping.xml去掉后缀名.xml后的shopping作为id) -->  
  23.       
  24.     <!--  flow-builder-services 属性的配置指明了在这个 flow-registry “仓库”里的 flow 的一些基本特性,  
  25.         例如,是用 Unified EL 还是 OGNL 、 model (模型)对象中的数据在显示之前是否需要先作转换,等等 -->  
  26.           
  27.     <webflow:flow-registry id="flowRegistry" flow-builder-services="flowBuilderServices">  
  28.         <webflow:flow-location path="/WEB-INF/flows/shopping.xml" id="shopping" />  
  29.         <webflow:flow-location path="/WEB-INF/flows/addToCart.xml" id="addToCart" />  
  30.     </webflow:flow-registry>  
  31.       
  32.     <!--Web Flow 中的视图通过 MVC 框架的视图技术来呈现 -->  
  33.       
  34.     <webflow:flow-builder-services id="flowBuilderServices" view-factory-creator="mvcViewFactoryCreator" />  
  35.       
  36.     <!-- 指明 MVC 框架的 view resolver ,用于通过 view 名查找资源 -->  
  37.     <bean id="mvcViewFactoryCreator" class="org.springframework.webflow.mvc.builder.MvcViewFactoryCreator">  
  38.         <property name="viewResolvers" ref="viewResolver" />  
  39.     </bean>  
  40. </beans>  

使用的流程文件:shopping.xml


[html]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <flow xmlns="http://www.springframework.org/schema/webflow"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="http://www.springframework.org/schema/webflow  
  5.  http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd">  
  6.  <!-- view-state中的view对应jsp文件夹中的jsp页面,on是触发事件,to对应state id -->  
  7.     <!-- 流程文件-2015年6月14日15:51:56 -->  
  8.     <!-- 根据排在第一位的顺序来执行 -->  
  9.     <view-state id="viewCart" view="viewCart">  
  10.         <transition on="submit" to="viewOrder">  
  11.         </transition>  
  12.     </view-state>  
  13.     <view-state id="viewOrder" view="viewOrder">  
  14.         <transition on="confirm" to="orderConfirmed">  
  15.         </transition>  
  16.     </view-state>  
  17.     <view-state id="orderConfirmed" view="orderConfirmed">  
  18.         <transition on="returnToIndex" to="returnToIndex">  
  19.         </transition>  
  20.     </view-state>  
  21.     <end-state id="returnToIndex" view="externalRedirect:servletRelative:/index.jsp">  
  22.     </end-state>  
  23. </flow>  


对应的页面:

 

index.jsp

[html]  view plain  copy
  1. <?xml version="1.0" encoding="utf-8" ?>  
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"   
  3.   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  4. <html xmlns="http://www.w3.org/1999/xhtml">  
  5. <head>  
  6. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
  7. <title>Cart Application</title>  
  8. </head>  
  9. <body>  
  10.     <h1>Hello!</h1>  
  11.     <br />  
  12.     <a href="shopping.do">View Cart</a>  
  13. </body>  
  14. </html><span style="font-family:Arial, Helvetica, sans-serif;background-color:rgb(255,255,255);"> </span>  


viewCart.jsp


[html]  view plain  copy
  1. <body>  
  2.     <h1>View Cart</h1>  
  3.     <a href="${flowExecutionUrl}&_eventId=submit">Submit</a>  
  4. </body>  


viewOrder.jsp


[html]  view plain  copy
  1. <body>  
  2.     <h1>Order</h1>  
  3.     <a href="${flowExecutionUrl}&_eventId=confirm">Confirm</a>  
  4.   
  5. </body>  


orderConfirmed.jsp


[html]  view plain  copy
  1. <body>  
  2.     <h1>Order Confirmed</h1>  
  3.     <a href="${flowExecutionUrl}&_eventId=returnToIndex">Return to  
  4.         index</a>  
  5. </body>  

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


测试使用方式:

 

访问地址:http://localhost:8080/CartApp3/spring/index.jsp

 

总的来说,为什么要配置这么多内容呢?原因如下:

SpringWeb Flow 如何与 Spring Web MVC 整合在一起?

客户端发送的请求,先会由 servlet 容器(Tomcat)接收, servlet容器会找到相应的应用程序(CartApp3),再根据 web.xml 的配置找到出符合映射条件的 servlet 来处理。Spring Web MVC 中处理请求的 servlet 是 DispatcherServlet ,如果请求的路径满足 DispatcherServlet的映射条件,则 DispatcherServlet 会找出 Spring IoC 容器中所有的 HandlerMapping ,根据这些HandlerMapping 中匹配最好的 handler (一般情况下都是 controller ,即控制器)来处理请求。当 Controller处理完毕,一般都会返回一个 view (视图)的名字,DispatcherServlet再根据这个view的名字找到相应的视图资源返回给客户端。

弄清楚Spring Web MVC 处理请求的流程后,基本上就可以明白要整合 Spring Web MVC 与 Spring Web Flow所需要的配置了。为了让客户端的请求变成执行某个 flow 的请求,要解决以下几个问题:

  1. 需要在某个 HandlerMapping 中配置负责处理 flow 请求的 handler (或 controller )--配置controller(flowController)
  2. 该handler (或 controller )要负责启动指定的 flow--controller负责启动flow(flowExecutor)
  3. flow 执行过程中以及执行完成后所涉及的视图应呈现给客户端--配置解析返回视图方式(viewResolvers)

 

所有这些配置的目的无非是两个:一是要让客户端的请求转变成flow 的执行,二是要让 flow 执行过程中、或执行结束后得到的视图能返还给客户端。

Spring Web Flow (SWF)是Spring Framework的一个脱离模块。这个模块是Spring Web应用开发模块栈的一部分,Spring Web包含Spring MVC。

Spring Web Flow的目标是成为管理Web应用页面流程的最佳方案。当你的应用需要复杂的导航控制,例如向导,在一个比较大的事务过程中去指导用户经过一连串的步骤的时候,SWF将会是一个功能强大的控制器。

 

下面我们还是从一个简单的demo开始了解它:

 

这个例子是结合Springmvc来实现,项目结构:




Web.xml配置:

[html]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">  
  3.   <display-name>CartApp</display-name>  
  4.   
  5. <!-- 配置springmvc需要的servlet -->  
  6.   
  7. <servlet>  
  8.   <servlet-name>CartServlet</servlet-name>  
  9.   <servlet-class>  
  10.   org.springframework.web.servlet.DispatcherServlet  
  11.   </servlet-class>  
  12.   <init-param>  
  13.     <param-name>contextConfigLocation</param-name>   
  14.     <param-value>   
  15.     /WEB-INF/config/web-application-config.xml   
  16.     </param-value>   
  17.   </init-param>   
  18.   <load-on-startup>1</load-on-startup>  
  19. </servlet>  
  20.   
  21.     <servlet-mapping>  
  22.         <servlet-name>CartServlet</servlet-name>  
  23.         <url-pattern>/spring/*</url-pattern>  
  24.     </servlet-mapping>  
  25.    
  26.   <welcome-file-list>    
  27.     <welcome-file>index.jsp</welcome-file>  
  28.   </welcome-file-list>  
  29. </web-app>  

对应的SpringMVC的配置文件:web-application-config.xml


[html]  view plain  copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"  
  4.     xsi:schemaLocation="http://www.springframework.org/schema/beans   
  5.     http://www.springframework.org/schema/beans/spring-beans-2.5.xsd   
  6.     http://www.springframework.org/schema/context   
  7.     http://www.springframework.org/schema/context/spring-context-2.5.xsd">  
  8.       
  9.     <!-- SpringMVC的配置文件-2015年6月14日15:45:54 -->  
  10.     <!-- 搜索 samples.webflow 包里的 @Component 注解,并将其部署到容器中 -->  
  11.     <context:component-scan base-package="samples.webflow" />  
  12.     <!-- 启用基于注解的配置 -->  
  13.     <context:annotation-config />  
  14.     <import resource="webmvc-config.xml" />  
  15.     <import resource="webflow-config.xml" />  
  16. </beans>  

其中引入的两个配置文件:webmvc-config.xml


[html]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="http://www.springframework.org/schema/beans   
  5.     http://www.springframework.org/schema/beans/spring-beans.xsd">  
  6.       
  7.     <!-- SpringMVC的配置文件-2015年6月14日15:45:54 -->  
  8.       
  9.     <!-- 对转向页面的路径解析。prefix:前缀, suffix:后缀 -->     
  10.     <bean id="viewResolver"  
  11.         class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
  12.         <property name="viewClass"  
  13.             value="org.springframework.web.servlet.view.JstlView">  
  14.         </property>  
  15.         <property name="prefix" value="/WEB-INF/jsp/">  
  16.         </property>  
  17.         <property name="suffix" value=".jsp">  
  18.         </property>  
  19.     </bean>  
  20.     <!--  如何根据http请求选择合适的controller是MVC中一项十分关键的功能,在Spring MVC中,HandlerMapping接口是这一活动的抽象 -->  
  21.     <!-- SimpleUrlHandlerMapping  通过配置文件,把一个URL映射到Controller -->  
  22.     <bean id="viewMappings"  
  23.         class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">  
  24.         <!-- /shopping.do 请求由 flowController 来处理 -->  
  25.         <!-- 不管设成 /shopping.do 还是设成 /shopping ,或者 /shopping.htm ,效果都是一样的, flowController 都会去找 id 为 shopping的flow来执行 -->  
  26.         <property name="mappings">  
  27.             <value> /shopping.do=flowController </value>  
  28.         </property>  
  29.          <property name="defaultHandler">  
  30.             <!-- UrlFilenameViewController 会将 "/index" 这样的请求映射成名为 "index" 的视图 -->  
  31.             <bean class="org.springframework.web.servlet.mvc.UrlFilenameViewController" />  
  32.         </property>   
  33.     </bean>  
  34.     <!-- 我们只要明白 FlowController 可根据客户端请求的结尾部分,找出相应的 flow 来执行。配置 FlowController只需指定FlowExecutor即可 -->  
  35.     <bean id="flowController" class="org.springframework.webflow.mvc.servlet.FlowController">  
  36.         <property name="flowExecutor" ref="flowExecutor" />  
  37.     </bean>  
  38. </beans>  

对于UrlFilenameViewController类,此处理解为由于我们并不是通过访问controller来返回页面的形式,那么我们如何可以访问Web-INF下的保护类资源呢,就是通过这个类的作用来实现。此处的理解有什么偏差还请各位提出宝贵意见!

 

webflow-config.xml:


[html]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:webflow="http://www.springframework.org/schema/webflow-config"  
  4.     xsi:schemaLocation=" http://www.springframework.org/schema/beans   
  5.     http://www.springframework.org/schema/beans/spring-beans-2.5.xsd   
  6.     http://www.springframework.org/schema/webflow-config   
  7.     http://www.springframework.org/schema/webflow-config/spring-webflow-config-2.0.xsd">  
  8.       
  9.     <!-- 流程的配置文件-2015年6月14日15:45:46 -->  
  10.       
  11.     <!-- FlowExecutor 是 Spring Web Flow 的一个核心接口,启动某个 flow ,都要通过这个接口来进行。  
  12.         从配置角度来说,只要保证有个 FlowExecutor 就可以了, Spring Web Flow 的默认行为已经足够 -->  
  13.     <!-- FlowExecutor 就是通过 id 来找出要执行的 flow 。至于这个 id ,则是要由用户来指定的。  
  14.         在默认配置情况下,如果客户端发送了如下URL请求:http://localhost:8080/CartApp/spring/shopping。  
  15.         则从 Spring Web Flow 的角度来看,这个 URL 就表示客户想要执行一个 id 为“ shopping ”的 flow ,  
  16.         于是就会在 FlowRegistry 中查找名为“ shopping ”的 flow,由FlowExecutor负责执行。 -->  
  17.     <webflow:flow-executor id="flowExecutor" />  
  18.       
  19.     <!-- 所有 flow的定义文件它的位置在这里进行配置, flow-builder-services 用于配置 flow 的特性 -->  
  20.     <!-- FlowRegistry 是存放 flow 的仓库,每个定义 flow 的 XML 文档被解析后,都会被分配一个唯一的 id ,并以 FlowDefinition 对象的形式存放在 FlowResigtry 中 -->  
  21.     <!-- 每个 flow 都必须要有 id 来标识,如果在配置中省略,那么该 flow 默认的 id 将是该定义文件(xml文件)的文件名去掉后缀所得的字符串  
  22.     (例如本例中如果去掉id="shopping",那么flow的id就是shopping.xml去掉后缀名.xml后的shopping作为id) -->  
  23.       
  24.     <!--  flow-builder-services 属性的配置指明了在这个 flow-registry “仓库”里的 flow 的一些基本特性,  
  25.         例如,是用 Unified EL 还是 OGNL 、 model (模型)对象中的数据在显示之前是否需要先作转换,等等 -->  
  26.           
  27.     <webflow:flow-registry id="flowRegistry" flow-builder-services="flowBuilderServices">  
  28.         <webflow:flow-location path="/WEB-INF/flows/shopping.xml" id="shopping" />  
  29.         <webflow:flow-location path="/WEB-INF/flows/addToCart.xml" id="addToCart" />  
  30.     </webflow:flow-registry>  
  31.       
  32.     <!--Web Flow 中的视图通过 MVC 框架的视图技术来呈现 -->  
  33.       
  34.     <webflow:flow-builder-services id="flowBuilderServices" view-factory-creator="mvcViewFactoryCreator" />  
  35.       
  36.     <!-- 指明 MVC 框架的 view resolver ,用于通过 view 名查找资源 -->  
  37.     <bean id="mvcViewFactoryCreator" class="org.springframework.webflow.mvc.builder.MvcViewFactoryCreator">  
  38.         <property name="viewResolvers" ref="viewResolver" />  
  39.     </bean>  
  40. </beans>  

使用的流程文件:shopping.xml


[html]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <flow xmlns="http://www.springframework.org/schema/webflow"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="http://www.springframework.org/schema/webflow  
  5.  http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd">  
  6.  <!-- view-state中的view对应jsp文件夹中的jsp页面,on是触发事件,to对应state id -->  
  7.     <!-- 流程文件-2015年6月14日15:51:56 -->  
  8.     <!-- 根据排在第一位的顺序来执行 -->  
  9.     <view-state id="viewCart" view="viewCart">  
  10.         <transition on="submit" to="viewOrder">  
  11.         </transition>  
  12.     </view-state>  
  13.     <view-state id="viewOrder" view="viewOrder">  
  14.         <transition on="confirm" to="orderConfirmed">  
  15.         </transition>  
  16.     </view-state>  
  17.     <view-state id="orderConfirmed" view="orderConfirmed">  
  18.         <transition on="returnToIndex" to="returnToIndex">  
  19.         </transition>  
  20.     </view-state>  
  21.     <end-state id="returnToIndex" view="externalRedirect:servletRelative:/index.jsp">  
  22.     </end-state>  
  23. </flow>  


对应的页面:

 

index.jsp

[html]  view plain  copy
  1. <?xml version="1.0" encoding="utf-8" ?>  
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"   
  3.   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  4. <html xmlns="http://www.w3.org/1999/xhtml">  
  5. <head>  
  6. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
  7. <title>Cart Application</title>  
  8. </head>  
  9. <body>  
  10.     <h1>Hello!</h1>  
  11.     <br />  
  12.     <a href="shopping.do">View Cart</a>  
  13. </body>  
  14. </html><span style="font-family:Arial, Helvetica, sans-serif;background-color:rgb(255,255,255);"> </span>  


viewCart.jsp


[html]  view plain  copy
  1. <body>  
  2.     <h1>View Cart</h1>  
  3.     <a href="${flowExecutionUrl}&_eventId=submit">Submit</a>  
  4. </body>  


viewOrder.jsp


[html]  view plain  copy
  1. <body>  
  2.     <h1>Order</h1>  
  3.     <a href="${flowExecutionUrl}&_eventId=confirm">Confirm</a>  
  4.   
  5. </body>  


orderConfirmed.jsp


[html]  view plain  copy
  1. <body>  
  2.     <h1>Order Confirmed</h1>  
  3.     <a href="${flowExecutionUrl}&_eventId=returnToIndex">Return to  
  4.         index</a>  
  5. </body>  

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


测试使用方式:

 

访问地址:http://localhost:8080/CartApp3/spring/index.jsp

 

总的来说,为什么要配置这么多内容呢?原因如下:

SpringWeb Flow 如何与 Spring Web MVC 整合在一起?

客户端发送的请求,先会由 servlet 容器(Tomcat)接收, servlet容器会找到相应的应用程序(CartApp3),再根据 web.xml 的配置找到出符合映射条件的 servlet 来处理。Spring Web MVC 中处理请求的 servlet 是 DispatcherServlet ,如果请求的路径满足 DispatcherServlet的映射条件,则 DispatcherServlet 会找出 Spring IoC 容器中所有的 HandlerMapping ,根据这些HandlerMapping 中匹配最好的 handler (一般情况下都是 controller ,即控制器)来处理请求。当 Controller处理完毕,一般都会返回一个 view (视图)的名字,DispatcherServlet再根据这个view的名字找到相应的视图资源返回给客户端。

弄清楚Spring Web MVC 处理请求的流程后,基本上就可以明白要整合 Spring Web MVC 与 Spring Web Flow所需要的配置了。为了让客户端的请求变成执行某个 flow 的请求,要解决以下几个问题:

  1. 需要在某个 HandlerMapping 中配置负责处理 flow 请求的 handler (或 controller )--配置controller(flowController)
  2. 该handler (或 controller )要负责启动指定的 flow--controller负责启动flow(flowExecutor)
  3. flow 执行过程中以及执行完成后所涉及的视图应呈现给客户端--配置解析返回视图方式(viewResolvers)

 

所有这些配置的目的无非是两个:一是要让客户端的请求转变成flow 的执行,二是要让 flow 执行过程中、或执行结束后得到的视图能返还给客户端。

猜你喜欢

转载自blog.csdn.net/qq_34325222/article/details/79878605