Spring学习笔记之Spring Web Flow
来源:互联网 发布:windows assembly 编辑:程序博客网 时间:2024/04/30 02:52
Spring Web Flow 是Spring MVC 的扩展,它支持开发基于流程的应用程序。它将流程的定义与实现流程行为的类和视图分离开来。
1.配置Web Flow
在Spring MVC上下文定义,添加的命名空间:
xmlns:flow="http://www.springframework.org/schema/webflow-config" xsi:schemaLocation=" http://www.springframework.org/schema/webflow-config http://www.springframework.org/schema/webflow=config/spring-webflow-config-2.3.xsd
完整配置:
<?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:flow="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"> <!-- flow-executor流程执行器 --> <flow:flow-executor id="flowExecutor"/> <!-- 流程注册表 --> <flow:flow-registry id="flowRegistry" base-path="/WEB-INF/flows"> <flow:flow-location-pattern value="*-flow.xml"/> <!-- 这样,结合base-path属性,凡是在base-path下,且以-flow.xml结尾的文件都将视为流程定义 --> <!-- 当然,也可以不要base-path,像下面这样直接定义 ,id可以不写,访问这个流程的时候用/id即可--> <flow:flow-location path="/WEB-INF/flows/springpizza.xml" id="pizza"/> </flow:flow-registry> <!-- 定义HandlerMapping --> <bean class="org.springframework.webflow.mvc.servlet.FlowHandlerMapping"> <property name="flowRegistry" ref="flowRegistry"/> </bean> <!-- 定义HandlerAdapter --> <bean class="org.springframework.webflow.mvc.servlet.FlowHandlerAdapter"> <property name="flowExecutor" ref="flowExecutor"/> </bean></beans>
流程执行器:会为用户创建并启动一个流程执行实例。当流程暂停的时候(如为用户展示视图时),流程执行器会在用户执行操作后恢复流程。
流程注册表:加载流程定义文件并让流程执行器能够使用它们。
个人认为,Spring WebFlow的实现的核心就是基于其实现了HandlerMapping和HandlerAdapter。
2.流程组件
流程是由三个主要元素定义的:状态、转移和流程数据。状态是流程中事件发生的地点。转移用来连接状态。流程数据是流程的当前状况。
2.1 状态
Spring Web Flow定义了五种不同类型的状态:
视图状态:
<view-state id="welcome" view="greeting" model="flowScope.paymentDetail"/>
id属性标示这个状态,除此之外,如果没有定义view属性,则将自动默认view属性为id属性。model属性表明逻辑视图名greeting所表示的视图中的表单将绑定流程作用域中的paymentDetail对象。
行为状态:
<action-state id="saveOrder"><evaluate expression="pizzaFlowActions.saveOrder(order)" /><transition to="thankyou" /></action-state>
上面<evaluate>
给出了行为状态要做的事情。expression属性指定了进入状态时要评估的表达式,这里使用的SpEL表达式,表明将会找到ID为pizzaFlowActions的bean并调用其saveOrder()方法。
决策状态:
<decision-state id="checkDeliverArea"><if test="pizzaFlowActions.checkDeliverArea(customer.zipCode)" than="addCustomer" else="deliverWarning" /></decision-state>
子流程状态:
<subflow-state id="order" subflow="pizza/order"><input name="order" value="order" /><transition on="orderCreated" to="payment" /></subflow-state>
在这里,<input />
元素用于传递订单对象作为子流程的输入,如果子流程结束的<end-state>
状态ID为orderCreated,那么流畅将会转移到名为payment的状态。
结束状态:
<end-state id="customerReady" />
当到达<end-state>
状态,流程会结束。接下来会发生什么取决于几个因素:
- 如果结束的流程是一个子流程,那调用它的流程将会从
<subflow-state>
处继续执行,<end-state>
的ID将会用作事件触发从<subflow-state>
开始的转移。 - 如果
<end-state>
设置了view属性,指定的视图将会被渲染。视图可以是相对于流程路径的视图模板,如果添加“externalRedirect:”前缀的话,将会重定向到流程外部的页面,如果添加“flowRedirect:”将重定向到另外一个流程中。 - 如果结束的流程不是子流程,也没有指定view属性,那这个流程只是会结束而已。浏览器最后将会加载流程的基本URL地址,当前已没有活动的流程,所以会开始一个新的流程实例。
2.2转移
流程中除结束状态之外的每个状态,至少都需要一个转移,这样就能够知道一旦这个状态完成时流程要去向哪里。状态可以有多个转移,分别对应于当前状态结束时可以执行的不同的路径。
<transition to="customerReady" on="phoneEntered"/>
to属性指定流程的下一个状态,必须。on属性指定触发转移的事件,非必须。
还可以使用on-exception属性指定抛出异常时进入另一个状态。
<transition on-exception= "com.springination.pizza.service.CustomNotFoundException" to="registrationForm" />
全局转移(流程中的所有状态都会默认拥有这个转移):
<globl-transitions> <transition on="cancel" to="endState" /></global-transitions>
2.3流程数据
声明变量:
使用<var>
<var name="customer" class="com.xxx.Customer" />
使用set
<set name="flowScope.pizza" value="new com.xx.Pizza()" />
作为行为状态的一部分或者作为视图状态的入口,可以使用evaluate元素来创建变量:
<evaluate result="viewScope.toppingsList" expression="T(com.xxx.Topping).asList()" />
这里计算了一个表达式SpELl并将结果放到了名为toppingList的变量中,这个变量是视图作用域的。
set和evaluate元素很类似,都是讲变量设置为表达式计算的结果。
Spring WebFlow的作用域:
当时用<var>
元素声明变量时,变量始终是流程作用域,也就是在定义变量的流程内有效。当使用<set>
或<evaluate>
的时候,作用域通过name或result属性的前缀指定。
<set name="flowScop.theAnswer" value="32">
3.案例
按照书上做的一个订购披萨的流程Demo,Demo下载链接:http://download.csdn.net/detail/csdn_xuexiaoqiang/9798188,搭建好后流程的访问地址是“localhost:8080/spizza/pizza”。
2017-4-24 21:50:42补充集成
4.Spring MVC和Spring Web Flow集成
只需要配置两个DispatcherServlet就可以了。
下面是web.xml
<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance http://www.springmodules.org/schema/cache/springmodules-cache.xsd http://www.springmodules.org/schema/cache/springmodules-ehcache.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 这个服务普通的MVC请求 --> <servlet> <servlet-name>spring</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:dispatcherServlet-context.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>spring</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <!-- 这个服务流程请求 --> <servlet> <servlet-name>pizzaServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:pizaarServlet-context.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>pizzaServlet</servlet-name> <url-pattern>/flow/*</url-pattern> </servlet-mapping></web-app>
配置文件pizaarServlet-context.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:flow="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"> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/"/> <property name="suffix" value=".jsp"/> </bean> <!-- flow-executor流程执行器 --> <flow:flow-executor id="flowExecutor"/> <!-- 流程注册表 --> <flow:flow-registry id="flowRegistry"> <flow:flow-location path="/WEB-INF/pizza-flow.xml" id="pizza"/> <flow:flow-location path="/WEB-INF/customer-flow.xml" id="customer"/> <flow:flow-location path="/WEB-INF/order-flow.xml" id="order"/> <flow:flow-location path="/WEB-INF/payment-flow.xml" id="payment"/> </flow:flow-registry> <!-- 定义HandlerMapping --> <bean id="handlerMapping" class="org.springframework.webflow.mvc.servlet.FlowHandlerMapping"> <property name="flowRegistry" ref="flowRegistry"/> </bean> <!-- 定义HandlerAdapter --> <bean id="handlerAdapter" class="org.springframework.webflow.mvc.servlet.FlowHandlerAdapter"> <property name="flowExecutor" ref="flowExecutor"/> </bean></beans>
配置文件dispatcherServlet-context.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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/"/> <property name="suffix" value=".jsp"/> </bean> <context:component-scan base-package="com.pizza.action"/></beans>
这样就可以了。通过localhost:8080/spizza/flow/pizza
这个链接就可以访问我们定义的披萨流程。
通过localhost:8080/spizza/index.do
就可以访问下面这个controller:
@Controllerpublic class Index { @RequestMapping("/index.do") public void test(){ System.out.println("MVC测试成功"); }}
- Spring学习笔记之Spring Web Flow
- Spring学习 WEB FLOW
- spring web flow学习笔记一
- 《Spring实战》学习笔记-第八章:使用Spring Web Flow
- 《Spring实战》学习笔记-第八章:使用Spring Web Flow
- spring web flow初学笔记
- Spring Web Flow
- Spring Web Flow
- spring web flow
- Spring web flow 配置文件
- spring web flow 随记
- Spring Web Flow
- Spring Web Flow实例教程
- spring web flow起步
- Spring Web Flow
- Spring Web Flow
- 《Spring Web Flow 实践》
- Spring Web Flow 简介
- Android Studio 引入Jar包,Jar包冲突问题总结
- dreamweaver中如何控制点击铵钮后的动作
- 【BZOJ1857】三分套三分
- 这个网站滚动图片如何实现的
- Unity3D研究院之主角面朝方向一定区域内对象角度计算
- Spring学习笔记之Spring Web Flow
- 韩信点兵趣味C语言题目
- spring一些常见缺少包的问题
- 记一次Linux服务安装分布式文件服务FastDFS和nginx(待续)
- MATLAB图像的平移和旋转
- CC2530基础实验四 串口通信
- 网易笔试题两道
- Java开发环境搭建
- 计算机网络知识点