項目結構佈局
WEB-INF/
├── lib/ # JAR 包
├── config/
│ ├── web-application-config.xml
│ ├── webmvc-config.xml
│ └── webflow-config.xml
├── flows/
│ └── shopping.xml
├── jsp/
│ ├── index.jsp
│ ├── viewCart.jsp
│ ├── viewOrder.jsp
│ └── orderConfirmed.jsp
└── web.xml
核心依賴
- org.springframework.webflow-2.0.2.RELEASE.jar
- org.springframework.js-2.0.2.RELEASE.jar
- org.springframework.binding-2.0.2.RELEASE.jar
- jboss-el.jar (Unified EL 實現)
關鍵配置文件
webmvc-config.xml - MVC 整合
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<bean id="flowController" class="org.springframework.webflow.mvc.servlet.FlowController">
<property name="flowExecutor" ref="flowExecutor"/>
</bean>
<bean id="viewMappings" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<value>/shopping.do=flowController</value>
</property>
<property name="defaultHandler">
<bean class="org.springframework.web.servlet.mvc.UrlFilenameViewController"/>
</property>
</bean>
webflow-config.xml - Flow 引擎
<webflow:flow-executor id="flowExecutor"/>
<webflow:flow-registry id="flowRegistry" flow-builder-services="flowBuilderServices">
<webflow:flow-location path="/WEB-INF/flows/shopping.xml" id="shopping"/>
</webflow:flow-registry>
<webflow:flow-builder-services id="flowBuilderServices" view-factory-creator="mvcViewFactoryCreator"/>
<bean id="mvcViewFactoryCreator" class="org.springframework.webflow.mvc.builder.MvcViewFactoryCreator">
<property name="viewResolvers" ref="viewResolver"/>
</bean>
shopping.xml - 流程定義
<flow xmlns="https://www.springframework.org/schema/webflow">
<view-state id="viewCart" view="viewCart">
<transition on="submit" to="viewOrder"/>
</view-state>
<view-state id="viewOrder" view="viewOrder">
<transition on="confirm" to="orderConfirmed"/>
</view-state>
<view-state id="orderConfirmed" view="orderConfirmed">
<transition on="returnToIndex" to="returnToIndex"/>
</view-state>
<end-state id="returnToIndex" view="externalRedirect:servletRelative:/index.jsp"/>
</flow>
視圖頁面實現
viewCart.jsp
<h1>View Cart</h1>
<a href="${flowExecutionUrl}&_eventId=submit">Submit</a>
viewOrder.jsp
<h1>Order</h1>
<a href="${flowExecutionUrl}&_eventId=confirm">Confirm</a>
orderConfirmed.jsp
<h1>Order Confirmed</h1>
<a href="${flowExecutionUrl}&_eventId=returnToIndex">Return to index</a>
index.jsp 入口
<h1>Hello!</h1><br/>
<a href="shopping.do">View Cart</a>
關鍵機制解析
flowExecutionUrl:框架自動注入,包含流程執行鍵,不可手工構造
_eventId:觸發對應 transition,如 _eventId=submit
externalRedirect:servletRelative::外部重定向,相對於當前 Servlet 路徑
部署驗證
- 發布至 Tomcat
- 訪問
https://localhost:8080/app/spring/index.jsp
- 點擊 "View Cart" 啟動流程
- 依次測試 Submit → Confirm → Return to index