Freemarker - 选择未保存的选项

时间:2014-09-10 22:01:33

标签: html spring freemarker

我的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中我没有使用。

1 个答案:

答案 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现在将使用名称Foofoo实例放入其模型中。您可以通过为@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À