1. Model(org.springframework.ui.Model)
Model是一個接口,包含addAttribute方法,其實現類是ExtendedModelMap。
ExtendedModelMap繼承了ModelMap類,ModelMap類實現了Map接口。html
public class ExtendedModelMap extends ModelMap implements Model
Model經過如下方法向頁面傳遞參數:java
例:User1Controller.javaweb
@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.jspspring
<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.jspapp
<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>
運行結果:框架
@ModelAttribute修飾的方法會先於login調用,它把請求參數值賦給對應變量。能夠向方法中的Model添加對象,前提是要在方法中加入一個Model類型的參數。jsp
User1Controller.java能夠簡化爲:post
@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方法的返回值來設置跳轉的urlui
例: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>
運行結果:
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<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>
運行結果: