对Spring Webflow中模型属性字段变化的反应

时间:2016-03-01 11:58:33

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

我有一个复杂的webflow设置,允许在流程中进行前进和后退导航。此Webflow有一个支持对象,我们称之为flowModel。

因此,查看状态看起来像这样:

<view-state id="beginPage" model="flowModel" view="begin">
    // contents
</view-state>

<view-state id="multipleChoicePage1" model="flowModel" view="choicePage1">
    // contents
</view-state>

<view-state id="multipleChoicePage2" model="flowModel" view="choicePage2">
    // contents
</view-state>

<view-state id="summaryPage" model="flowModel" view="summaryPage">
    // contents
</view-state>

当我从其中一个选择页面中选择某个内容,在摘要中查看它,然后返回到流程中并做出不同的选择时,会出现问题。摘要页面仍将显示从原始路径计算的值。

在网络流程中,有没有办法确定模型中的字段值是否已更改?如果是这种情况,我可以在<on-exit><action-state>中手动更改“已计算”值。否则,我唯一的想法就是在<on-start>内的<on-render><view-state>阶段附加一个PropertyChangeListener。

任何想法/建议都将不胜感激。

更新

我发现在点击<on-exit>方法时,新值已经绑定到模型。所以,我最终这样做了:

<view-state id="beginPage">
<on-render>
    <evaluate expression="flowController.enterBeginPage(flowRequestContext)" />
</on-render>
<!-- Transitions -->
<on-exit>
    <evaluate expression="flowController.exitBeginPage(flowRequestContext)" />
</on-exit>

在流控制器内部,on render和on exit方法如下所示:

public void onRenderBeginPage(RequestContext requestContext) {
    MyForm form = requestContext.getFlowScope().get("flowModel",MyForm.class);
    requestContext.getFlowScope().put("originalFlowModel", form);
}

public void onExitBeginPage(RequestContext requestContext) {
        MyForm form = requestContext.getFlowScope().get("flowModel",MyForm.class);
    MyForm originalForm = requestContext.getFlowScope().get("originalFlowModel", MyForm.class);
    requestContext.getFlowScope().remove("originalFlowModel");
    if (!form.getOption().equals(originalForm.getOption()) {
        // do something
    }
}

它似乎工作得很好,即使它有点像kludge。

1 个答案:

答案 0 :(得分:1)

嗯,我想你可以使用多个flowModel对象吗? 我不是很喜欢它,但也许它可以工作

<var name="flowModel" type="FlowModel"/>
<var name="flowModelChoice1" type="FlowModel"/>
<var name="flowModelChoice2" type="FlowModel"/>
<var name="flowModelChoice3" type="FlowModel"/>

<view-state id="beginPage" model="flowModel" view="begin">
    // contents
</view-state>

<view-state id="multipleChoicePage1" model="flowModel1" view="choicePage1">
    <on-entry>
        // copy flowModel into flowModel1
    </on-entry>
    <transition on="event" to="summaryPage">
        // copy flowModel1 into flowModel3
    </transition>
</view-state>

<view-state id="multipleChoicePage2" model="flowModel2" view="choicePage2">
    <on-entry>
        // copy flowModel into flowModel2
    </on-entry>
    <transition on="event" to="summaryPage">
        // copy flowModel2 into flowModel3
    </transition>
</view-state>

<view-state id="summaryPage" model="flowModel3" view="summaryPage">
    // contents
</view-state>