Freemarker - select option not saved

倖福魔咒の 提交于 2019-12-25 07:28:08

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!