1

私の問題はかなり単純だと思いますが、2日経ちましたが、わかりません:

私は Spring MVC を初めて使用し、フォームを処理する単純な @Controller を実装しようとしています。

  • GET 要求: 新しい PortfolioBean 属性をモデルに追加します。
  • POST リクエスト: 同じ PortfolioBean を持つ @ModelAttribute を受け取ることを期待しています。

@コントローラ

public class FormController {

@RequestMapping(value = "/form", method = RequestMethod.GET)
public String getForm(Model model) {
    PortfolioBean portfolio = new PortfolioBean();
    model.addAttribute("portfolio", portfolio);
    return "index";
}

@RequestMapping(value = "/form", method = RequestMethod.POST)
public String postForm(@ModelAttribute("portfolio") PortfolioBean portfolio) {
    System.out.println("Received portfolio: " + portfolio.getId());
    return "showMessage";
  }
}

これが私のJSPビューです:

...
<form:form action="form" commandName="portfolio" method="post">
    Name : <form:input path="name" />
    Nick Name : <form:input path="nickName" />
    Age : <form:input path="age" />
    Mobile : <form:input path="mobNum" />
        <input type="submit" />
    </form:form>

そして、ここに私の PortfolioBean があります:

public class PortfolioBean {
private String name;
private String nickName;
private int age;
private String mobNum;

private static int count = 0;
private int id;

public PortfolioBean() {
    count++;
    id = count;
    System.out.println("NEW BEAN: " + id);
}
    // setters & getters
}

ご覧のとおり、静的カウント変数を追加して増分 ID を割り当て、コンストラクターに println("NEW BEAN!") を追加しました。

私の問題は、フォームを POST すると、元の Bean オブジェクトを受信せず、代わりに Spring が新しいオブジェクトをインスタンス化することですが、古い Bean が必要です:(

ログ:

GET /form
NEW BEAN: 1

POST /form
NEW BEAN: 2
Received portfolio: 2
4

1 に答える 1

2

Model属性は、1 つの要求のコンテキストにのみ存在します。リクエストの処理の終わりに向かって、DispatcherServletはすべての属性を属性に追加しHttpServletRequestます。

最初のリクエストでModel属性を追加すると、それが で使用できるようになりますjsp

2 番目のリクエストでは、 が原因で@ModelAttribute、Spring はリクエストのリクエスト パラメータからインスタンスを作成しようとします。以前のものはもう存在しないため、これは完全に異なるインスタンスになります。

古いオブジェクトを参照する場合は、複数のリクエストにまたがるコンテキストに格納する必要があります。HttpSessionこの目的のために、直接またはフラッシュ属性を介して属性を使用できます。RedirectAttributesと を調べるとよいでしょう@SessionAttributes

于 2013-10-10T15:49:17.550 に答える