Java Play表单提交

时间:2017-12-30 22:36:37

标签: java playframework

我正在使用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的文档相互矛盾。

1 个答案:

答案 0 :(得分:0)

所以第一行

final Form<WidgetData> boundForm = form.bindFromRequest();

从请求中获取所有提交的值,并尝试将其映射到包含WidgetData对象的表单上。表单只是此过程所需的包装器。 这里也验证了数据。

如果您调试应用程序并查看Form-Object,您将看到包含原始提交数据的地图和另一个包含验证错误的地图。

然后

WidgetData data = boundForm.get(); 

将从Wrapper表单中提取WidgetData对象。这仅在验证成功时有效。

希望这会对你有所帮助。