【问题标题】:Web flow add model attribute for binding with form valuesWeb 流添加模型属性以与表单值绑定
【发布时间】:2014-06-14 02:09:35
【问题描述】:

我是网络流的新手,所以我不知道该怎么做: 我有一个 spring mvc 控制器,我有一个 spring webflow。其中一个流状态应该显示用于添加新客户端的表单。在控制器中,我有将 Client 对象(以 modelAttribute = "client" 绑定到表单)保存到数据库的方法。我不知道如何将控制从 webflow 传递到控制器并返回或直接在流中创建模型属性以与表单绑定(但我稍后明白我仍然必须重定向到控制器)。

请帮助我,在这种情况下最好的逻辑(解决方案)是什么?

我试过了:

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

【问题讨论】:

    标签: spring-mvc spring-webflow spring-webflow-2


    【解决方案1】:

    假设您的 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>
    

    我假设您在 webflowconfig xml 中定义了如下 Web 流所需的配置(对于 webflow 2.3 - 1 个配置略有不同):

        <!--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 中,您的视图为:

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

    您可以通过会话将客户端传递给控制器​​:

        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);
           }
           .....
           }
    

    通过这种方式,您可以浏览您的流程并在提交“确认”时,如果需要,您将被带到操作类,否则将结束状态 ID 和提交时的转换更改为“确认”,这将指导控制到你的控制器。在您的控制器中,您可以访问会话并检索客户端对象以进行进一步处理。

    【讨论】:

    • 我收到异常“Bean name 'client' 的 BindingResult 和普通目标对象都不能用作请求属性”,我尝试更改执行顺序,所以首先我执行操作状态并评估methodName() 然后尝试使用“选项”视图进入视图状态,但仍然是相同的异常;该表单将绑定到模型中的“客户端”,所以它可能看不到我放入会话中的那个(我也尝试将新的 Client() 作为属性)作为模型属性?根据日志,methodName() 被执行
    • @KatrinnaL 1)查看ClassForThisFlow类prepareFlowForm方法中客户端表单的设置方式以及流xml中start-state的相应变化。您需要按照说明在会话中设置此客户端。改变状态的顺序并不重要。希望这可以帮助。请发布您的代码,以便我们提供更好的帮助。
    • 谢谢,你帮了我很多
    • +1。认为您的意思是 session.setAttribute(...)。感谢您发布此内容。
    • @bphilipnyc 好收获!更新了。
    【解决方案2】:

    我用来在 application-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 对象和一些方法:

    如果您需要交易,您也可以在操作方法中进行,例如:

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

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 2011-10-26
      • 1970-01-01
      • 2020-08-29
      • 1970-01-01
      • 2013-09-05
      • 1970-01-01
      • 2013-01-07
      • 2016-06-16
      • 1970-01-01
      相关资源
      最近更新 更多