Spring MVC实例化一个新的Bean而不是重用模型中的旧Bean(@ModelAttribute)

时间:2013-10-10 15:46:08

标签: spring jsp spring-mvc

我认为我的问题很简单,但已经过去2天了,我无法弄明白:

我是Spring MVC的新手,我正在尝试实现一个处理表单的简单@Controller。

  • GET请求:我向Model添加了一个新的PortfolioBean属性。
  • POST请求:我希望收到一个具有相同PortfolioBean的@ModelAttribute。

@Controller

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!”)。

我的问题是,当我发布表单时,我没有收到我的原始Bean对象,而是Spring实例化一个新的,但我想要我的旧Bean:(

日志:

GET /form
NEW BEAN: 1

POST /form
NEW BEAN: 2
Received portfolio: 2

1 个答案:

答案 0 :(得分:2)

Model属性仅存在于一个请求的上下文中。在处理请求结束时,DispatcherServlet会将所有属性添加到HttpServletRequest属性中。

在第一次请求中,您添加了Model属性,该属性可在jsp中使用。

在第二个请求中,由于@ModelAttribute,Spring将尝试根据请求的请求参数创建实例。这将是一个完全不同的实例,因为前一个实例不再存在。

如果要引用旧对象,则需要将其存储在跨越多个请求的上下文中。您可以直接或通过Flash属性将HttpSession属性用于此目的。您可能需要查看RedirectAttributes@SessionAttributes