我正在学习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”请求参数发送,否则应该执行到下一个状态的转换?
你能解释一下,这种行为的原因是什么?我怎样才能使它发挥作用?
你需要在你的<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>