Spring Web Flow请求映射

问题描述:

我将Spring Web Flow 2添加到当前未使用Spring MVC或Web Flow的非常大的现有Web应用程序中。我的任务是通过访问mySite.com/flows触发Web Flow,并且遇到困难。我的方法是设置DispatcherServlet,映射为/flows/*,将Web Flow映射到/flows。这里是我的web.xml在DispatcherServlet的配置:Spring Web Flow请求映射

<servlet> 
    <servlet-name>flow</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/spring/flowContext.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>flow</servlet-name> 
    <url-pattern>/flows/*</url-pattern> 
</servlet-mapping> 

我尝试了好几种方法来获取Web Flow的映射到/flows。我的第一次尝试是使用流动的注册表与base-path设置:

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

我的理解是,这将采取/WEB-INF/app/flows内的文件夹结构创建请求映射。我的第一个测试是在名为booking/WEB-INF/app/flows/booking)的子文件夹内添加我的流程booking-flow.xml。而且,太棒了! - 它按预期工作。我能够从mySite.com/flows/booking访问流程。好的,但我不想在网址中使用/booking,所以我将booking-flow.xmlbooking文件夹中移出,并直接输入WEB-INF/app/flows,并且希望能为我工作,但它不会 - 我不认为流映射在所有。

有谁知道我可以如何将流映射到DispatcherServlet映射的根,还是有更好的方法来处理这个问题?我不希望DispatcherServlet在我的应用程序中处理/flows以外的任何请求。仅仅是我,还是Spring Web Flow上的文档很少?

谢谢!

+0

没有对dir结构进行任何更改的最佳选项是从'base- path'。见下面的答案。 –

您可以使用SimpleUrlHandlerMapping这样你流的另一种方式映射到mySite.com/flows

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
    <property name="mappings" value="flows=flowController" /> 
</bean> 

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

<webflow:flow-executor id="flowExecutor" flow-registry="flowRegistry"> 
</webflow:flow-executor> 

<webflow:flow-registry id="flowRegistry" flow-builder-services="flowBuilderServices" base-path="/WEB-INF/app/flows">  
    <webflow:flow-location path="booking-flow.xml" id="flows"/> 
</webflow:flow-registry> 
+0

它的工作原理!谢谢! –

+0

不客气:) –

可能是这样

<!-- Registry of executable flows --> 
<flow:flow-registry flow-builder-services="flowBuilderServices" 
    id="flowRegistry" base-path="/WEB-INF/flows/"> 
    <flow:flow-location id="hello" path="hello-flow.xml" /> 
    <flow:flow-location path="start-flow.xml" id="main" /> 

</flow:flow-registry> 

调用使用id的流状你好。 htm或你好 .html取决于url mapping.first视图状态将在相应的文件中加载。

根据你当前的文件结构的设置,你可以做

<webflow:flow-registry id="flowRegistry" flow-builder-services="flowBuilderServices" base-path="/WEB-INF/app/flows">  
    <webflow:flow-location path="booking-flow.xml" id="flows"/> 
</webflow:flow-registry> 

即你给ID明确在这种情况下适用的是URL - mySite.com/flows

OR

你可以删除流base context -

<webflow:flow-registry id="flowRegistry" flow-builder-services="flowBuilderServices" base-path="/WEB-INF/app"> 
    <webflow:flow-location-pattern value="**/*-flow.xml" /> 
</webflow:flow-registry> 

和ou t在/WEB-INF/app/flows/booking-flow.xml的文件。这会自动生成对应于基本路径和文件名之间的路径的id--这将是flows,并且可适用的URL将为mySite.com/flows