问题
I have a form in my ftl file and one part of this is this select:
<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>
It is assigned to A by default what is fine, but when I click option B and then click submit, B won't stay selected, because it will be assigned default value A. How can I fix it ? I see some answers on stackoverflow but in php which I don't use.
回答1:
Let's build a common ground:
First, create a POJO to hold the information of your form
public class Foo {
private String bar;
// public getter and setter ommitted
}
Now, in your Spring MVC controller, put the instance you want to bind to into Spring MVC's model. This is done by annotating a method using @ModelAttribute
which returns the required instance. Typically, you'll read current values for your form from a database - For the sake of brevity I'm just creating a new model instance here:
@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 will now put the Foo
instance into it's model using the name foo
. You could change that name by assigning another value to your @ModelAttribute
annotation.
Next add a @RequestMapping
method to your controller, which will forward to your Freemarker View:
@Controller
public class MyController {
....
@RequestMapping("/request/path/")
public String process() {
return "mytemplate";
}
}
Finally, in your template use Spring's FreeMarker macros to render a form including your select:
<#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>
The form should now render the current value of the your Foo
instance ("B" in our case) as the selected option.
So far, so good. Last step (the one you were originally asking for): If you submit your form, Spring should bind the submitted bar
value to your foo
instance. To achieve this, simply add the instance as a parameter to your request method and annotate it again with @ModelAttribute
. Note that the name of the parameter is important here and must match the name of the instance in Spring's model - foo
in our case:
@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á
来源:https://stackoverflow.com/questions/25775788/freemarker-select-option-not-saved