日安,我正在学习Spring MVC,我正在按照this tutorial编写我的小web应用程序,但是我稍微修改了一下,将其作为“任务列表”而不是“用户列表”。有一件事我不清楚,所以我想请你解释一下。这是我的edit.jsp:
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%>
<html>
<head>
<title>Edit task</title>
</head>
<body>
<h1>Edit task</h1>
<form:form method="post" action="/update" modelAttribute="task">
<table>
<tr>
<td>Title</td>
<td><form:input path="title"/></td>
</tr>
<tr>
<td>Description</td>
<td><form:textarea path="description"/></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="Save"/></td>
</tr>
</table>
</form:form>
</body>
</html>
这是我的HomePageController.java(版本1)中的editTask方法:
@RequestMapping("/edit")
public ModelAndView editTask(@RequestParam String id, @ModelAttribute Task task) {
// Retrieve task from the database
task = taskService.getTask(id);
ModelAndView model = new ModelAndView("edit");
model.addObject("task", task);
return model;
}
如果我点击编辑链接来编辑一个项目(例如/TaskBook/edit?id=1),会出现一个表单,但是它没有被填充。所以我这样修改了方法(版本2):
@RequestMapping("/edit")
public String editTask(@RequestParam String id, Model model) {
Task task = taskService.getTask(id);
model.addAttribute("task", task);
return "edit";
}
现在,当我编辑任务时,表单会被填充。我不明白版本1中的model.addObject(“task”,task)和版本2中的model.addAttribute(“task”,task)有什么区别。任务对象是存储在其他地方还是丢失了?请解释。我使用的是Spring Framework 3.2.1。
先谢谢你沃伊泰克。
编辑:如果我把editTask()改成下面的代码,它就可以工作了--表单被填充了。但是如果一些任务数据被提交了,我现在怎么读它们呢?
@RequestMapping("/edit")
public ModelAndView editTask(@RequestParam String id) {
task = taskService.getTask(id);
ModelAndView model = new ModelAndView("edit");
model.addObject("task", task);
return model;
}
1条答案
按热度按时间7qhs6swi1#
你遇到了一个不常出现的边缘情况。让我们尝试一下
在本例中,Spring将从它的
ModelAndViewContainer
创建一个Model
对象,并将其作为参数传递给您的方法。您可以在此处使用它们,而您添加的视图将在以后使用。您返回一个String
视图名称。Spring将使用带有ViewResolver
的String来解析要呈现或转发到哪个jsp
或其他类型的视图。有了这个
由于
@ModelAttribute
,Spring将创建一个Task
对象,并在调用(反射)方法时将其作为参数传递。您创建、添加和返回的ModelAndView
对象将与包含在ModelAndViewContainer
中的ModelAndView
对象合并,该对象由Spring为您的请求管理。因此,您在此处添加的内容稍后也将可用。**问题:**看起来
ModelAttribute
在模型属性上有优先权,所以它不会被添加到ModelAndView
对象的模型属性覆盖。实际上,它被写入到ModelAndView
对象,覆盖了"task"
属性。记住,如果你没有为@ModelAttribute
注解指定value
属性,它会使用参数的类型给予它命名。例如,Task
==〉"task"
,List<Task>
==〉taskList
,等等。