- Model(org.springframework.ui.Model)
Model是一個接口,包含addAttribute方法,其實現類是ExtendedModelMap。
ExtendedModelMap繼承了ModelMap類,ModelMap類實現了Map接口。
public class ExtendedModelMap extends ModelMap implements Model
Model通過以下方法向頁面傳遞參數:
例:User1Controller.java
@Controller
public class User1Controller{private static final Log logger = LogFactory.getLog(User1Controller.class);// @ModelAttribute修飾的方法會先于login調用,該方法用于接收前臺jsp頁面傳入的參數@ModelAttributepublic 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>
運行結果:
@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";}
- 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);@ModelAttributepublic 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);@ModelAttributepublic 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>
運行結果: