2015-04-02 60 views
0

我有一個Spring MVC應用程序,目前使用SimpleUrlHandlerMapping來集成幾個webflows。豆的定義如下所示:通過URI的Webflow流程定位?

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

所以,當我用下面的網址,我希望執行第一流量:

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

(以及第二流類似)。

我是否過度使用?如果我可以避免這樣做,我不想創建帶有「process1Reservation」的id的定義。

感謝,

傑森

回答

2

首先,你可以添加外卡的圖案來表示(流量位置的圖案),將創建一條規則,以如何註冊流程。這將使您能夠使用1個規則註冊許多流,而不是手動對每個流進行硬編碼。 (注:下面是註冊流程非官方「的標準和最佳實踐」的方式)

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

  1. 開始掃描(確保它存在)
  2. 對於任何子目錄尋找那些有後綴-flow.xml
  3. 對於每個匹配註冊這個流的流動註冊表
任何文件

有一次,您可以通過它在應用程序中的任何位置映射到的URL導航到註冊流。

使用您的示例流程:

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

將通過HTTP訪問得到的請求:

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

注意: 「流」 不包含在URL路徑,因爲我們將它設置爲流注冊表定義中的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; 
} 

此外,你也可以創建一個名爲「進程」主流程可以執行「決定狀態」決定哪些子流調用(subflow1,subflow2等。 ..)基於一些請求參數,但這可能是矯枉過正。我認爲MVC控制器解決方案要簡單得多。

此外,流程名稱「process1」,「process2」將始終爲靜態。我不明白爲什麼需要增加名稱?如果增量在應用程序中有特殊含義並用於處理邏輯,那麼您會將其作爲流中的請求參數傳遞並且不將其作爲流名稱的一部分。如果流程表示不同的邏輯/過程,我會給它們更多有意義的名稱(例如processReservation)。沒有什麼不同於命名pojo類的屬性。這個名字只是爲了澄清這個過程的基本功能。