4

私はウィザードのような一連のページに取り組んでおり、ユーザーは最終的な送信のためにいくつかのビューにデータを入力する必要があり、最終的な送信が完了する前に行ったり来たりすることができます。すべてのビューに対して、ModelAttribute として定義された同じ Bean を使用しようとしていました。基本的には、この 1 つの Bean をトークンのように渡し、各ビューがその小さなデータを追加するだけです。

問題は、Spring MVC が呼び出しごとに新しい Bean を作成するように見えることです。モデルについての私のあいまいな理解は、基本的に何かをセッションに入れるようなものであり、そのオブジェクトはセッションが完了するまで存在するというものでした。そうではないようです。

では、最初の質問は、モデル属性はどこに「存在」し、どのくらいの期間存続するのでしょうか? Spring MVC だけを使用してウィザードのようなインターフェイスを実装するためのより良いパターンはありますか (私は制限されており、Web Flow を使用できません...私が働いている承認済みのツールではありません)?

4

2 に答える 2

3

モデル属性を Bean として使用することはお勧めできません。データベースに永続化される前にフォーム データを操作するのに適しています。

@ModelAttribute("formAttribute")メソッドでパラメーターとして指定すると作成されます。

public void getForm(@ModelAttribute("formAttribute") Form form) {
}

これは、その構造を呼び出すことによって、すべてのメソッド呼び出しの前に作成されます。

@ModelAttribute("formAttribute")
public Form getForm() {
   return new Form();
}

メソッド引数に指定されていない場合は存在しません。

コントローラーで次のよう@ModelAttributeに定義することで、セッションに追加することができます。@SessionAttributes

@Controller
@SessionAttributes("formAttribute")
public HelloController

次に、最初に使用するときに一度初期化され、次のように呼び出して破棄すると破棄されます。

public void finalStep(SessionStatus status) {
   status.setComplete();
}

を組み合わせれば@SessionAttributes比較的簡単に魔法使い的な流れを作ることができると思います。

于 2012-12-12T20:47:51.373 に答える
1

Web-flow がオプションでない場合は、次のことを試すことができます。

モデル属性をセッション属性として保存します。これは@SessionAttribute、コントローラーに注釈を追加することで実現されます。

@Controller
@SessionAttribute("myconversationModel")
public class MyFlowController{

    @RequestMapping
    public String myMethod(@ModelAttribute("myconversationModel") ConversationModel myConversationModel){
        ....
    }
}

次に、フローが完了したと思われる場所で、追加のパラメーターを受け入れてSessionStatusを呼び出すだけsessionStatus.completeで、セッションから属性が消去されます

@RequestMapping
public String myFinalMethod(@ModelAttribute("myconversationModel") ConversationModel myConversationModel, SessionStatus sessionStatus){
sessionStatus.complete();
    ....
}
于 2012-12-12T20:46:12.900 に答える