我正在使用Play 2.6 Java表单示例。它有一个简单的Widget.java模型和一个WidgetData.java类,它是一个表单处理DTO,映射到小部件表单(我不太明白)。
该示例有效但需要更好地解释控制器中发生的情况。这是有问题的控制器方法:
public class WidgetController extends Controller {
private final Form<WidgetData> form;
private final List<Widget> widgets;
@Inject
public WidgetController(FormFactory formFactory) {
this.form = formFactory.form(WidgetData.class);
this.widgets = com.google.common.collect.Lists.newArrayList();
}
public Result createWidget() {
final Form<WidgetData> boundForm = form.bindFromRequest(); #1
WidgetData data = boundForm.get(); #2
widgets.add(new Widget(data.getName(), data.getPrice()));
return redirect(routes.WidgetController.listWidgets());
}
}
我把那些困扰我的线条编号。
#1发生了什么?从form到boundForm创建的是什么,因为它们都属于同一类型? WidgetData setter方法在这里设置。
因此,如果已经设置了WidgetData属性,那么#2中会发生什么?是属性设置,但我们需要一个实际的WidgetData对象来创建Widget模型?
难以将所有这些作为示例,版本2.0 - 2.6的文档相互矛盾。
答案 0 :(得分:0)
所以第一行
final Form<WidgetData> boundForm = form.bindFromRequest();
从请求中获取所有提交的值,并尝试将其映射到包含WidgetData对象的表单上。表单只是此过程所需的包装器。 这里也验证了数据。
如果您调试应用程序并查看Form-Object,您将看到包含原始提交数据的地图和另一个包含验证错误的地图。
然后
WidgetData data = boundForm.get();
将从Wrapper表单中提取WidgetData对象。这仅在验证成功时有效。
希望这会对你有所帮助。