首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ModelAndView.addObject vs Model.addAttribute

ModelAndView.addObject vs Model.addAttribute
EN

Stack Overflow用户
提问于 2013-10-04 22:26:36
回答 1查看 41.5K关注 0票数 6

您好,我正在学习Spring MVC,我正在按照this tutorial编写我的小型not应用程序,但我将其略微修改为“任务列表”而不是“用户列表”。有一件事我不清楚,所以我想要一个解释。这是我的edit.jsp:

代码语言:javascript
复制
<%@ 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:

代码语言:javascript
复制
 @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):

代码语言:javascript
复制
 @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。

提前谢谢你。Vojtech。

编辑:如果我将editTask()更改为下面的代码,它就会起作用-表单就会被填充。但是,如果提交了一些任务数据,我现在如何读取它们呢?

代码语言:javascript
复制
@RequestMapping("/edit")  
public ModelAndView editTask(@RequestParam String id) {  
  task = taskService.getTask(id);
  ModelAndView model = new ModelAndView("edit");
  model.addObject("task", task);
  return model;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-04 23:25:24

你遇到了一个不经常发生的边缘情况。让我们试一试

代码语言:javascript
复制
@RequestMapping("/edit")  
public String editTask(@RequestParam String id, Model model) {
    Task task = taskService.getTask(id);
    model.addAttribute("task", task);
    return "edit";
}

在这种情况下,Spring将从其ModelAndViewContainer创建一个Model对象,并将其作为参数传递给您的方法。因此,如果您之前添加了模型属性,它们将在此处对您可用,而您添加的属性将在稍后可用。返回一个String视图名称。Spring将使用带有ViewResolver字符串来解析呈现或转发到哪个jsp或其他类型的视图。

有了这个

代码语言:javascript
复制
@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;
}

由于@ModelAttribute,Spring将创建一个Task对象,并在调用(反射)您的方法时将其作为参数传递。您创建、添加和返回的ModelAndView对象将与包含在ModelAndViewContainer中的ModelAndView对象合并,该对象由Spring为您的请求管理。因此,您在此处添加的内容稍后也将可用。

的问题:看起来ModelAttribute在模型属性上有优先权,所以它不会被你添加到ModelAndView对象的模型属性覆盖。实际上,it被写入到您的ModelAndView对象,覆盖了您的"task"属性。请记住,如果不为@ModelAttribute注释指定value属性,它将使用参数类型为其命名。例如,Task ==> "task"List<Task ==> taskList等。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19183747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档