Webflow流量位置按URI?

时间:2015-04-02 11:28:43

标签: spring-webflow spring-webflow-2

我有一个Spring MVC应用程序,它当前使用SimpleUrlHandlerMapping来集成多个webflow。 bean定义看起来像这样:

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
        <props>
            <prop key="/process1/reservation.html">flowController</prop>

            <prop key="/process2/reservation.html">flowController</prop>
        </props>
    </property>
    <property name="order" value="0"/>
    <property name="alwaysUseFullPath" value="true" />
</bean>

我需要做的是根据URI决定执行哪个Web流。定义的其余部分如下所示:

<bean id="flowController" class="org.springframework.webflow.mvc.servlet.FlowController">
    <property name="flowExecutor" ref="flowExecutor"/>
</bean>

<flow:flow-executor id="flowExecutor" flow-registry="flowRegistry">
    <flow:flow-execution-listeners>
        <flow:listener ref="flowExecutionListener" />
    </flow:flow-execution-listeners>    
</flow:flow-executor>

<flow:flow-registry id="flowRegistry" flow-builder-services="flowBuilderServices" >
    <flow:flow-location id="process1Reservation" path="/WEB-INF/flows/path/to/process1/reservationFlow.xml" />
    <flow:flow-location id="process2Reservation" path="/WEB-INF/flows/path/to/process2/reservationFlow.xml" />
</flow:flow-registry>

因此,当我使用以下URL时,我希望执行第一个流程:

http://me.com/application/process1/reservation

(和第二个流程类似)。

我是否过于复杂?我不想创建id为&#34; process1Reservation&#34;的定义。如果我可以避免这样做。

谢谢,

杰森

1 个答案:

答案 0 :(得分:2)

首先,您可以添加通配符模式以指示(流位置模式),该模式将创建有关如何注册流的规则。这将使您能够使用1个规则注册多个流,而不是手动对每个流进行硬编码。 (注意:以下是非官方的#34;标准和最佳实践&#34;注册流程的方式)

<!-- The registry of executable flow definitions --> 
    <webflow:flow-registry id="flowRegistry" base-path="/WEB-INF/flows" flow-builder-services="flowBuilderServices">
        <webflow:flow-location-pattern value="/**/*-flow.xml" />
    </webflow:flow-registry>

所以上述规则规定:

  1. 开始在/WEB-INF/flows目录中扫描(确保它存在)
  2. 对于任何子目录,查找具有后缀-flow.xml
  3. 的任何文件
  4. 对于每个匹配注册,此流程将转至flow-registry
  5. 执行此操作后,您可以通过应用程序中任何位置映射到的URL导航到已注册的流。

    使用您的示例流程:

    /WEB-INF/flows/path/to/process1/reservation-flow.xml   // note: ends in "-flow.xml"
    

    可通过以下的http get请求访问:

    http://(my-web-server-ip):(port)/path/to/process1
    

    注意:&#34;流&#34;未包含在网址路径中,因为我们将其设置为流注册表定义中的base-path="/WEB-INF/flows"属性的一部分并注意在请求中根本没有使用流文件名,只有流中定义的目录)

    ------------------- 现在回答问题 ---------------- ----------------

    我只想创建一个重定向到所需流的MVC控制器。这是一个粗略的例子:

    @RequestMapping(value = "/decideWhichFlow/{someUrlVal}", method = RequestMethod.GET) 
    public String decideWhichFlow(@PathVariable String someUrlVal) {
    
        String flowName = null;
    
        // exec some logic to decide which flow to use based on "someUrlVal" passed via url
        if(someUrlVal.equalsIgnoreCase("1"))
            flowName = "process1";
        else 
            flowName = "process2";
    
        String redirectToFlow = "redirect:/path/to/" + flowName ;
    
        return redirectToFlow;  
    }
    

    此外,您还可以创建一个名为&#34; process&#34;可以执行决策状态&#34;根据一些请求Params决定调用哪些子流(subflow1,subflow2等等),但这可能是过度的。我认为MVC控制器解决方案要简单得多。

    此外,流程名称&#34; process1&#34;,&#34; process2&#34;永远是静止的。我不明白为什么需要增加名字?如果增量在您的应用程序中具有特殊含义并用于处理逻辑,那么您可以将其作为流中的请求参数传递,而不是使其成为流名称的一部分。如果流程代表不同的逻辑/流程,我会给它们更有意义的名称(例如processReservation)。与命名pojo类属性没什么不同。该名称仅用于清楚该过程的基本功能。