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

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

日志:

GET /form
NEW BEAN: 1

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

1 回答 1

2

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

在您的第一个请求中,您添加了一个Model属性,它可以在您的jsp.

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

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

于 2013-10-10T15:49:17.550 回答