在请求处理方法可出现和返回的参数类型中,最重要的就是Model和ModelAndView。对于MVC框架,控制器Controller执行业务逻辑,用于产生模型数据Model,而试图View则用于渲染模型数据
如何将模型数据传递给试图使Spring MVC框架的一项重要工作
>>Model和ModelMap
>>ModelAndView
>>@ModelAttribute
>>@SessionAttribute
1.Model和ModelMap
Spring MVC在内部使用了一个org.springframework.ui.Model接口存储模型数据,功能类似java.util.Map接口,但是比Map易于使用。org.springframework.ui.ModelMap接口实现了Map接口
Spring MVC在调用处理方法之前会创建一个隐含的模型对象,作为模型数据的存储容器。如果处理方法的参数为Model或者ModelMap类型,则SpringMVC会将隐含类型的引用传递给这些参数。在处理方法内部,开发者就可以通过这个参数对象访问模型中的所有数据,也可以向模型中添加新的属性数据。
在处理方法中,Model和ModelMap对象都可以使用如下方法添加模型数据:
>>addObject(String attributeName,Object attributeValue)
@Controller public class User1Controller{ private static final Log logger = LogFactory.getLog(User1Controller.class); // @ModelAttribute修饰的方法会先于login调用,该方法用于接收前台jsp页面传入的参数 @ModelAttribute public void userModel(String loginname,String password, Model model){ logger.info("userModel"); // 创建User对象存储jsp页面传入的参数 User user = new User(); user.setLoginname(loginname); user.setPassword(password); // 将User对象添加到Model当中 model.addAttribute("user", user); } @RequestMapping(value="/login1") public String login(Model model){ logger.info("login"); // 从Model中当中取出之前存入的名为user的对象 User user = (User) model.asMap().get("user"); System.out.println(user); // 设置User对象的username属性 user.setUsername("测试"); return "result1"; } }
@ModelAtttribute修饰的userModel方法会先于login调用,它把请求参数值赋给对应变量,可以向方法中的Model添加对象,前提是要在方法签名中加入一个Model类型的参数。
@Controller public class User2Controller{ private static final Log logger = LogFactory.getLog(User2Controller.class); @ModelAttribute public void userMode2(String loginname,String password, ModelMap modelMap){ logger.info("userMode2"); // 创建User对象存储jsp页面传入的参数 User user = new User(); user.setLoginname(loginname); user.setPassword(password); // 将User对象添加到ModelMap当中 modelMap.addAttribute("user", user); } @RequestMapping(value="/login2") public String login2(ModelMap modelMap){ logger.info("login2"); // 从ModelMap当中取出之前存入的名为user的对象 User user = (User) modelMap.get("user"); System.out.println(user); // 设置user对象的username属性 user.setUsername("测试"); return "result2"; } }
两个例子代码功能基本一致,只是存储对象由Model改为ModelMap
2.ModelAndView
控制器处理方法如果返回值是ModelAndView,则其既包含模型数据信息,也包含视图信息,这样Spring MVC将使用包含的视图对模型数据进行渲染。可以简单的将模型数据看成一个Map
添加模型数据:
addObject(String attributeName,Object attributeValue)
可以通过如下方法设置视图:
setViewName(String viewName)
@Controller public class User3Controller{ private static final Log logger = LogFactory.getLog(User3Controller.class); @ModelAttribute public void userMode3(String loginname,String password, ModelAndView mv){ logger.info("userMode3"); User user = new User(); user.setLoginname(loginname); user.setPassword(password); // 将User对象添加到ModelAndView的Model中 mv.addObject("user", user); } @RequestMapping(value="/login3") public ModelAndView login3(ModelAndView mv){ logger.info("login3"); // 从ModelAndView的Model当中取出之前存入的名为user的对象 User user = (User) mv.getModel().get("user"); System.out.println(user); // 设置user对象的username属性 user.setUsername("测试"); // 设置返回的视图名称 mv.setViewName("result3"); return mv; } }