我有一个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;的定义。如果我可以避免这样做。
谢谢,
杰森
答案 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>
所以上述规则规定:
/WEB-INF/flows
目录中扫描(确保它存在)-flow.xml
执行此操作后,您可以通过应用程序中任何位置映射到的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类属性没什么不同。该名称仅用于清楚该过程的基本功能。