11 java spring spring-mvc
如果我有一个型号,假设我有以下代码
MyBean bean = new MyBean();
bean.setName("Mike");
bean.setMessage("Meow!");
return new ModelAndView("welcomePage","model",bean);
Run Code Online (Sandbox Code Playgroud)
但如果我有两个或三个模型
假设在我的一个视图中,我希望模型具有用户详细信息,购物车详细信息和历史记录详细信息
我如何使用ModelAnd View返回2-3个模型
Chr*_*son 34
您可以通过多种方式实现此目标,但也许最简单的方法是使用地图
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);
Run Code Online (Sandbox Code Playgroud)
然后,在您的页面中,您只需在访问它时添加额外的级别
User's name is ${ model.userdetails.username }
Run Code Online (Sandbox Code Playgroud)
或者,您也可以将处理程序签名更改为此类型
public String handleRequest(Model model){
//arbitrary handling code
model.addAttribute("bean", bean);
model.addAttribute("userdetails", userdetails);
//etc
return "welcomePage";
}
Run Code Online (Sandbox Code Playgroud)
当你这样做时,你实际上不必返回模型,因为Spring在你收到它之前会保留它,然后可以访问它.我个人认为这种方法更好一点,因为它使单元测试更容易.您所要做的就是检查字符串返回值并使用Spring模型(或您自己的实现Model接口的模拟对象).
编辑 要解决评论:
此源提供了一些示例,并讨论了一些支持的方法签名.具体来说,请查看第15.3.2.3节,了解可以传递给处理程序方法的参数.
基本上,Spring使用@RequestMapping注释来确定应根据给定请求调用哪些方法.然后,Spring可以在调用方法之前检查方法签名并生成适当的参数.在返回ModelAndView对象的情况下,在Model根据您提供的参数调用构造函数时创建.如果未提供任何模型对象,则会创建空模型.但是,当您指定应将模型作为处理程序方法的参数接收时,Spring会Model为您创建一个对象实例并将其传递给您的方法.Spring保留对该模型的引用,并且当您的方法返回时,将该模型传递给Web视图(例如JSP解析器).
它实际上与返回一个ModelAndView对象实际上是相同的,除了它使得单元测试变得更加容易和坦率地说,IMO使得实现更清晰和更优雅.
注意:请记住,a Model实际上只是一个特殊Map对象(因此Spring支持在方法签名中使用Model或 Map交替使用).还有一些其他方法,它还支持隐式属性命名.例如,如果您只是简单地传递一个对象而没有给它命名,那么该Model对象将根据对象类型等确定对象的名称.但是,如果您总是为添加到的对象提供"键"该模型,它的行为与a完全相同Map.
是的,您可以通过将它们放入Map以下内容来返回任意数量的模型属性:
Map<String, Object> model = new HashMap<String, Object>();
model.put("model", bean);
model.put("userdetails", ...);
model.put("shoppingcart", ...);
return new ModelAndView("welcomePage", model);
Run Code Online (Sandbox Code Playgroud)
注意术语 - 模型是一个地图,它由模型属性(单个对象)组成,new ModelAndView("welcomePage","model",bean)是一个方便的构造函数,用于创建具有单个属性的模型.
| 归档时间: |
|
| 查看次数: |
31599 次 |
| 最近记录: |