SpringWeb Flow 2.0 入门
简介:本教程分析了Spring Web Flow 2.0 的技术要点,并且通过创建一个示例应用程序,展示了Spring Web Flow 2.0 的基本知识。
标记本文!
发布日期:  2008 年8 月28 日
级别:中级
开始之前
关于本教程
本教程通过一个简化的购物车应用,介绍了如何使用Spring Web Flow 2.0 来构建Web 应用程序。本教程以讲解实例为主,为了读者更好地理解Spring Web Flow ,也有部分理论的解释。
回页首
先决条件
本教程要求读者具备Java Web 应用的基本知识、熟悉Spring Framework 的应用。
回页首
系统要求
运行本教程中的示例,需要下列工具:
l JDK 1.6.0+
l Spring Framework 2.5.4+ 及其依赖项
l Spring Web Flow 2.0.2
l Tomcat 6.0.0+ (为支持EL ,Tomcat 须6.0 及以上版本)
l eclipse 3.2.2+
Spring Web Flow 2.0 概述
Spring Web Flow 2.0 新特性
Spring Web Flow 是Spring 的一个子项目,其最主要的目的是解决跨越多个请求的、用户与服务器之间的、有状态交互问题。最新版本为  2.0 ,相比于1.x 版的Spring Web Flow ,有以下几个值得注意的新特性。
l与Spring MVC 深度整合
Spring Web Flow 1.x 是个自成体系的框架,可与Spring Web MVC 、Struts 、JSF 等Web 框架整合。最新的Spring Web Flow 2.0 则明确声明是基于Spring Web MVC 的一个扩展。
spring framework开发参考手册l提供了处理Ajax 事件的能力
Ajax 事件的处理与Web Flow 事件的处理相一致,在处理完成后,flow 即可刷新客户端相关界面代码。
l与JSF 整合
通过将JSF 层层包装,最终可在Spring Framework 和Spring Web Flow 中使用JSF 的各种组件。
l与Spring Security (原Acegi Security )整合
只需将某个flow 声明为“secured ”,即可利用Spring Security 来确定当前用户是否有权限运行flow 、激发事件等等。
l更简洁的配置
官方的数据说同一个flow ,2.0 版的配置比1.x 版的配置少50% 的XML 代码。
l重用更方便
Spring Web Flow 2.0 提供了flow 的继承,重用即有的flow 代码更加容易。
l重用更方便
Spring Web Flow 2.0 提供了flow 的继承,重用即有的flow 代码更加容易。
回页首
本教程的说明
本教程主要讨论Web Flow 模块的使用,对其他的特性没有涉及。
购物车用例
要了解Spring Web Flow 是什么东西,最好的办法莫过于查看示例,图2 展示了一个简化的购物车的流程。
图  1 购物车示例
图  2 所示流程用Spring Web Flow 2.0 的配置文件表示如下:
清单1 用Spring Web Flow 语义表达购物车流程
……
<flow>
<view-state id="viewCart">
<transition on="submit" to="viewOrder"/>
</view-state>
<view-state id="viewOrder">
<transition on="confirm" to="viewConfirmed"/>
</view-state>
<view-state id="viewConfirmed">
<transition on="returnToIndex" to="returnToIndex"/>
</view-state>
<end-state id="returnToIndex"/>
</flow>
清单1 省略了许多技术细节,展示的只是一个业务的流程,主要是为了让大家对Spring Web Flow 的语
义有个初始的印象。从清单1 中,应注意到一个很重要的特征——Spring Web Flow 语义与Servlet API 无关。更确切地讲,Spring Web Flow 语义关注的是业务的流程,并未与Sun 公司的Web 规范紧密结合,这种描述是更高层次的抽象,差不多是在建模的角度来描述业务流程。
不过,Spring Web Flow 也并非只有抽象,现在还没有哪一种工具或语言可以将一个模型直接转换成相应的应用程序。Spring Web Flow 更像是抽象建模和技术细节的混血儿,相比于湮没在繁多的控制器和视图中的Web MVC 应用来讲,Spring Web Flow 提供了如清单1 所描述的更高层次的抽象,但同时它也整合了像Unified EL 这样的工具来控制技术上的细节。
Spring Web Flow 的基本元素
Flow 可看作是客户端与服务器的一次对话(conversation )。Flow 的完成要由分多个步骤来实现,在Spring Web Flow 的语义中,步骤指的就是state 。Spring Web Flow 提供了五种state ,分别是Action State 、View State 、Subflow State 、Decision State 、End State ,这些state 可用于定义flow 执行过程中的各个步骤。除了End State 外,其他state 都可以转换到别的state ,一般通过在state 中定义transition 来实现到其他state 的转换,转换的发生一般由事件(event )来触发。
什么情况下可以使用Spring Web Flow?
前面讲了,Spring Web Flow 提供了描述业务流程的抽象能力,但对一种Web 开发技术而言,仅有这些是不够的。同时,Spring Web Flow 是不是能够取代其他Web MVC 技术?或者在任何情况下都应优先使用Spring Web Flow ?要回答这些问题,先来看一下Spring Web Flow 所着力解决的技术问题。
Web 应用程序的三种范围
Java Servlet 规范为Web 应用程序中用到的各种对象规定了三种范围(scope ),分别是request 范围、session 范围和application 范围。
l request 范围中的对象是跟客户的请求绑定在一起的,每次请求结束都会销毁对象,而新的请求过来时又会重新创建对象。request 范围适合存放数据量较大的临时数据。
l session 范围中的对象是跟会话(session )绑定在一起的,每次会话结束会销毁这些对象,而新的会话中又会重新创建。HTTP 协议本身是无状态的,服务器和客户端要实现会话的管理,只能借助于一些辅助的手段,如在协议的数据包中加一些隐藏的记号,等等。session 范围适合存放本次会话需要保留的数据。
l application 范围的对象是跟应用程序本身绑定在一起,从Servlet API 的角度来讲,就是存放在ServletContext 中的对象,它们随着Servlet 的启动而创建,Servlet 关闭时才会销毁。application 范围适合存放那些与应用程序全局相关的数据。
现实开发中最令人头痛的莫过于session 范围,Java Servlet 规范指明可在l 中按如下方式配置session 的有效时间为100分钟:
清单l 中session 的配置
<session-config>
<session-timeout>100</session-timeout>
</session-config>
然而,现实中的session 范围更像是“鸡肋”,把大量数据放入session 会导致严重的效率问题,在分布式的环境中处理session 范围更是一不小心就会出错,但抛弃session 又会给开发带来许多不便。request 范围虽说能存放量大的数据,但有效范围有限。摆在开发者面前的很多用例都要求一种比request 范围要长,但又比session 范围要短的这么一种有效范围。
回页首
Spring Web Flow 的解决方案
针对Java Servlet 规范中的这个缺陷,Spring Web Flow 2.0 中提供了以下两种范围:
l flow 范围。此范围内的对象在flow 开始时创建,flow 结束时销毁,在flow 定义文件中可通过“flowScope ”变量名来访问。
l conversation 范围。此范围内的对象与flow 范围对象基本相似,唯一不同在于conversation 范围内的对象所在的flow 如果调用了其他subflow ,那么在subflow 中也可访问该对象。
subflow 定义
被其他flow 所调用的flow 即可称为subflow。
由于flow 是由开发人员自己定义的,可根据业务的需求自由改变,flow 范围和conversation 范围的使用也就突破了Java Servlet 规范中session 范围和request 范围的局限,真正做到了自由定制。
回页首
并非所有情形都适用 Spring Web Flow
可以看出, Spring Web Flow 所着力解决的问题即是客户端与服务器的对话( conversation )问题,这个范围比 request 要长,而比 session 要短。为实现 conversation 范围(即 flow 范围),需要付出效率上的代价,因此,并非所有 Web 应用都适合使用 Spring Web Flow 。 Seth Ladd 等人所著 Expert Spring MVC and Web Flow  一书,对何时使用Spring Web Flow ,列出了如下表格。
表 1 何时使用 Spring Web Flow
回页首
Spring Web Flow 的其他特点
Web Flow 作为一个单独的概念被提出来,也可算是 Spring Web Flow 的一大亮点。目前大多数 Web MVC 框架都把重点把在各种 controller 和形形的 view 技术上面,对 Web 应用流程本身的关注是不够的, Web Flow 的提出就提供了一层抽象,设计者就可以从 Web Flow 抽象层面来进行设计、开发。当然, Web Flow 不能理解为只是 Web 页面间的跳转流程,定义 Spring Web Flow 的语义并非只限于页面之间的跳转,而可以是 Web 应用中的各种行为。由此,用例的模型建构好以后,就可直接从该模型转换到相应的 Web Flow ,开发人员的设计变得更加直观、有效。
另外,在 Spring Web Flow 中重用 Web Flow 是比较容易的。在定义 flow 、 state 时可通过继承某个已有的 flow 或 state ,来避免重复定义。同时,一个 flow 可以调用其它 flow ,就跟一般程序语言中在某个函数内部调用其它函数一样方便。
配置 Spring Web MVC
Spring Web Flow 2.0 就是 Spring Web MVC 的一个扩展,如果粗略一些来讲,所谓 flow 就相当于 Spri
ng Web MVC 中一种特殊的 controller ,这种 controller 可通过 XML 文件加以配置,因此在使用 Spring Web Flow 2.0 前须先对 Spring Web MVC 进行配置,步骤如下:
l
创建 Web 应用的目录结构  l
在 /WEB-INF/lib 下导入相关类库  l
在 Web 应用部署描述符文件 l 中声明 DispatcherServlet 并指定配置文件  l
添加 DispatcherServlet 映射  l
创建 l 文件  l
创建 l 文件  l 创建 index.jsp  解决方案
何时使用 Spring MVC Controller
某个单独的、只需较少业务逻辑就可创建的页面,同时该页面不是 flow 的一部分 Spring MVC SimpleFormController
某个只涉及表单提交的页面,如一个搜索框 Spring MVC
AbstractWizardFormController
由一系列导航页面组成的业务过程 Spring Web Flow
任何比较复杂的、有状态的、需要在多个页面之间跳转的业务过程

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。