Spring Webflow:在视图状态下将对象传递给JSP表单时出现问题

时间:2017-12-22 13:09:27

标签: java spring jsp spring-mvc spring-webflow

我正在学习Spring WebFlow,而且我遇到了一个奇怪的问题: <view-state>标记允许"model"属性。所以我希望在JSP中我可以使用Spring表单中的属性"modelAttribute"来接受在此模型中传递的对象(就像在&#34; normal&#34; Spring MVC中我会做同样的事情控制器类)。 但是我看到的行为非常奇怪:JSP正在被渲染,但是它只调用我对象上的getter方法,而不是setter! 行为的详细描述见下文。

所以这里有一些代码: 我的流XML:

    <?xml version="1.0" encoding="UTF-8"?>
<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.0.xsd">

    <var name="funkCLass" class="somepackage.FlowFunctions"/>

    <view-state id="two_buttons" model="funkClass">
        <transition on="wayChosen" to="decider"/>
    </view-state>

    <action-state id="decider">
        <evaluate expression="funkCLass.getButtonNumber()"/>
        <transition on = "1" to="way_one"/>
        <transition on = "2" to="way_two"/>
    </action-state>
    <view-state id="way_one"/>
    <view-state id="way_two"/>
</flow>

我的JSP在视图状态下呈现(仅<form:form>标记)。我在一本书中读到,我需要隐藏的输入来使流程在离开JSP后以某种方式继续停止 - 但对我而言,无论是否输入,行为都是相同的。

<form:form modelAttribute="funkCLass" method="POST">

    Select your way, Sir: <form:input path="buttonNumber"/>
    <br/><br/>
    <input type="hidden" name="_flowExecutionKey" value="${flowExecutionKey}"/>
    <input type="submit" name="wayChosen" value="Submit"/>

</form:form>

类FlowFunctions(非常简单):

    import java.io.Serializable;

public class FlowFunctions implements Serializable {

    private int buttonNumber;

    public void printMessage(){
        System.out.println("Hello World OF Spring Web Flow!");
    }

    public int getButtonNumber() {
        System.out.println("Inside getButtonNumber()");
        return buttonNumber;
    }

    public void setButtonNumber(int buttonNumber) {
        System.out.println("Inside setButtonNumber()");
        this.buttonNumber = buttonNumber;
    }

}

所以行为是:当我在浏览器中调用流的URL时,我进入了视图状态,我看到了JSP,这很好用。在我输入它的那一刻,我在控制台中看到,调用字段buttonNumber的getter方法 - 这也是预期的。但是当我在输入字段中输入一个值并单击Submit时,不会调用setter方法!(我在getter和setter中的println-statements中看到了这一点)。同样 JSP会立即再次呈现所以,我想也没有&#34; wayChosen&#34;请求参数是否在提交时发送,否则应该执行到下一个状态的转换?

你能解释一下,这种行为的原因是什么?我怎样才能使它发挥作用?

1 个答案:

答案 0 :(得分:0)

您需要向<binder>添加<view-state>块。这告诉Web Flow将特定输入字段绑定到模型对象是预期/安全的。这可以防止用户手动设置您不打算在此阶段设置的其他模型字段。

e.g。

<view-state id="two_buttons" model="funkClass">
    <binder>
        <binding property="buttonNumber"/>
    </binder>
    <transition on="wayChosen" to="decider"/>
</view-state>