Freemarker - Select Option Not Saved
Solution 1:
Let's build a common ground:
First, create a POJO to hold the information of your form
publicclassFoo{
privateString 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:
@ControllerpublicclassMyController {
@ModelAttributepublic Foo readFooFromDB() {
// read the current option from the DB or simply create a default option hereFoof=newFoo();
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:
@ControllerpublicclassMyController {
....
@RequestMapping("/request/path/")
publicStringprocess() {
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:
@ControllerpublicclassMyController {
....
@RequestMapping("/request/path/")
publicStringprocess(@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 DBreturn"mytemplate";
}
}
Voilá
Post a Comment for "Freemarker - Select Option Not Saved"