Spring MVC表单处理和Spring标签

时间:2015-07-26 15:24:13

标签: java spring forms spring-mvc

我一直在学习Spring一个星期左右,但我觉得我在表格处理方面缺少一些东西。

例如,如果我有一个允许输入Student数据的表单,并且我有一个Student bean定义如下:

public class Student {
   private Integer age;
   private String name;
   private Integer id;

  // and other getters and setters
}

然后我有一个表格:

<form:input path="name" />
<form:input path="age" />
<form:input path="id" />

以及处理该请求后的Controller方法:

   @RequestMapping(value = "/add", method = RequestMethod.POST)
   public String add(@ModelAttribute Student student) {

      //do stuff
   }

内容如果我想创建一个自定义表单,该表单不是直接添加“Student”,其中包含Student所拥有的每个属性的所有字段,而是一个自定义表单,其中包含一些看起来不像是我们在模型中定义了Student。例如:

<form:input path="age" />
<form:input path="firstname" />
<form:input path="lastname" />

请注意,firstname类定义中不存在lastnameStudent属性。我可以连接这两个值并将其放在name中。

对于这种情况,我是否必须创建一个新的bean类来定义该表单的属性?这对我来说似乎有点多余。

this ViewModel 这个解决方案吗?

3 个答案:

答案 0 :(得分:1)

在这种情况下,您可以形成仅包含必填字段的JSON对象,并将其作为请求主体发送到控制器。

在客户端 - 单击保存按钮,框架json并作为发布请求发送

在服务器端使用 -

@RequestMapping(value = "/add", method = RequestMethod.POST) public String add(@RequestBody Student student) { }

答案 1 :(得分:1)

创建一个&#34;表单支持对象&#34;,即特定于表单的类。将值从此FBO复制到实体类。

如果您的表单与您的数据库实体不同,那么它并不多余。

如果有很多字段,请使用像Dozer这样的工具来自动执行此操作。

虽然在数据库中存储年龄和全名是一个坏主意。存储出生日期和名字/姓氏更好。

答案 2 :(得分:1)

您可以要求Spring自动将请求参数绑定到模型属性的字段,或者您可以手动执行所有操作。经典的方法是使表单bean与HTML表单具有相同的字段,然后让Spring填充它,然后从该表单bean构建对象。除非你有充分的理由,否则我的建议是勾选那个将视图部分(表单+表单bean)与模型部分(模型bean)完全分离的方法

但你也有其他选择:

  • 使用@RequestParameter("firstname")等注释参数直接获取请求参数,并在模型对象中手动使用它们:您手动执行Spring免费提供但完全控制的内容
  • 使用自定义数据绑定器。它可以工作,但几乎可以击败Spring MVC数据绑定和验证中的所有内容,所以我强烈建议你不要这样做。