`
yangzb
  • 浏览: 3502405 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring Web Flow 2.0 入门

阅读更多

Spring Web Flow 2.0 概述

Spring Web Flow 2.0 新特性

Spring Web Flow 是 Spring 的一个子项目,其最主要的目的是解决跨越多个请求的、用户与服务器之间的、有状态交互问题。最新版本为 2.0 ,相比于 1.x 版的 Spring Web Flow ,有以下几个值得注意的新特性。

  • 与 Spring MVC 深度整合

    Spring Web Flow 1.x 是个自成体系的框架,可与 Spring Web MVC 、 Struts 、 JSF 等 Web 框架整合。最新的 Spring Web Flow 2.0 则明确声明是基于 Spring Web MVC 的一个扩展。

  • 提供了处理 Ajax 事件的能力

    Ajax 事件的处理与 Web Flow 事件的处理相一致,在处理完成后, flow 即可刷新客户端相关界面代码。

  • 与 JSF 整合

    通过将 JSF 层层包装,最终可在 Spring Framework 和 Spring Web Flow 中使用 JSF 的各种组件。

  • 与 Spring Security (原 Acegi Security )整合

    只需将某个 flow 声明为“ secured ”,即 可利用 Spring Security 来确定当前用户是否有权限运行 flow 、激发事件等等。

  • 更简洁的配置

    官方的数据说同一个 flow , 2.0 版的配置比 1.x 版的配置少 50% 的 XML 代码。

  • 重用更方便

    Spring Web Flow 2.0 提供了 flow 的继承,重用即有的 flow 代码更加容易。

  • 重用更方便

    Spring Web Flow 2.0 提供了 flow 的继承,重用即有的 flow 代码更加容易。

 

购物车用例

要了解 Spring Web Flow 是什么东西,最好的办法莫过于查看示例,图 2 展示了一个简化的购物车的流程。

图 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 范围。

  • request 范围中的对象是跟客户的请求绑定在一起的,每次请求结束都会销毁对象,而新的请求过来时又会重新创建对象。 request 范围适合存放数据量较大的临时数据。
  • session 范围中的对象是跟会话( session )绑定在一起的,每次会话结束会销毁这些对象,而新的会话中又会重新创建。 HTTP 协议本身是无状态的,服务器和客户端要实现会话的管理,只能借助于一些辅助的手段,如在协议的数据包中加一些隐藏的记号,等等。 session 范围适合存放本次会话需要保留的数据。
  • application 范围的对象是跟应用程序本身绑定在一起,从 Servlet API 的角度来讲,就是存放在 ServletContext 中的对象,它们随着 Servlet 的启动而创建, Servlet 关闭时才会销毁。 application 范围适合存放那些与应用程序全局相关的数据。

现实开发中最令人头痛的莫过于 session 范围, Java Servlet 规范指明可在 web.xml 中按如下方式配置 session 的有效时间为100分钟:


清单 2 web.xml 中 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 中提供了以下两种范围:

  • flow 范围。此范围内的对象在 flow 开始时创建, flow 结束时销毁,在 flow 定义文件中可通过“ flowScope ”变量名来访问。
  • 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 MVC Controller 某个单独的、只需较少业务逻辑就可创建的页面,同时该页面不是 flow 的一部分
Spring MVC SimpleFormController 某个只涉及表单提交的页面,如一个搜索框
Spring MVC AbstractWizardFormController 由一系列导航页面组成的业务过程
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 就相当于 Spring Web MVC 中一种特殊的 controller ,这种 controller 可通过 XML 文件加以配置,因此在使用 Spring Web Flow 2.0 前须先对 Spring Web MVC进行配置,步骤如下:

  • 创建 Web 应用的目录结构
  • 在 /WEB-INF/lib 下导入相关类库
  • 在 Web 应用部署描述符文件 web.xml 中声明 DispatcherServlet 并指定配置文件
  • 添加 DispatcherServlet 映射
  • 创建 web-application-config.xml 文件
  • 创建 webmvc-config.xml 文件
  • 创建 index.jsp

创建 Web 应用的目录结构

本 示例应用将采用 eclipse Dynamic Web Project 向导默认生成的目录结构,在 WEB-INF 目录下添加 config 和 flows 子目录,其中 config 子目录用来存放各种配置文件, flows 子目录下存放 Spring Web Flow 的定义文件。最后目录如图3所示:


图 2 目录结构
目录结构




回页首


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

只需将以下几个 jar 包导入 /WEB-INF/lib 目录下就可以了:

  • commons-logging.jar
  • jstl.jar
  • standard.jar
  • spring-webmvc.jar
  • spring.jar

 




回页首


声明 DispatcherServlet 并指定配置文件

为使用 Spring Web MVC ,须在 web.xml 中声明 DispatcherServlet ,见清单3:


清单 3 声明 DispatcherServlet 和指定配置文件

<servlet>
  <servlet-name>CartServlet</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>





回页首


添加 DispatcherServlet 映射

要让 DispatcherServlet 处理所有以 /spring/ 开头的请求,见清单 4:


清单 4 web.xml 中的 DispatcherServlet映射

<servlet-mapping>
<servlet-name>CartServlet</servlet-name>
<url-pattern>/spring/*</url-pattern>
</servlet-mapping>





回页首


创建 web-application-config.xml

开 发基于 Spring Web Flow 的应用往往会有大量的配置,这些配置全放在一个文件中是不合适的。本示例参考 Spring Web Flow 2.0 自带示例,将不同功能的配置文件分开。其中 web-application-config.xml 用于配置与 Web 应用全局相关的内容, Spring Web MVC 的相关配置放在 webmvc-config.xml 中,教程后面要添加的 Spring Web Flow 的配置则放在 webflow-config.xml 中。在 web-application-config.xml 中用 import 元素导入其他的配置文件。 web-application-config.xml的内容见清单5:


清单 5 web-application-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:context="http://www.springframework.org/schema/context"
  xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
	http://www.springframework.org/schema/context 
	http://www.springframework.org/schema/context/spring-context-2.5.xsd">
	<!-- 搜索 samples.webflow 包里的 @Component 注解,并将其部署到容器中 --> 
	<context:component-scan base-package="samples.webflow" /> 
	<!-- 启用基于注解的配置 --> 
	<context:annotation-config /> 
	<import resource="webmvc-config.xml"/>
</beans>

 

加入注解功能是出于最后运行 Web Flow 示例的需要,在这里只要知道注解功能已被启用就可以了。

 




回页首


创建 webmvc-config.xml

webmvc-config.xml 主要用于配置 Spring Web MVC 。所要做的就是添加一个 view resolver (视图解析器),用于将视图名解析成真实的视图资源。另外,再配置好 URL 请求的 handler (处理器),用于将 URL 请求定向到某个控制器,在本例中,用到的是 UrlFilenameViewController。


清单 6 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 name="prefix" value="/WEB-INF/jsp/"/> 
	  <property name="suffix" value=".jsp"/> 
	</bean> 
	<bean id="viewMappings" 
	  class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
	  <property name="defaultHandler">
	  <!-- UrlFilenameViewController 会将 "/index" 这样的请求映射成名为 "index" 的视图 --> 
	  <bean class="org.springframework.web.servlet.mvc.UrlFilenameViewController" /> 
	</property> 
  </bean>
</beans>





回页首


创建 index.jsp

现在的 index.jsp 只是显示一行文字。


清单 7 index.jsp

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Cart Application</title>
  </head>
  <body>
    <h1>Hello!</h1>
  </body>
</html>





回页首


运行应用程序

将 应用程序发布到 Tomcat 容器,再通过 http://localhost:8080/CartApp/spring/index.jsp 访问 index.jsp 页面(应用程序所在文件夹名是 CartApp ),测试 Spring Web MVC 配置是否正确。如果一切正常,可得到如下页面:


图 3 显示结果
显示结果

分享到:
评论
1 楼 qwfys200 2017-05-27  
总结的不错。

相关推荐

    Spring Web Flow 2.0 入门 例子

    **Spring Web Flow 2.0 入门指南** Spring Web Flow 是一个用于构建高度交互式Web应用程序的框架,它专注于管理用户会话的状态和流程控制。这个框架在Spring MVC之上提供了一种更高级的方式来处理复杂的用户导航...

    spring webflow 2.0所有最新开发包及文档和用例

    下面我们将深入探讨Spring Webflow 2.0中的关键知识点。 首先,**流程建模**是Spring Webflow的核心。它允许开发者通过XML定义流程图,描述用户与应用之间的交互过程。流程图包含了活动(如视图状态和动作状态)、...

    spring web flow demo

    Spring Web Flow 2.0 入门 本教程分析了 Spring Web Flow 2.0 的技术要点,并且通过创建一个示例应用程序,展示了 Spring Web Flow 2.0 的基本知识。 开始之前 关于本教程 本教程通过一个简化的购物车应用,介绍了...

    Spring Web Flow 2小教程

    ### Spring Web Flow 2.0 入门指南 #### 一、Spring Web Flow 2.0 概览 Spring Web Flow (SWF) 是Spring框架下的一个子项目,旨在简化Web应用程序中的工作流程管理和状态管理。它特别适用于处理复杂的用户交互场景...

    Spring_Web_Flow_2[1].0_入门.pdf

    ### Spring Web Flow 2.0 入门指南 #### 一、Spring Web Flow 简介 Spring Web Flow 是 Spring 框架的一个子项目,主要用于处理 Web 应用程序中的流程控制。它解决了跨多个请求的用户与服务器之间有状态交互的问题...

    spring mvc 教程

    **三、Spring Web Flow 2.0 入门指南** - **环境搭建**:要运行Spring Web Flow 2.0示例应用,需要准备JDK 1.6及以上版本、Spring Framework 2.5.4及以上版本、Spring Web Flow 2.0.2版本、Tomcat 6.0及以上版本...

    spring webflow入门基础

    ### Spring Webflow 入门基础 #### 购物车用例 首先,我们通过一个购物车用例来深入理解Spring Web Flow的应用场景及其优势。购物车作为一个典型的电子商务应用场景,涉及用户选择商品、查看购物车内容、确认订单...

    spring web flow完整的实例代码

    这里面是纯代码,过程的话可以对应Spring_Web_Flow_2.0_入门.pdf这个文档来看

    spring-framework-2.0-m1-with-dependencies.zip

    "spring-framework-2.0-m1-with-dependencies.zip"是该版本的一个早期里程碑版本,包含了所有依赖,便于开发者快速入门和项目部署。 1. **IoC(Inversion of Control)容器**: Spring的核心是IoC容器,它负责管理...

    SWF2入门(一)

    本教程通过一个简化的购物车应用,介绍了如何使用 Spring Web Flow 2.0 来构建 Web 应用程序。本教程以讲解实例为主,为了读者更好地理解 Spring Web Flow ,也有部分理论的解释。详细参考...

    DWR2.0中文文档

    DWR2.0中文文档不仅是一份详尽的指南,更是深入理解DWR框架及其在各种Web应用框架中应用的关键。通过本书的学习,开发者能够掌握DWR的基本概念、配置方法以及与主流Web框架的整合技巧,为构建高效、安全的Ajax应用...

    DWR中文文档v0.9

    - **4.5 DWR与Weblogic或PageFlow** - 指导如何在Weblogic服务器或PageFlow环境中部署DWR。 - **4.6 DWR与Hibernate** - **4.6.1 让DWR和Hibernate一起工作的检查列表** - 列举了确保DWR和Hibernate兼容性的关键...

    [1分]activity 5.16中文用户手册,非常实用

    - **顺序流(Sequence Flow):** 连接不同元素的线,表示执行顺序。 #### 八、表单 ##### 8.1 表单属性 - **表单字段:** 定义表单的输入输出字段。 ##### 8.2 外置表单的渲染 - **使用Activiti提供的表单渲染工具...

    AJAX学习资料之-DWR中文手册

    随着Web 2.0技术的兴起,Ajax作为一种重要的前端技术受到了广泛关注。它不仅提升了用户体验,还简化了开发过程。对于想要深入了解Ajax及其相关技术的开发者而言,《AJAX学习资料之-DWR中文手册》提供了一个很好的...

    dwr基础学习书籍新手必备

    本书《DWR中文文档v0.9DWR2.0》由方佳玮编著,旨在为新手提供从入门到实践的完整指南。书中不仅包含了DWR的基本概念、远程方法调用、用户界面组件介绍,还提供了搭建DWR开发环境的步骤和快速开发实例。 #### 二、...

    JBPM工作流开发指南 .zip

    - **组件**:主要包括jbpm-flow(流程引擎)、jbpm-gwt-console(Web管理控制台)、jbpm-persistence(持久化支持)、jbpm-human-task(人任务处理)等核心组件。 2. **流程建模** - **BPMN 2.0**:JBPM支持...

    Activiti 5.4 用户指南

    - **web应用程序中的工作流引擎**:说明如何将Activiti集成到Web应用中。 - **流程虚拟机(PVM)API**:提供了对流程执行的底层控制。 - **表达式**:介绍了在Activiti中使用表达式的细节。 #### 六、部署 - **业务...

Global site tag (gtag.js) - Google Analytics