spring webflow学习笔记1
1、设置FlowController
<bean id="flowController" class="org.springframework.webflow.mvc.servlet.FlowController">
<property name="flowExecutor" ref="flowExecutor" />
</bean>
接下里配置一个到FlowController的映射:SimpleUrlHanderMapping
<bean id="viewMappings"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<!-- /shopping.do 请求由 flowController 来处理 -->
<property name="mappings">
<value> /login.do=flowController </value>
</property>
<property name="defaultHandler">
<bean class="org.springframework.web.servlet.mvc.UrlFilenameViewController" />
</property>
</bean>
2、在web.xml中配置DisPatcherServlet
<servlet>
<servlet-name>Spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/config/web-application-config.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
3、配置流程执行程序:
虽然FlowController可以为Spring WebFlow处理web请求,但是它并不会执行流程。它只不过是用户和请求的执行程序之间的信使。流程执行程序的工作与空中交 通管制员的工作类似,它跟踪所有当前正在被执行的流程并引导每个流程到达它们所应该处于的状态。
我们需要在SPring中配置流程执行程序。首先要做的是将Spring WebFlow模式添加到Spring 应用程序环境的XMl文件中:
<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">
......</beans>
然后我们就需要声明流程执行程序:
<webflow:flow-executor id="flowExecutor" />
<webflow:flow-registry id="flowRegistry"
flow-builder-services="flowBuilderServices">
<webflow:flow-location path="/flows/login.xml"
id="login" />
</webflow:flow-registry>
这样我们就配置好了Spring WebFlow,接下来就需要建立流程了。
4、建立流程的核心概念。在Spring Web Flow 中。有三种主要的元素组成了应用程序流程:状态、事件和过渡。
状态是流程中某些活动发生的点。
下面红色字体引用于:http://hengstart.iteye.com/blog/819748
在Spring WebFlow里面,每个Flow都包括了几个步骤,称为‘State’。 每一个步骤里面都有一个View,View里面的事件处理由State来执行。这些事件会触发一些 事务,这些事务会根据之前设置好的配置,跳转到其他的State上面去。
在Spring WebFlow中,flow的设置都是用XML文件来表示。
Spring WebFlow的XML定义:
Flow标签:<flow/>是根元素,所有的定义从这个元素开始。
State标签:<view-
state/>用来表示一个拥有View的State。在这个标签里面,指定了用于描述View的文件的位置。这个位置是约定俗成的,由设置的id
来指 定。比如<view-state
id=”enterBookDetails”/>,那么这个State的View的描述文件为enterBookDetails.xhtml。如果
这个Flow的定义文件存放在/WEB- INF/xxxx/booking/目录下面,那么这个View的定义文件就是/WEB-INF/xxxx
/booking/enterBookDetails.xhtml。
transaction标签:<transaction/>
是view-state的子标签,定义一个页面转向,比如<transaction on=”submit”
to=”reviewBooking”/>,则是说明了当触 发submit事件的时候,转到下面一个state,转向的state的id为
reviewBooking。
end-state标签:<end-state/>这个表示flow的出口,如果某个transaction指向了一个end-state标签,表示这个flow已经结束。一个flow可以有多个end- state标签,表示多个出口。
一个完整的XML文件例子:
<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="enterBookingDetails">
<transition on="submit" to="reviewBooking" />
</view-state>
<view-state id="reviewBooking">
<transition on="confirm" to="bookingConfirmed" />
<transition on="revise" to="enterBookingDetails" />
<transition on="cancel" to="bookingCancelled" />
</view-state>
<end-state id="bookingConfirmed" />
<end-state id="bookingCancelled" />
</flow>
Actions:一个Spring WebFlow里面很重要的概念,从上面可以看出,view-state、transaction、end-state标签只是表示Flow的流程,页面跳转,里面没有说 明业务逻辑的操作。Action就是用来调用这些业务逻辑操作的。
在下面几个点中,我们可以调用Action:
1.Flow开始的时候
2.进入State的时候
3.View进行渲染的时候
4.transaction执行的时候
5.state退出的时候
6.Flow结束的时候
evaluate:这个标签可能是Action里面最常使用的标签,用Spring定义的表达式来确定一个Action去调用哪个Spring Bean的方法,然后返回值、返回类型是什 么。
例
如:<evaluate expression="bookingService.findHotels(searchCriteria)"
result="flowScope.hotels"
result-type="dataModel"/>,这里面就说明了 这个action需要调用bookingService这个bean的
findHotels这个方法,传入的参数是searchCriteria这个bean,返回的结果是flowScope(这个是所属的Flow的 数据模
型)里面的hotels这个数据模型(这个后面会提到)。
一个完整的包含Action的xml文件例子
<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">
<input name="hotelId" />
<on-start>
<evaluate expression="bookingService.createBooking(hotelId,currentUser.name)" result="flowScope.booking" />
</on-start>
<view-state id="enterBookingDetails">
<transition on="submit" to="reviewBooking" />
</view-state>
<view-state id="reviewBooking">
<transition on="confirm" to="bookingConfirmed" />
<transition on="revise" to="enterBookingDetails" />
<transition on="cancel" to="bookingCancelled" />
</view-state>
<end-state id="bookingConfirmed" />
<end-state id="bookingCancelled" />
</flow>
5、Spring Web Flow流程定义文件:
<?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">
......</flow>
关于Spring Web Flow的定义文件,首先我们需要了解的是他们基于的XML模式与SPring容器配置文件完全不同。Spring配置文件被用来声明<bean>以及他们之 间的关系,Spring Web Flow定义文件声明的是流程的状态和过渡。
接下来定义一个流程变量,也就是保存上下文信息的bean,比如说建立的bean名称为:Student。
然后我们需要使用<var>元素在流程定义文件中声明它,
<var name="Student" class="XX.XX.Student" scope="flow"/>
注意scope属性被设置成flow。flow变量可以被声明存在四种不同范围中的一个范围中,四种范围如下:
Request、Flash、Flow、Conversation。
所有的流程都以start开始,end结束。
<start-state idref="......"/>
<end-state id="returnToIndex" view="login"></end-state>这个例子中我们要求流程向用户发送名为login的视图,这个逻辑视图将使用spring MVC视图解 析程序最终被映射到一个真实的视图实现。
spring MVC视图解析配置:
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/login/">
</property>
<property name="suffix" value=".jsp">
</property>
</bean>
这样login将被解析为/login/login.jsp中的真实视图实现。
我们还可以定义end状态从分支的新流程开始,如下:
<end-state id="returnToIndex" view="externalRedirect:servletRelative:login.do"></end-state>
所有流程只有一个start-state,但是可以由多个end-state。
6、<view-state>的view属性指定了要显示给用户的视图的逻辑名称。
<view-state id="demo1" view="../demo/demo2">
<transition on="confirm" to="orderConfirmed">
</transition>
</view-state>
confirm事件触发了一个到orderConfirmed状态的过渡。
如果orderConfirmed状态被定义为<action-state>,那么
<action-state id="orderConfirmed">
<action bean="StudentAction" />
<transition on="success" to="queryStudent" />
<transition on="error" to="login" /> <!-- success&error 对应action方法的result返回值-->
</action-state>
注:被<action>的bean属性所应用的bean必须实现Spring Web Flow的Action接口,并且Action接口唯一强制的方法是execute()方法。
StudentAction中获取前台的参数方法:context.getRequestParameters().get("XX");
如果StudentAction返回success时间来结束,那么将进行下一步操作queryStudent。如果以error结束,那么将跳转到login.jsp界面。
以上内容部分摘自spring in Action 一书。