实践指南
原文Q?A >Spring Web Flows - A Practical Guide
Author: Erwin Vervaet (Mail To)
translator: Dorian Shi (Mail To)
q篇文章介绍?Spring Web Flows。用实例来说明基?Web Flow 的原理。文章也提供了一个?Web Flow ?Spring 框架来构?Web 应用的实跉|?
假定读者已l了解一?J2EE Web 应用、XML、Spirng 框架Q当然还?Spring ?Web MVC 框架。你可以查看资源来了解这些信息?/P>
在一?Web 应用E序中传l的定义一个页面流E是一个一点也不直观的q程。像 Struts ?Spring q样的框架促使你把页面流E放q单独的控制器和视图中。D个例子:Struts 会把h映射C?Action。这?Action 会选择一个视囑ƈ转发到这个视图。虽然这是一个简单ƈ且实用的ҎQ但它有一个主要的~点Q到 Action 的定义文?struts-config.xml 中看看,Web 应用E序的所有页面流E一点也不清晰。因?Action 不能单的被重用,灉|性同样也会遭到损実?/P>
Spring Web MVC 框架提供了一个细微的高功能Q表单控制器执行一个预先定义好的工作流。有两种控制器提供了q一Ҏ:SimpleFormController ?AbstractWizardFormController。然?q些仍旧是一U一般化的硬~码的工作流概念?/P>
到这里就要引?Spring ?Web Flow 了。它允许你用清晰单的方式展现 Web 应用的页面流E。就像我们要看到的一P他有许多有点Q?/P>
现在 Web Flow 有够的能力表示׃pd State l成的一?Web 程?EM>State 是事件发生的程点:举例来说是昄一个视图或者执行一?Action。每?State 有一个或多个 transitions Q他们习惯于从一?State 转到另一?State 。一?transitions 被一?Event 所触发?Z让你?Web 程有一个大概的印象Q下面这D?XML 定义了一?Web 程Q大致等效于实现一?SimpleFormController 的工作流 。对于这?Web 程的原理将在本文的E后详细说明?/P>
熟悉业务q程理(BPM) 的读者将认识?Web 程是普通工作流的一个特例,所以他们在理论上可以用像 JBMP(h?A HREF="/dorian/admin/EditPosts.aspx#ResAndRef">资源) 来实C般化?BMP pȝ。既然简单是 Spring Web Flow 的重要设计目的,所以它不会M用这U一般化的工作流引擎。在我们 Web 应用中,我们会用一个简单的 Web 程来描qC个页面的程?/P>
本文的剩余部分会用一个实例来说明q方面内容,可以使用q个q接来下载源代码Q?A HREF="/Files/dorian/PhoneBook.war.zip">PhoneBook.war.zip 。现在下载ƈ解压~这个文件可能是个好注意Q它能够在你阅读文章的时候帮助你学习?/P>
实例是一个?Spring Web Flow 的电话簿应用E序Q我们将使用图解的方式来说明他的功能意图。这是一个典型的公司内网的应用程序,你会发现大部分功能可能你已经熟悉他的概念了。他主要允许你用一些标准来查找公司的某位职员。一旦当你发C某个适当ChQ你可以更q一步的查看他的信息Q像电话L、办公桌位置、他的经理是谁、他的同事有那些{等。图1的草图描l了q个电话应用程序的基本需求和面程?/P>
?1. 实例概览
像草图描述的那P应用E序实际有两个模块组? Search 模块允许我们查找一个我们要的hQ?Detail 模块则显C查扑ֈq个人的详细信息。Search 模块会使用 Detail 模块来显C查询结果中某h的详l信息。草囑hCZ我们可以在明l页直接讉K被查人同事的明细。这意味着 Detail 模块可以递归使用 Detail 模块来显C同事的明细?/P>
文章E后Q将看到我们可以在一个单独的 Web 程中定义各个模块。这意味着我们会有两个程Q一?Search 程和一?Detail 程?/P>
因ؓ本文的焦Ҏ实现应用E序?Web 接口Q所以我们将会提供包含了编码哑数据的基本业务层。领域对象被包含在com.ervacon.springframework.samples.phonebook.domain 包中。我们有 4 个业务类Q?
定好业务功能性后Q我们准备?Spring Web Flow 来ؓ电话应用程序开?Web 接口?/P>
在我们开始?Web Flow 之前Q我们需要配|一个基本的 Spring Web 应用E序。要做的W一件事是我们必ȝ定在 /WEB-INF/lib 目录下有我们所要的 jar 文g。一?Spring Web Flow 的应用程序需?个jar在类路进? 包含 Spring 框架自n?Spring.jar;包含 Web Flow 控制器实现的 webflow.jar; 记录日志所需?commons-logging.jar 和用来读取和分析 Web Flow XML 文g?jdom.jar;
׃q将是一个标准的 J2EE Web 应用E序,所以需要在 /WEB-INF 目录下有一?web.xml 部v文g。下面是此部|描q文件的代码Q它描述了如下事物:
?Spring MVC 应用E序中,我们需要一?Spring 应用E序上下文。它是你在应用程序上下文中定义业务对象最好的地方。这样你p够干净的区分你的业务对象和M Web 应用工g(artifacts)。让我们跟随q个l习创徏一?/WEB-INF/applicationContext.xml 文g来定义我们的业务门面QphoneBook Bean?/FONT>
我们需要在 web.xml 中适当的定?Dispatcher Servlet?q个 Servlet 会以默认得方式d /WEB-INF/ServletName-servlet.xml 配置文g。在我们的例子中会?/WEB-INF/phoneBook.xml。我们唯一需要配|的事是一?View Resolver。这?View Resolver 负责视囑(如:"criteria")解析成真实的视图路进(如:/WEB-INF/JSP/criteria.jsp)。下面这D用的?InternalResourceViewResolver?所以在我们的实例中Q所有页面的位置会?/WEB-INF/jsp 目录中?/FONT>
我们假设所有其他的 Dispatcher Servlet 配置为默认倹{这意味着我们用一个简单的 BeanNameUrlHandlerMapping 来定位将要处理请求的控制器。对于如何配|?Dispatcher Servlet 的详l信息请参?Spring 的参考文?查看资源)?/FONT>
待箋…?/FONT>