【问题标题】:Spring Web Flow request mappingsSpring Web Flow 请求映射
【发布时间】:2012-07-02 23:35:46
【问题描述】:

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

<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-flow.xml 添加到一个名为 booking (/WEB-INF/app/flows/booking) 的子文件夹中。而且,太好了! - 它按预期工作。我能够从 mySite.com/flows/booking 访问流程。好的,但我不想在 URL 中出现 /booking,所以我将 booking-flow.xmlbooking 文件夹中移出,并直接进入 WEB-INF/app/flows 并希望这对我有用,但它没有 - 我根本不认为流映射。

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

谢谢!

【问题讨论】:

  • 不改变目录结构的最佳选择是从base-path 中删除flows。请参阅下面的答案。

标签: spring spring-mvc mapping spring-webflow-2


【解决方案1】:

根据您当前的文件结构设置,您可以这样做

<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

您可以从基本上下文中删除流 -

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

/WEB-INF/app/flows/booking-flow.xml 中取出您的文件。这将自动生成与基本路径和您的文件名之间的路径相对应的 id - 这将是 flows 并且再次适用的 URL 将是 mySite.com/flows

【讨论】:

    【解决方案2】:

    另一种方式可能是这样的

    <!-- 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>
    

    根据 url 映射,使用 hello.htm 或 hello.html 之类的 id 调用流。将加载相应文件中的第一个视图状态。

    【讨论】:

      【解决方案3】:

      您可以使用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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-09
        • 2018-11-12
        • 2019-11-25
        • 1970-01-01
        • 1970-01-01
        • 2013-04-24
        • 2012-04-07
        相关资源
        最近更新 更多