我的ftl文件中有一个表单,其中一部分就是这个选择:
<select id=”${spring.status.expression}” value=”${spring.status.expression}”>
<$assign value=(spring.status.value!””) />
<option value=”A” >A</option>
<option value=”B” >B</option>
<option value=”C” >C</option>
</select>
默认情况下,它被分配给A,但是当我单击选项B然后单击提交时,B将不会保持选中状态,因为它将被分配默认值A.我该如何解决?我在stackoverflow上看到了一些答案,但在php中我没有使用。
答案 0 :(得分:1)
让我们建立一个共同点:
首先,创建一个POJO来保存表单的信息
public class Foo {
private String bar;
// public getter and setter ommitted
}
现在,在Spring MVC控制器中,将要绑定的实例放入Spring MVC的模型中。这是通过使用@ModelAttribute
注释方法来完成的,该方法返回所需的实例。通常,您将从数据库中读取表单的当前值 - 为了简洁起见,我只是在这里创建一个新的模型实例:
@Controller
public class MyController {
@ModelAttribute
public Foo readFooFromDB() {
// read the current option from the DB or simply create a default option here
Foo f = new Foo();
f.setBar("B");
return f;
}
}
Spring现在将使用名称Foo
将foo
实例放入其模型中。您可以通过为@ModelAttribute
注释分配另一个值来更改该名称。
接下来向您的控制器添加@RequestMapping
方法,该方法将转发到您的Freemarker视图:
@Controller
public class MyController {
....
@RequestMapping("/request/path/")
public String process() {
return "mytemplate";
}
}
最后,在您的模板中使用Spring的FreeMarker宏来呈现包含您选择的表单:
<#import "spring.ftl" as spring />
<form action="/request/path/">
<#assign options = { "A": "Option A", "B": "Option B", "C": "Option C" } />
<@spring.formSingleSelect path="foo.bar" options />
<input type="submit" value="Send" />
</form>
表单现在应该将您的Foo
实例的当前值(在我们的示例中为“B”)呈现为所选选项。
到目前为止,这么好。最后一步(您最初要求的那个):如果您提交表单,Spring应该将提交的bar
值绑定到您的foo
实例。要实现此目的,只需将实例作为参数添加到请求方法中,然后使用@ModelAttribute
再次对其进行注释。请注意,参数的名称在这里很重要,并且必须与Spring模型中的实例名称相匹配 - 在我们的案例中为foo
:
@Controller
public class MyController {
....
@RequestMapping("/request/path/")
public String process(
@ModelAttribute Foo foo) { // Binds all submitted request params to matching properties of your foo instance
// validate your foo instance and probably save it in a DB
return "mytemplate";
}
}
VOILÀ