Spring MVC:将模型作为参数传递给控制器​​方法VS显式实例化它

Posted

技术标签:

【中文标题】Spring MVC:将模型作为参数传递给控制器​​方法VS显式实例化它【英文标题】:Spring MVC: Passing a Model as an argument to a controller method VS instantiating it explicitly 【发布时间】:2014-10-01 17:30:44 【问题描述】:

我在MVC Controller 类中创建了两个测试方法。在第一种方法中,Model 作为参数传递,而在第二种方法中,我直接实例化它。在这两种方法中,我都向Model 实例添加了一个属性:

@RequestMapping("/test-modelParam")
public String testMethod1(Model model) 
    model.addAttribute("testname", "testvalue");
    return "/testview";



@RequestMapping("/test-modelInstantiatedExplicitly")
public ModelAndView testMethod2() 
    ModelAndView mav = new ModelAndView("/testview");
    mav.addObject("testname", "testvalue");
    return mav;

在这两种情况下,视图都会正确填充。

这两种方法有什么区别吗?如果是这样,在哪里更喜欢使用一个而不是另一个?

【问题讨论】:

最后没有。但是,Model 会预先填充一些值(特别是如果您使用路径变量),而第二个则不会。同样返回 String 而不是 ModelAndView 要容易得多。 ***.com/questions/7175509/… 和 ***.com/questions/16951609/… 的可能重复 @M.Deinum 谢谢;那么,在不使用路径变量时,Model 预填充了哪些值? @DolphinJava 我不认为这是重复的。您链接的问题似乎更多关于ModelModelAndView 之间的差异。不过很好读:-) 当使用 flash 属性时,那些被添加的,当使用 @SessionAttributes 时,这些应该也可用。用@ModelAttribute 注释的方法的结果也在那里。它基本上是预填充模型。 【参考方案1】:

最终没有区别,一切最终都会以ModelAndView 结束。

当使用ModelModelMap 作为方法参数时,它会预先填充一些值

    路径变量 任何@ModelAttribute 注释方法的结果 控制器可用的任何@SessionAttributes

简而言之,它是该方法可用的预填充模型。

Model 始终被创建并与您添加/创建的ModelAndView 合并。

【讨论】:

以上是关于Spring MVC:将模型作为参数传递给控制器​​方法VS显式实例化它的主要内容,如果未能解决你的问题,请参考以下文章

模型在使用 C# 将 POST 方法作为参数传递给 ASP.NET MVC 中同一控制器的 GET 方法时获取 NULL

如何将模型作为参数传递给 ASP.NET MVC 中的 [HttpPost] ActionMethod?

JQuery将'空参数传递给MVC控制器方法

Ajax 将“映射”对象传递给 Spring MVC 控制器

将数组作为参数传递给PHP CodeIgniter中的模型

ASP.NET MVC - 将参数传递给控制器