Springboot---Model,ModelMap,ModelAndView 深碍√TFBOYSˉ_ 2021-11-24 01:08 234阅读 0赞 1. Model(org.springframework.ui.Model) Model是一个接口,包含addAttribute方法,其实现类是ExtendedModelMap。 ExtendedModelMap继承了ModelMap类,ModelMap类实现了Map接口。 public class ExtendedModelMap extends ModelMap implements Model ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpa3VucGVuZzY2NTYyMDE_size_16_color_FFFFFF_t_70] Model通过以下方法向页面传递参数: ![在这里插入图片描述][20190727124637447.png] 例: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 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>测试Model</title> </head> <body> <h3>测试Model</h3> <form action="login1new" method="post"> <table> <tr> <td><label>登录名: </label></td> <td><input type="text" id="loginname" name="loginname" ></td> </tr> <tr> <td><label>密码: </label></td> <td><input type="password" id="password" name="password" ></td> </tr> <tr> <td><input id="submit" type="submit" value="登录"></td> </tr> </table> </form> </body> </html> (2) result1.jsp <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>测试@ModelAttribute(value="")注释返回具体类的方法</title> </head> <body> 访问request作用范围域中的model对象:${requestScope.user.loginname }<br> 访问request作用范围域中的model对象:${requestScope.user.password }<br> 访问request作用范围域中的model对象:${requestScope.user.username }<br> <br> </body> </html> 运行结果: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpa3VucGVuZzY2NTYyMDE_size_16_color_FFFFFF_t_70 1] @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"; } 1. ModelMap(org.springframework.ui.ModelMap) Spring框架自动创建modelmap的实例,并作为controller方法的参数传入,用户无需自己创建对象。 ModelMap对象主要用于把controller方法处理的数据传递到jsp界面,在controller方法中把jsp界面需要的数据放到ModelMap对象中即可。它的作用类似request对象的setAttribute方法。通过以下方法向页面传递参数: ![在这里插入图片描述][20190727124843342.png] 在视图层通过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 <body> 访问request作用范围域中的modelMap对象:${requestScope.user.loginname }<br> 访问request作用范围域中的modelMap对象:${requestScope.user.password }<br> 访问request作用范围域中的modelMap对象:${requestScope.user.username }<br> <br> </body> 运行结果: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpa3VucGVuZzY2NTYyMDE_size_16_color_FFFFFF_t_70 2] 3. ModelAndView(org.springframework.web.servlet.ModelAndView) ModelAndView对象有两个作用: (1) 设置url地址(这也是ModelAndView和ModelMap的主要区别)。 (2) 把controller方法中处理的数据传到jsp页面,在controller方法中把jsp界面需要的数据放到ModelAndView对象中即可。然后return mv。它的作用类似request对象的setAttribute方法。通过以下方法向页面传递参数: ![在这里插入图片描述][20190727124955302.png] 在界面上可以通过el变量方式$\{key\}来获取ModelAndView中的数据。 可通过以下方法设置视图: ![在这里插入图片描述][20190727125011170.png] controller方法的返回值如果是ModelAndView,则其即包含模型数据信息,又包含视图信息,这样SpringMVC将使用包含的视图对模型数据进行渲染,可以简单地将模型数据看成一个Map<String, Object>对象。 例: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 <body> 访问ModelAndView中的数据:${user.loginname}<br> 访问ModelAndView中的数据:${user.password}<br> 访问ModelAndView中的数据:${user.username}<br> </body> 运行结果: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpa3VucGVuZzY2NTYyMDE_size_16_color_FFFFFF_t_70 3] [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpa3VucGVuZzY2NTYyMDE_size_16_color_FFFFFF_t_70]: /images/20211122/19c89fa94d2e4a5daefd96e1d3c28e50.png [20190727124637447.png]: /images/20211122/b7e46cbb3429416bb7c10b4f9cd65de4.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpa3VucGVuZzY2NTYyMDE_size_16_color_FFFFFF_t_70 1]: /images/20211122/772da22b65f54c2fa9567113f0376886.png [20190727124843342.png]: /images/20211122/ac66271ec1314551903baa01d6e33b4c.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpa3VucGVuZzY2NTYyMDE_size_16_color_FFFFFF_t_70 2]: /images/20211122/8fa867079582424b9a174c9ea6c71190.png [20190727124955302.png]: /images/20211122/b90c9935bd88449ab946ef6e67139935.png [20190727125011170.png]: /images/20211122/1a550ecb36da45a3bbe0d9b730020dbe.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpa3VucGVuZzY2NTYyMDE_size_16_color_FFFFFF_t_70 3]: /images/20211122/5cc319c5384543d3b731f356320ca6ab.png
还没有评论,来说两句吧...