我一直在学习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
类定义中不存在lastname
和Student
属性。我可以连接这两个值并将其放在name
中。
对于这种情况,我是否必须创建一个新的bean类来定义该表单的属性?这对我来说似乎有点多余。
是this, ViewModel 这个解决方案吗?
答案 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免费提供但完全控制的内容