Model和ModelAndView

在请求处理方法可出现和返回的参数类型中,最重要的就是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<String,Object>对象。

添加模型数据:

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;
    }    
}
posted @ 2018-02-01 17:11  ZZUGPY  阅读(332)  评论(0编辑  收藏  举报