2014-04-28 57 views
2

我是新來的網絡流量,所以我不知道如何做到這一點: 我有一個春天mvc控制器,我有一個春天webflow。其中一個流程狀態應該顯示用於添加新客戶端的表單。在控制器中,我有用於將客戶端對象(綁定到formAttribute =「client」的表單)保存到數據庫的方法。我不知道如何將控制權從webflow傳遞到控制器,或者直接在流中創建模型屬性,以便與表單綁定(但我後來知道我仍然必須重定向到控制器)。Web流量添加與表單值綁定的模型屬性

請幫助我,在這種情況下最好的邏輯(解決方案)是什麼?

我想:

<view-state id="clientOptions" view="options" model="client"> 
    <transition on="submit" to="confirm"/> 
    <transition on="back" to="viewCart"/> 
</view-state> 

我的形式是在選項中查看並綁定是這樣

<form:form modelAttribute="client" method="post"> 

回答

3

假設你在你的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。在您的控制器中,您可以訪問會話並檢索客戶端對象以進行進一步處理。

+0

我得到了異常「既沒有BindingResult也沒有作爲bean名稱的普通目標對象'client'作爲request屬性可用」,我試圖改變執行順序,所以首先我做動作狀態並評估methodName(),然後嘗試使用「選項」視圖進入視圖狀態,但仍然是相同的異常;表單將被綁定到模型的「客戶端」,所以也許它看不到我放入會話中的那個(我試圖將一個新的Client()作爲屬性)作爲模型屬性?根據日誌methodName()被執行 –

+0

@KatrinnaL 1)看看如何在ClassForThisFlow類的prepareFlowForm方法中設置客戶端窗體,並在flow xml中啓動狀態的相應更改。您需要按照解釋的方式在會話中設置此客戶端。改變狀態的順序並不重要。希望這可以幫助。請發佈您的代碼,以便我們可以提供更好的幫助。 – Prasad

+0

謝謝,你幫了我很多 –

0

我使用的應用程序的context.xml 申報我的控制器或處理程序例如:

<!-- handler/controller--> 
<bean name="contextHandler" class="aaaa.bbbb.ContextHandler" scope="session"> 
    <property name="service" ref="usuarisBO" /> 
    <property name="usuari" ref="usuariLDAP" /> 
</bean> 

然後在我的流程中我可以調用id對象和som E法:

如果你需要你ALDO能做到這一點的操作方法中,例如交易:

<action-state id="a_pas2"> 
    <evaluate expression="contextHandler.carreguemValorsPas2(flowRequestContext,usuari)" /> 
     <transition on="*" to="v_pas2" /> 
</action-state> 



<view-state id="v_pas2" view="/WEB-INF/xhtml/crearCalendariFiscal/formulariCrear2.xhtml"> 
     <transition on="pas3" to="a_pas3"/> 
</view-state> 

我希望它能幫助。