2014-04-16 128 views
0

我正在開發一個在給定時刻使用Spring Web Flow的Web。在流程中,有一點(flow2.jsp),用戶被要求從某些複選框中選擇。我見過的所有的例子(如thisthis)獲取的項目來滿足從控制器類的複選框......但因爲我使用Spring Web Flow的,我使用的是默認的流量控制器:Spring Web Flow中的複選框

<beans:bean id="flowcontroller" class="org.springframework.webflow.mvc.servlet.FlowController"> 
<beans:property name="flowExecutor" ref="flowExecutor"></beans:property> 
</beans:bean> 

如何我可以喂這些物品嗎?我必須在JSP中硬編碼它們嗎?

謝謝。

編輯

最後我做了類似的事情,用我的模型對象初始化地圖:

public Map referenceData(RequestContext context){ 
    System.out.println("Setting up list"); 
    Map referenceData=new HashMap(); 
    list=new ArrayList<String>(); 
    list.add("cb1"); 
    list.add("cb2"); 
    list.add("cb3"); 

    referenceData.put("list", list); 

    return referenceData; 
} 

這種方法是從flow.xml叫:

<view-state id="flow2" view="flow2" model="proyecto"> 
    <on-render> 
     <evaluate expression="proyecto.referenceData(flowRequestContext)"></evaluate> 
    </on-render> 

    <transition on="gotoPageThree" to="flow3"></transition> 
    <transition on="goBack" to="inicio"></transition> 
</view-state> 

flow2.jsp是視圖的名稱:

<form:checkboxes items="${list}" path="property-in-my-model"/> 

這樣,它拋出一個異常:

java.lang.IllegalArgumentException: 'items' must not be null 
at org.springframework.util.Assert.notNull(Assert.java:112) 
at org.springframework.web.servlet.tags.form.AbstractMultiCheckedElementTag.setItems(AbstractMultiCheckedElementTag.java:83) 
at org.apache.jsp.WEB_002dINF.views.flow2_jsp._jspx_meth_form_005fcheckboxes_005f0(flow2_jsp.java:170) 
at org.apache.jsp.WEB_002dINF.views.flow2_jsp._jspx_meth_form_005fform_005f0(flow2_jsp.java:135) 
at org.apache.jsp.WEB_002dINF.views.flow2_jsp._jspService(flow2_jsp.java:81) 
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432) 
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390) 
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:749) 
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:487) 
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:412) 
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:339) 
at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:238) 
at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:262) 
at org.springframework.webflow.mvc.servlet.ServletMvcView.doRender(ServletMvcView.java:55) 
at org.springframework.webflow.mvc.view.AbstractMvcView.render(AbstractMvcView.java:187) 
at org.springframework.webflow.engine.ViewState.render(ViewState.java:296) 
at org.springframework.webflow.engine.ViewState.refresh(ViewState.java:243) 
at org.springframework.webflow.engine.ViewState.resume(ViewState.java:221) 
at org.springframework.webflow.engine.Flow.resume(Flow.java:545) 
at org.springframework.webflow.engine.impl.FlowExecutionImpl.resume(FlowExecutionImpl.java:258) 
at org.springframework.webflow.executor.FlowExecutorImpl.resumeExecution(FlowExecutorImpl.java:169) 
at org.springframework.webflow.mvc.servlet.FlowHandlerAdapter.handle(FlowHandlerAdapter.java:183) 
at org.springframework.webflow.mvc.servlet.FlowController.handleRequest(FlowController.java:174) 
at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48) 
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923) 
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852) 
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) 
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603) 
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
at java.lang.Thread.run(Thread.java:744) 

我可以看到系統輸出來之前在控制檯不是例外,所以我的模型對象應該有一個準備使用列表...

回答

0

流控制器是Spring MVC Controller層和Spring Web Flow引擎之間的適配器。它允許Spring Web Flow在DispatcherServlet中作爲Controller運行嵌入式。流控制器確定在請求到達時要執行的操作,如啓動新流執行,恢復暫停流執行,停止流執行。 它不處理表單元素。

您需要創建一個類(比如說用於登錄,登錄服務類),以便在轉到流中的下一個屏幕之前處理表單相關的東西。

例如,創建一類處理登錄流程操作:

public class LoginAction implements Seerilaizable{ 
     ... 
     public void performPostLoginProcess(LoginForm loginForm){ 
      .. 
     } 
    } 

創建形式保持在一個視圖中定義的表單字段(通常我只使用一種形式爲具有多個視圖的整個流動,但是這取決於上要求我們能在每一個流程多種形式):

<bean id="loginAction" class="package.LoginAction"> 
     <property>...</property> 
    <bean> 

public class LoginForm implements Seerilaizable{ 
     //Your jsp view has these fields 
     private boolean checkBox1; 
     private String textField1; 
     ... 
    } 

在調度servlet上下文定義像這個bean

在你的流程:

<start-state id="initializeLoginFlow"> 
    <action-state id="initializeLoginFlow"> 
     <evaluate expression="LoginAction.initializeFormObject(flowRequestContext)" result="flowScope.loginForm" /> 
     <transition to="login" /> 
    </action-state> 
    <view-state id="login" view="login" model="loginForm"> 
     <transition on="submit" to="section1"> 
      <evaluate expression="loginAction.performPostLoginProcess(flowScope.loginForm)"></evaluate> 
     </transition> 
    </view-state> 
    <view-state id="section1" view="section1" model="loginForm"> 
    ... 

這樣,你需要有一個服務類hanlde流量要求。希望這可以幫助。

編輯1:在表單proyecto包括列表webFrameworkList。更改您的參考數據

public void referenceData(Proyecto proyecto){ 
     System.out.println("Setting up list"); 
     List<String> list=new ArrayList<String>(); 
     list.add("cb1"); 
     list.add("cb2"); 
     list.add("cb3"); 
     proyecto.setWebFrameworkList(list); 
    } 

在JSP中:

td> 
     <form:checkboxes items="${webFrameworkList}" path="checkBoxPropertyInModel" /> 
    </td> 
+0

我現在進不去的地方,我有我的項目的電腦,我會檢查這個明天......但看起來不錯。感謝Prasad。 – Fustigador

+0

好吧,讓我們知道它是否適合你。 – Prasad

+0

請參閱編輯。 – Fustigador