6

私はどのように機能するかについて多くの例を見てきましたsimpleFormcontroller

しかし、それでも私にはいくつかの混乱があります。

formBackingObject()、、メソッドreferenceData()がいつonSubmit()呼び出されたか知りたいですか?

これらのメソッドの正確な作業フローがわかりませんか?

誰かが私を説明できますか?

4

5 に答える 5

12

ワークフローは次のとおりで、AbstractFormControllerクラ​​スによって制御されます-

  1. コントローラは、新しいフォーム(通常はGET )の要求を受け取ります。
  2. formBackingObject()を呼び出します。これは、デフォルトで、構成されたcommandClassのインスタンスを返します(スーパークラスが公開するプロパティを参照)が、オーバーライドして、データベースからオブジェクトを取得することもできます(フォームを使用して変更する必要があります)。 )。
  3. initBinder()を呼び出します。これにより、コマンドクラスの特定のフィールド(多くの場合、非プリミティブタイプまたは非文字列タイプのプロパティ)のカスタムエディターを登録できます。これにより、これらのプロパティ値に適切な文字列(ロケール固有の日付文字列など)がレンダリングされます。
  4. bindOnNewFormがtrueに設定されている場合にのみ、ServletRequestDataBinderが適用されて新しいフォームオブジェクトに初期リクエストパラメーターが入力され、onBindOnNewForm(HttpServletRequest、Object、BindException)コールバックメソッドが呼び出されます。注:部分的なバインドを可能にするために、この時点では定義済みのバリデーターは適用されません。ただし、 initBinder()を介して適用されるバインダーのカスタマイズに注意してください。(DataBinder.setRequiredFields(String []など)は引き続き適用されます。そのため、bindOnNewForm = trueおよびinitBinder()を使用する場合、バリデーターを使用する代わりにカスタマイズを使用してフィールドを検証します。新しいフォームでは、エラーオブジェクトのフィールドが欠落しているためにバインドエラーが発生する可能性があります。バインダーエラーを表示するビュー(JSPなど)はインテリジェントである必要があり、この場合、初期フォームビューを表示しているかどうかを考慮します。後続の投稿結果、前者のエラー表示をスキップします。
  5. showForm()を呼び出して、レンダリングする必要のあるビュー(通常はフォームをレンダリングするビュー)を返します。このメソッドは、サブクラスで実装する必要があります。
  6. showForm()実装はreferenceData()を呼び出します。これを実装して、フォームの編集時に必要になる可能性のある関連する参照データを提供できます(たとえば、ユーザーが選択できるロケールオブジェクトのリスト)。
  7. モデルが公開され、ビューがレンダリングされて、ユーザーがフォームに入力できるようになります。
  8. コントローラはフォーム送信(通常はPOST)を受け取ります。フォーム送信を検出する別の方法を使用するには、isFormSubmissionメソッドをオーバーライドします。
  9. sessionFormが設定されていない場合は、 formBackingObject()が呼び出されてフォームオブジェクトが取得されます。それ以外の場合、コントローラは、セッションですでにバインドされているコマンドオブジェクトを見つけようとします。オブジェクトが見つからない場合は、handleInvalidSubmitを呼び出します。これは、デフォルトで、新しいフォームオブジェクトを作成し、フォームを再送信しようとします。
  10. ServletRequestDataBinderが適用され、フォームオブジェクトに現在のリクエストパラメータが入力されます。
  11. onBind(HttpServletRequest、Object、Errors)を呼び出します。これにより、バインド後、検証前にカスタム処理を実行できます(たとえば、リクエストパラメーターをBeanプロパティに手動でバインドして、バリデーターに表示されます)。
  12. validateOnBindingが設定されている場合、登録されたValidatorが呼び出されます。バリデーターはフォームオブジェクトのプロパティをチェックし、指定されたErrorsオブジェクトを介して対応するエラーを登録します。
  13. onBindAndValidate()を呼び出します。これにより、バインドと検証の後にカスタム処理を実行できます(たとえば、要求パラメーターを手動でバインドし、バリデーターの外部で検証することができます)。
  14. バインディングエラーの有無にかかわらず、processFormSubmission()を呼び出して送信を処理します。このメソッドは、サブクラスで実装する必要があります。

ソース

フローを理解するための詳細と図式表現については、以下のリンクを参照してください-

于 2014-09-01T07:35:50.210 に答える
5

SimpleFormControllerSpring3.0以降は非推奨になりました

Spring 3.0では、作成プロセスに2つの方法(および表示ページ用に3つ目)を持つ1つのコントローラーを使用します。通常は次のようになります。

/**
 * Shows a form for car creation.
 */
@RequestMapping(params = "form", method = RequestMethod.GET)
public ModelAndView createForm() {
    ModelMap uiModel = new ModelMap();
    uiModel.addAttribute("carCreateFormBackingObject", new CarCreateFormBackingObject()); //formBackingObject - often called command object
    uiModel.addAttribute("manufactureres", this.manufactureresDao.readAll()); //referenceData
    return new ModelAndView("car/create", uiModel);
}

/**
 * Creates the car and redirects to its detail page.
 *
 */
@RequestMapping(method = RequestMethod.POST)
public ModelAndView create(final @Valid CarCreateFormBackingObject carCreateFormBackingObject,
        final BindingResult bindingResult) {

    if (bindingResult.hasErrors()) {
                ModelMap uiModel = new ModelMap();
        uiModel.addAttribute("carCreateFormBackingObject", carCreateFormBackingObject);
        uiModel.addAttribute("manufactureres", this.manufactureresDao.readAll()); //referenceData
        return new ModelAndView("car/create", uiModel);
    }

    Car car = this.carService.create(carCreateFormBackingObject.name, ...);
    return new ModelAndView(new RedirectView("/cars/" + car.getId(), true)); //redirect to show page
}

それでも、formBackingObject()、refernceData()メソッドが誰によっていつ自動的に呼び出されるのか知りたいですか?

あなたの質問に戻ってください「それでも私はformBackingObject()、refernceData()メソッドが誰によっていつ自動的に呼び出されるのか知りたいですか?」

これらのメソッドはすべてSimpleFormController(およびそのスーパークラスAbstractFormController)によって呼び出され、Template-Method-Patternに従います。-SimpleFormControllerビジネス価値を獲得するために、このプロセスのいくつかのフックでプロセスと具体的なサブクラス「plugsin」を定義します。

  • formBackingObjectAbstractFormControllerコントローラが送信(POST)を処理する必要があるとき、または最初の「新しい」ビューのコマンドオブジェクトを作成する必要があるときに呼び出されます。

  • referenceDataAbstractFormControllerビューのモデルを作成する必要がある場合は常に呼び出されます。

于 2012-10-11T07:32:51.863 に答える
1

formBackingObject()メソッドは、ページをレンダリングする前に何らかのアクションを実行する場合に使用されます。つまり、HTMLコンポーネントのデフォルト値のように。

refereceData()メソッドは、フォームに参照データを追加するために使用されます。つまり、ドロップダウンにデータを入力します。

OnSubmit()メソッドは、フォームを送信するときに呼び出されます。

ただし、Spring 3.0を使用している場合は、アノテーションを使用して次のアプローチに従ってください

@RequestMapping(value = "/index.htm", method = RequestMethod.GET)
public String showLogin() {
    return "user/login";
}

これはformBackingObjectと同じになります。このメソッドでは、modelMap()を使用して、参照データを追加します。

OnSubmit()と同じmethod=POSTで同じ方法でメソッドを追加します

于 2012-10-11T06:53:37.660 に答える
0

rfefollingリンク

http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/web/servlet/mvc/SimpleFormController.html

ワークフローを読んでください..あなたは単にあなたの疑問を理解することができます..

于 2013-01-11T07:11:29.643 に答える
0

FormBackingObjectMethod()---> @RequestMapping(requestMethod.GET)画面に初めて表示されるフォームformBackingObjectが理由です

initBinder()--->通常、日付フィールドが必要であると想定するために使用されます(カスタム日付の例:dd ** MM *** yyyy)必要なのはinitBinderメソッドを使用することを意味します

onSubmit()-> @ RequestMapping(requestMethod.POST)フォームの送信中にonSubmit()メソッドが呼び出されます

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

于 2018-02-07T04:55:02.803 に答える