2017-12-30 25 views
0

私はPlay 2.6 Javaフォームの例を使用しています。これは単純なWidget.javaモデルとWidgetData.javaクラスを持ちます。このクラスは、ウィジェットフォームにマップするDTOを処理するフォームです(私はそれを得ていません)。Java Playフォームの提出

この例は機能しますが、コントローラで何が起こっているかをよりよく説明する必要があります。問題のコントローラーメソッドは次のとおりです。

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セッターメソッドが設定されています。

したがって、WidgetDataプロパティが既に設定されている場合、#2で何が起きていますか?プロパティーは設定されていますか?ウィジェットモデルを作成するには実際のWidgetDataオブジェクトが必要ですか?

バージョン2.0〜2.6用の例とドキュメントは、互いに矛盾します。

答えて

0

だから、最初の行

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

はリクエストからすべて提出された値を取得し、WidgetDataオブジェクトが含まれていますフォームにマップしようとします。フォームは、このプロセスに必要な単なるラッパーです。 データもここで検証されます。

アプリケーションをデバッグしてフォームオブジェクトを調べると、送信された生データと検証エラーを含むマップが表示されます。

そして

WidgetData data = boundForm.get(); 

ラッパーフォームからWidgetDataオブジェクトを抽出します。これは、検証が成功した場合にのみ機能します。

これが少しお役に立てば幸いです。