【问题标题】:Can i return two models in ModelAndView in Spring MVC我可以在 Spring MVC 的 ModelAndView 中返回两个模型吗
【发布时间】:2011-02-21 17:05:07
【问题描述】:

如果我有一个模型,假设我有以下代码

MyBean bean = new MyBean();
bean.setName("Mike");
bean.setMessage("Meow!");

return new ModelAndView("welcomePage","model",bean);

但如果我有两三个类似的模型

假设我的一个观点 我想要具有用户详细信息、购物车详细信息和历史详细信息的模型

如何使用 ModelAnd View 返回 2-3 个模型

【问题讨论】:

  • 您的用户详细信息是什么?是列表吗?

标签: java spring spring-mvc


【解决方案1】:

您可以通过多种方式完成此操作,但最简单的方法可能是使用地图

Map<String, Object> model = new HashMap<String, Object>();
model.put("bean", bean);
model.put("userdetails", userdetails);
//and so on
return new ModelAndView("welcomePage", "model", model);

然后,在您的页面中,您只需在访问时添加一个额外的级别

User's name is ${ model.userdetails.username }

或者,您也可以将处理程序签名更改为类似这样

public String handleRequest(Model model){
   //arbitrary handling code
   model.addAttribute("bean", bean);
   model.addAttribute("userdetails", userdetails);
   //etc
   return "welcomePage";
 }

当您这样做时,您实际上不必返回模型,因为 Spring 在您收到它之前会保留引用,然后可以在之后访问它。我个人觉得这种方法好一点,因为它使单元测试更容易。您所要做的就是检查字符串返回值并使用 Spring 模拟模型(或您自己实现 Model 接口的模拟对象)。

编辑解决 cmets:

This source 给出了一些示例并讨论了一些受支持的方法签名。具体来说,查看第 15.3.2.3 节,了解可以传递给处理程序方法的参数的讨论。

基本上,Spring 使用@RequestMapping 注释来确定应根据给定请求调用哪些方法。然后 Spring 能够在调用方法之前检查方法签名并生成适当的参数。在您返回 ModelAndView 对象的情况下,Model 会在根据您提供的参数调用构造函数时创建。如果您不提供任何模型对象,则会创建一个空模型。但是,当您指定您应该接收模型作为处理程序方法的参数时,Spring 会为您创建一个 Model 对象的实例并将其传递给您的方法。 Spring 保留对该模型的引用,当您的方法返回时,将该模型传递给 Web 视图(例如 JSP 解析器)。

实际上它实际上与返回 ModelAndView 对象相同,只是它使单元测试更容易,坦率地说,IMO 实现了更清洁和更优雅的实现。

注意:请记住,Model 实际上只是一个特殊的 Map 对象(因此 Spring 支持在方法签名中互换使用 ModelMap)。还有一些额外的方法,它还支持隐式属性命名。例如,如果您只是简单地传递一个对象而不给它一个名称,Model 对象将根据对象类型等确定该对象的名称。但是,如果您始终为该对象提供一个“键”您添加到模型中,它的行为与 Map 完全相同。

【讨论】:

  • 你的替代解决方案。很有趣,但我想我不明白。你能多解释一下或者给我一些外部资源吗?
  • 谢谢哥们,我知道第一部分但无法获得第二部分。还有一件事,当我返回模型时,谁实际收到了这个
  • @ChrisThompson 您如何使用两种不同的方法添加多个对象stackoverflow.com/questions/32974893/…
【解决方案2】:

是的,您可以通过将它们放入Map 中来返回任意数量的模型属性:

Map<String, Object> model = new HashMap<String, Object>();
model.put("model", bean);
model.put("userdetails", ...);
model.put("shoppingcart", ...);
return new ModelAndView("welcomePage", model);

注意术语 - 模型是一个映射,它由模型属性(单个对象)组成,new ModelAndView("welcomePage","model",bean) 是一个方便的构造函数,用于创建具有单个属性的模型。

【讨论】:

【解决方案3】:

给出了很好的例子。只是为了添加到组合中,我真的成为了基于注释的方法的粉丝。我喜欢它,因为它提供了一种非常简洁的实现方式。这是一个例子......

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@Scope("prototype")
@RequestMapping("/testing")
public class TestController {

    @Autowired
    TestFactory factory;

    @RequestMapping(value = "/test1", method = RequestMethod.POST)
    public void test1(String something, String something2, Model model) {
        List<Map<String, String>> results = 
             factory.getSomethingCool(something1, something2);

        model.addAttribute("something1", something1);
        model.addAttribute("something2", something2);
        model.addAttribute("results", results);
    }

    @RequestMapping(value = "/test2", method = RequestMethod.POST)
    public void test1(String something1, String something2, Model model) {
        List<String> results = 
            factory.getSomethingElseCool(something1, something2);

        model.addAttribute("something1", something1);
        model.addAttribute("something2", something2);
        model.addAttribute("results", results);
    }
}

【讨论】:

  • 除了官方 spring mvc 之外,互联网上是否还有更多示例用于控制器中的注释,我可以更多
  • Spring 文档非常好。这个网站上有很多例子,只需要做一些挖掘。一个快速的谷歌搜索产生了这个viralpatel.net/blogs/2010/07/spring-3-mvc-handling-forms.html
猜你喜欢
  • 2018-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-30
  • 2021-08-20
  • 2019-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多