我认为我的问题很简单,但已经过去2天了,我无法弄明白:
我是Spring MVC的新手,我正在尝试实现一个处理表单的简单@Controller。
@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
答案 0 :(得分:2)
Model
属性仅存在于一个请求的上下文中。在处理请求结束时,DispatcherServlet
会将所有属性添加到HttpServletRequest
属性中。
在第一次请求中,您添加了Model
属性,该属性可在jsp
中使用。
在第二个请求中,由于@ModelAttribute
,Spring将尝试根据请求的请求参数创建实例。这将是一个完全不同的实例,因为前一个实例不再存在。
如果要引用旧对象,则需要将其存储在跨越多个请求的上下文中。您可以直接或通过Flash属性将HttpSession
属性用于此目的。您可能需要查看RedirectAttributes
和@SessionAttributes
。