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

问题描述 投票:0回答:1

我正在学习Spring WebFlow,我遇到了一个奇怪的问题:<view-state>标签允许使用"model"属性。所以我希望在JSP中我可以使用我的Spring表单中的属性"modelAttribute"接受在这个模型中传递的对象(就像在“普通”Spring MVC中我会在Controller类中做同样的事情)。但是我看到的行为非常奇怪: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会立即再次渲染,我想在提交时也没有“wayChosen”请求参数发送,否则应该执行到下一个状态的转换?

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

java spring jsp spring-mvc spring-webflow
1个回答
0
投票

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

EG

<view-state id="two_buttons" model="funkClass">
    <binder>
        <binding property="buttonNumber"/>
    </binder>
    <transition on="wayChosen" to="decider"/>
</view-state>
© www.soinside.com 2019 - 2024. All rights reserved.