Spring中Model、ModelMap及ModelAndView之间的区别

1. Model(org.springframework.ui.Model)

Model是一个接口,包含addAttribute方法,其实现类是ExtendedModelMap。
ExtendedModelMap继承了ModelMap类,ModelMap类实现了Map接口。

public class ExtendedModelMap extends ModelMap implements Model

Spring中Model、ModelMap及ModelAndView之间的区别_第1张图片

Model通过以下方法向页面传递参数:

例:User1Controller.java

复制代码

@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页面传入的参数
        User2 user = new User2();
        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的对象
        User2 user = (User2) model.asMap().get("user");
        System.out.println(user);
        // 设置user对象的username属性
        user.setUsername("测试");
        return "result1";
    }

复制代码

前台:
(1) loginForm1.jsp

复制代码




测试Model


测试Model

复制代码

(2) result1.jsp

复制代码




测试@ModelAttribute(value="")注释返回具体类的方法


访问request作用范围域中的model对象:${requestScope.user.loginname }
访问request作用范围域中的model对象:${requestScope.user.password }
访问request作用范围域中的model对象:${requestScope.user.username }

复制代码

运行结果:

Spring中Model、ModelMap及ModelAndView之间的区别_第2张图片  Spring中Model、ModelMap及ModelAndView之间的区别_第3张图片

@ModelAttribute修饰的方法会先于login调用,它把请求参数值赋给对应变量。可以向方法中的Model添加对象,前提是要在方法中加入一个Model类型的参数。

User1Controller.java可以简化为:

复制代码

@RequestMapping(value="/login1new")
    public String login(Model model, @ModelAttribute User2 user){
        user.setUsername("测试2");
        System.out.println(user.toString());
        model.addAttribute("user", user);
        return "result1";
    }

 

复制代码

2. ModelMap(org.springframework.ui.ModelMap)

Spring框架自动创建modelmap的实例,并作为controller方法的参数传入,用户无需自己创建对象。
ModelMap对象主要用于把controller方法处理的数据传递到jsp界面,在controller方法中把jsp界面需要的数据放到ModelMap对象中即可。它的作用类似request对象的setAttribute方法。通过以下方法向页面传递参数:

在视图层通过request找到ModelMap中的数据。
Modelmap本身不能设置页面跳转的url,可以通过controller方法的返回值来设置跳转的url

例:User2Controller.java

复制代码

@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页面传入的参数
        User2 user = new User2();
        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的对象
        User2 user = (User2) modelMap.get("user");
        System.out.println(user);
        // 设置user对象的username属性
        user.setUsername("测试");
        return "result2";
    }

复制代码

前台:result2.jsp


访问request作用范围域中的modelMap对象:${requestScope.user.loginname }
访问request作用范围域中的modelMap对象:${requestScope.user.password }
访问request作用范围域中的modelMap对象:${requestScope.user.username }

运行结果:

Spring中Model、ModelMap及ModelAndView之间的区别_第4张图片  Spring中Model、ModelMap及ModelAndView之间的区别_第5张图片

 

3. ModelAndView(org.springframework.web.servlet.ModelAndView)

ModelAndView对象有两个作用:
(1) 设置url地址(这也是ModelAndView和ModelMap的主要区别)。
(2) 把controller方法中处理的数据传到jsp页面,在controller方法中把jsp界面需要的数据放到ModelAndView对象中即可。然后return mv。它的作用类似request对象的setAttribute方法。通过以下方法向页面传递参数:

在界面上可以通过el变量方式${key}来获取ModelAndView中的数据。
可通过以下方法设置视图:


controller方法的返回值如果是ModelAndView,则其即包含模型数据信息,又包含视图信息,这样SpringMVC将使用包含的视图对模型数据进行渲染,可以简单地将模型数据看成一个Map对象。

例:User3Controller.java

复制代码

@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");
        User2 user = new User2();
        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的对象
        User2 user = (User2) mv.getModel().get("user");
        System.out.println(user);
        // 设置user对象的username属性
        user.setUsername("测试");
        // 地址跳转,设置返回的视图名称
        mv.setViewName("result3");
        return mv;
    }

复制代码

前台:result3.jsp


访问ModelAndView中的数据:${user.loginname}
访问ModelAndView中的数据:${user.password}
访问ModelAndView中的数据:${user.username}

 运行结果:
Spring中Model、ModelMap及ModelAndView之间的区别_第6张图片  Spring中Model、ModelMap及ModelAndView之间的区别_第7张图片

 

转自:https://www.cnblogs.com/zeroingToOne/p/8945066.html

同时可参考:https://blog.csdn.net/lpq374606827/article/details/78764139

你可能感兴趣的:(SSM框架)