假設你在你的web.xml作爲有映射:
<servlet>
<servlet-name>yourApp</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value></param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>yourApp</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
定義在servlet xml文件如下(根據上面的web.xml定義yourApp-servlet.xml中):
<!--Handler mapping for your controller which does some work per your requirements-->
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="order" value="1" />
<property name="mappings">
<props>
<prop key="/handledByController.htm">yourController</prop>
</props>
</property>
</bean>
<!--Your controller bean definition-->
<bean id="yourController" class="package.YourController">
//some properties like service reference
</bean>
<!--Class which handles the flow related actions-->
<bean id="classForThisFlow" class="package.ClassForThisFlow">
</bean>
我想你有像下面所定義的網絡流所需的結構(一個Webflow 2.3 - 1種配置是稍有不同)在webflowconfig XML:
<!--View resolvers-->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
<bean id="flowViewResolver" class="org.springframework.webflow.mvc.builder.MvcViewFactoryCreator">
<property name="viewResolvers" ref="internalResourceViewResolver"/>
</bean>
<!--flow xml registration - flow xmls are in flows folder-->
<flow:registry id="flowRegistry">
<flow:location path="/WEB-INF/flows/**/*-flow.xml" />
</flow:registry>
<!--Flow controller to which dispacther servlet delegates the control to manage flow execution-->
<bean name="flowController" class="org.springframework.webflow.executor.mvc.FlowController">
<property name="flowExecutor" ref="flowExecutor" />
</bean>
<flow:executor id="flowExecutor" registry-ref="flowRegistry">
<flow:repository type="continuation" max-conversations="1" max-continuations="30" />
<flow:execution-listeners>
<flow:listener ref="listener"/>
</flow:execution-listeners>
</flow:executor>
<!--validator to be identified and registered for view state validations if enabled-->
<bean name="validator" class="org.springframework.validation.localvalidation.LocalValidatorFactoryBean"/>
<flow:flow-builder-services id="flowBuilderServices" view-factory-creator="flowViewResolver" validator="validator"/>
在你的流程的XML你有觀點爲:
public class ClassForThisFlow{
public Client prepareFlowForm(){
Client client= new Client();
...
return client;
}
public void methodName(RequestContext context, Client client){
HttpSession session = ((HttpServletRequest)context.getExternalContext().getNativeRequest()).getSession();
session.setAttribute("client",client);
}
.....
}
這樣你就可以通過你的流量和導航:
<flow xmlns="http://www.springframework.org/schema/webflow"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/webflow
http://www.springframework.org/schema/webflow/spring-webflow-2.3.xsd"
start-state="prepareFlow">
<action-state id="prepareFlow">
<evaluate expression="classForThisFlow.prepareFlowForm()" result="flowScope.client"/>
<transition to="clientOptions" />
</action-state>
<view-state id="clientOptions" view="options" model="client">
<!--If you have defined validator for the action class handling this view, then validation will kick in. You can disable validation by validate="false"-->
<!--By default binding of form fields will happen to the model specified; you can disable it by bind="false"-->
<transition on="submit" to="confirm"/>
<transition on="back" to="viewCart"/>
</view-state>
<action-state id="confirm">
<!--Do some action on the form-->
<evaluate expression="classForThisFlow.methodName(flowRequestContext,flowScope.client)"/>
<transition to="returnToController" />
</action-state>
<!--This will take the control back to yourController; See mappingis specified as *.htm in web.xml-->
<end-state id="returnToController" view="externalRedirect:handledByController.htm" />
你可以通過客戶端通過會話控制器提交「確認」,如果需要的話,你將被帶到行動課,否則將提交的最終狀態ID和過渡改爲「確認」,這將把控制引導到yourController。在您的控制器中,您可以訪問會話並檢索客戶端對象以進行進一步處理。
我得到了異常「既沒有BindingResult也沒有作爲bean名稱的普通目標對象'client'作爲request屬性可用」,我試圖改變執行順序,所以首先我做動作狀態並評估methodName(),然後嘗試使用「選項」視圖進入視圖狀態,但仍然是相同的異常;表單將被綁定到模型的「客戶端」,所以也許它看不到我放入會話中的那個(我試圖將一個新的Client()作爲屬性)作爲模型屬性?根據日誌methodName()被執行 –
@KatrinnaL 1)看看如何在ClassForThisFlow類的prepareFlowForm方法中設置客戶端窗體,並在flow xml中啓動狀態的相應更改。您需要按照解釋的方式在會話中設置此客戶端。改變狀態的順序並不重要。希望這可以幫助。請發佈您的代碼,以便我們可以提供更好的幫助。 – Prasad
謝謝,你幫了我很多 –