zoukankan      html  css  js  c++  java
  • Spring-webflow基础讲解

    什么是webflow:

      Spring Web Flow构建于Spring MVC之上,允许实现Web应用程序的“流程”。流程封装了一系列步骤,指导用户执行某些业务任务。它跨越多个HTTP请求,具有状态,处理事务数据,可重用,并且可能是动态的,并且本质上是长期运行的。

      Spring Web Flow的最佳位置是具有受控导航功能的有状态Web应用程序,例如办理登机手续,申请贷款,购物车结帐,甚至向表单添加确认步骤。这些场景的共同点是以下一个或多个特征:

    • 有一个明确的开始和结束点。
    • 用户必须按特定顺序浏览一组屏幕。
    • 直到最后一步,更改才会完成。
    • 一旦完成,就不可能意外地重复交易

    以上是Spring官网中给出的解释,我觉得也非常准确就直接引用一下~~

    如何在现有项目中引入webflow:

      1.添加相关依赖(因为webflow2.X版本是构建于SpringMVC之上的,所以请自行添加其余依赖)

    <dependencies>
        <dependency>
            <groupId>org.springframework.webflow</groupId>
            <artifactId>spring-webflow</artifactId>
            <version>2.4.5.RELEASE</version>
        </dependency>
    </dependencies>
    

      2.在已有的SpringMVC配置中引入如下配置:(如此处已引入过类似配置可忽略相关内容)

        <!-- 配置包扫描器 -->
        <context:component-scan base-package="*****"/>
        <!-- 配置注解驱动 -->
        <mvc:annotation-driven/>
        <import resource="webmvc-config.xml"/>
        <import resource="webflow-config.xml"/>
    

      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">
              <!--class="org.springframework.web.servlet.view.UrlBasedViewResolver">-->
            <property name="viewClass"
                      value="org.springframework.web.servlet.view.JstlView"/>
            <property name="prefix" value="/WEB-INF/views/"/>
            <property name="suffix" value=".jsp"/>
        </bean>
        <bean id="flowHandlerMapping" class="org.springframework.webflow.mvc.servlet.FlowHandlerMapping">
            <property name="flowRegistry" ref="flowRegistry"/>
            <property name="defaultHandler">
                <!-- UrlFilenameViewController 会将 "/index" 这样的请求映射成名为 "index" 的视图 -->
                <bean class="org.springframework.web.servlet.mvc.UrlFilenameViewController" />
            </property>
        </bean>
        <bean id="flowHandlerAdapter" class="org.springframework.webflow.mvc.servlet.FlowHandlerAdapter">
            <property name="flowExecutor" ref="flowExecutor"/>
        </bean>
    </beans>
    

      webflow-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: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">
        <!-- 装配流程执行期:为用户创建和启动一个流程执行实例,不负责加载流程定义-->
        <webflow:flow-executor id="flowExecutor" />
        <!-- 配置流程注册表,其功能为:负责加载流程定义-->
        <!-- 所有 flow的定义文件它的位置在这里进行配置, flow-builder-services 用于配置 flow 的特性 -->
        <webflow:flow-registry id="flowRegistry" flow-builder-services="flowBuilderServices">
            <webflow:flow-location path="/WEB-INF/flows/shopping.xml" id="index" />
            <webflow:flow-location path="/WEB-INF/flows/test.xml" id="test" />
            <webflow:flow-location path="/WEB-INF/flows/shopping-sub.xml" id="subflow"/>
            <!-- 在这个声明中,流程注册表会在该path下查找流程定义-->
        </webflow:flow-registry>
        <!--Web Flow 中的视图通过 MVC 框架的视图技术来呈现 -->
        <webflow:flow-builder-services id="flowBuilderServices" view-factory-creator="mvcViewFactoryCreator" />
        <!-- 指明 MVC 框架的 view resolver ,用于通过 view 名查找资源 -->
        <bean id="mvcViewFactoryCreator" class="org.springframework.webflow.mvc.builder.MvcViewFactoryCreator">
            <property name="viewResolvers" ref="viewResolver" />
        </bean>
    </beans>
    

      shopping.xml:

    <?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">
        <!-- view-state中的view对应views文件夹中的jsp页面,on是触发事件,to对应state id -->
        <!-- 流程开始前的初始化工作 -->
        <on-start>
            <evaluate expression="initData"></evaluate>
        </on-start>
        <view-state id="hello" view="hello">
            <transition on="viewCart" to="viewCart"></transition>
        </view-state>
        <!-- 根据排在第一位的顺序来执行 -->
        <view-state id="viewCart" view="viewCart">
            <transition on="submit" to="viewOrder"></transition>
            <transition on="confirm" to="login"></transition>
        </view-state>
    
        <action-state id="login" >
            <evaluate expression="loginAction"/>
            <transition on="success" to="orderConfirmed"></transition>
            <transition on="error" to="returnToIndex"></transition>
        </action-state>
    
        <view-state id="viewOrder" view="viewOrder">
            <transition on="confirm" to="orderConfirmed">
            </transition>
        </view-state>
        <view-state id="orderConfirmed" view="orderConfirmed">
            <transition on="returnToIndex" to="returnToIndex"></transition>
            <transition on="dataCheck" to="dataCheck"></transition>
        </view-state>
        <!-- 本流程中的数据流转 -->
        <action-state id="dataCheck">
            <evaluate expression="dataCheck"></evaluate>
            <transition on="success" to="subflow"></transition>
        </action-state>
        <!-- 创建一个子流程 -->
        <subflow-state id="subflow" subflow="subflow">
            <transition on="returnshopping" to="returnToIndex"></transition>
        </subflow-state>
    
        <end-state id="returnToIndex" view="index">
        </end-state>
    
        <!-- 全局流程变量 -->
        <global-transitions>
            <transition on="returnToIndex" to="returnToIndex"></transition>
        </global-transitions>
    </flow>
    

      以上配置为我的实验项目的具体配置,关于(webmvc-config.xml,webflow-config.xml)中的内容已给出相应注释,只特别说明一点:

    <webflow:flow-location path="/WEB-INF/flows/shopping.xml" id="index" />
    

      这个配置中的id为项目的访问路径,以上配置的访问路径类似:localhost:8080/***/index(项目也将从这个访问路径进入webflow流程)

    webflow的核心参数:

      在开始介绍流程之前我们需要先知道webflow中存在两大核心参数:

      1.execution:此参数用于指定一个唯一的流程实例,在页面提交时此处的值可以直接通过${flowExecutionKey}获得

      2._eventId:此参数用于确定页面的跳转关系,对应shopping.xml中on属性中的值

      3.flowExecutionUrl:在提交的时候可以直接使用此参数作为form表单中action的值:${flowExecutionUrl}

      上述的1,2参数是使用webflow框架在页面提交请求的时候必须带回的参数

    webflow的流程定义:

      在介绍完webflow的基础定义与简单配置之后,接下来将着重为大家介绍webflow的流程定义(shopping.xml)文件(如上文我配置中引入的其他流程定义与之类似不做重复介绍)

      常用标签:

      on-start:此标签的作用是在流程启动执行前,先执行的内容(可以用于初始化一些业务所需的数据)

        evaluate:

          expression:此处的值为对应的bean(该bean需 extends AbstractAction),实现 doExecute 方法(此方法即为初始化方法)

      view-state:此标签用于指定对应的视图页面

        id:指代当前标签

        view:指代视图名称(如不添加veiw属性,该值默认=id)

        transition:

          on:对应_eventId的值,表明触发事件

          to:该触发事件所对应的动作,一般为需要执行的标签id

      action-state:于view-state类似,不同之处在于此标签对应的是JavaBean(相关属性参照上文标签)

      subflow-state:用于定义当前流程的子流程

        id:指代当前子流程

        subflow:指代子流程名字,需对应webflow-config中webflow:flow-location所添加的子流程的id

      end-state:流程结束标签

      global-transitions:用于指定全局的流程变量,即:在流程中任意位置触发当前_eventId,均会进入对应to的位置

      最后提醒一点的是:webflow的流程定义文件中的配置为顺序执行(哪个标签配置在最前面,流程会优先进入该标签,之后的根据流转规则执行)

    webflow的数据:

      在webflow中关于数据的业务需要,给出了不同的数据存储位置,常用储存位置如下:

      1.FlowScope:放在此处的数据仅在当前流程中可见,随着当前流程的销毁而销毁(子流程中不可见)

      2.ConversationScope:放在此处的数据为最顶层流程与所有子流程共享数据,在整个业务流程结束后销毁(子流程可见)

      3.RequestScope:放在此处的数据仅存在于当前请求中,随着当前请求的结束而销毁。

      4.FlashScope:放在此处的数据为当前流程共享,但是会随着视图解析而销毁。

      5.ViewScope:放在此处的数据仅在当前视图状态可见

      数据存储与取值方式:context.getFlowScope().put() context.getFlowScope().get()

    尾声:

      介绍到这里,webflow的基础知识就已经介绍完毕啦,个人的总结就是webflow在某些特定的场合下确实比MVC的方式,在项目代码结构看起来更清晰明了,但也存在一些天然缺陷(没有MVC那么自由),webflow的流程自由是配置时候的流程自由,在配置好之后就是固定的啦。(当然,这本来也是这个框架的定位!)现在webflow的官网中对于webflow的流程定义给出了很多实用的标签和属性(如解决页面弹框等问题)如果对这一块感兴趣的朋友可以参见官网继续学习~~

      最后附上两个链接吧:

      1.spring-webflow官网:https://projects.spring.io/spring-webflow/

      2.本文档相关实践项目:https://github.com/ksuth/Study.git

        

    个人推广

      说明:为了养家糊口~~~

      Ps  : 1.接Java项目开发(联系方式:QQ:894197387;微信:15730195706)

          2.如果您觉得本文对您有帮助,欢迎点赞,评论,感谢打赏~

        

        

  • 相关阅读:
    写Log日志的方法 减少插件引用
    操作文件常用的方法
    Git常用命令
    JS
    js
    BUG++
    mysql点滴记录 二 (MySql经典练习题)
    mysql点滴记录 一 (创建表结构 & 构建测试数据)
    TCPDF
    Docker-命令
  • 原文地址:https://www.cnblogs.com/shuyuq/p/9729791.html
Copyright © 2011-2022 走看看