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