Spring中Model、ModelMap及ModelAndView之間的區別
1. Model(org.springframework.ui.Model)
Model是一個介面,包含addAttribute方法,其實現類是ExtendedModelMap。
ExtendedModelMap繼承了ModelMap類,ModelMap類實現了Map介面。
Model通過以下方法向頁面傳遞引數:
Model addAttribute(String attributeName, Object attributeValue);
例: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頁面傳入的引數
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";
}
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>
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 User 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方法。通過以下方法向頁面傳遞引數:
ModelMap addAttribute(String attributeName, Object attributeValue)
在檢視層通過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頁面傳入的引數
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";
}
}
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的例項是由使用者手動建立的,這也是和ModelMap的一個區別。ModelAndView物件有兩個作用:
(1) 設定url地址(這也是ModelAndView和ModelMap的主要區別)。
(2) 把controller方法中處理的資料傳到jsp頁面,在controller方法中把jsp介面需要的資料放到ModelAndView物件中即可。然後return mv。它的作用類似request物件的setAttribute方法。通過以下方法向頁面傳遞引數:
ModelAndView addObject(String attributeName, Object attributeValue)
在介面上可以通過el變數方式${key}來獲取ModelAndView中的資料。
可通過以下方法設定檢視:
void setViewName(String viewName)
controller方法的返回值如果是ModelAndView,則其即包含模型資料資訊,又包含檢視資訊,這樣SpringMVC將使用包含的檢視對模型資料進行渲染。
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");
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;
}
}
前臺:result3.jsp
<body>
訪問ModelAndView中的資料:${user.loginname}<br>
訪問ModelAndView中的資料:${user.password}<br>
訪問ModelAndView中的資料:${user.username}<br>
</body>
相關文章
- SpringMVC裡的Model、Map、ModelMap以及ModelAndViewSpringMVCView
- ModelAndView 配置與使用View
- ModelAndView導包路徑問題View
- 架構師學習-springmvc-ModelMap、Model、Map(四十六)架構SpringMVC
- Vue中computed、methods和watch之間的區別Vue
- [譯] Jquery中 .bind() .live() .delegate() 和 .on() 之間的區別jQuery
- Python中堆、棧、佇列之間的區別Python佇列
- Oracle與OpenJDK之間的區別OracleJDK
- 敏捷和 Scrum 之間的區別敏捷Scrum
- PrepareStatement與Statement之間的區別REST
- Statement和PreparedStatement之間的區別
- @PathVariable @RequestParam @RequestBody @ModelAttribute的區別及RestTemplate呼叫方式REST
- ASP.NET Core中GetService()和GetRequiredService()之間的區別ASP.NETUI
- Spring中Filter和Interceptor的區別SpringFilter
- select、poll、epoll之間的區別
- @Bean和@Component之間的區別?Bean
- MVC,MVP和MVVM之間的區別MVCMVPMVVM
- JavaSE、JavaEE、JavaME之間的區別概述Java
- GCD與NSOperation之間的區別GC
- PHP abstract與interface之間的區別PHP
- reboot和init 6之間的區別boot
- WCF、WebAPI、WCFREST、WebService之間的區別WebAPIREST
- springboot中擴充套件ModelAndView實現asp.net core mvc的ActionResult效果Spring Boot套件ViewASP.NETMVC
- 虛擬機器中的快照和備份之間的區別虛擬機
- spring、springmvc、springboot、springcloud 之間的聯絡和區別SpringMVCSpring BootGCCloud
- spring中的FactoryBean與ObjectFactory的區別SpringBeanObject
- Yii 框架Model和ActiveRecord 的區別框架
- (第二講)Spring&Spring MVC&Spring Boot三者之間的區別與聯絡MVCSpring Boot
- 詳解 Flink DataStream中min(),minBy(),max(),max()之間的區別AST
- Java中Statement與PreparedStatement與CallableStatement之間的區別 - javarevisitedJava
- 在Linux中,BASH 和 DOS之間的區別是什麼?Linux
- Mybatis中#{}和${}傳參的區別及#和$的區別小結MyBatis
- spring配置中classpath和classpath*的區別Spring
- querySelector和getElementById之間的區別
- hadoop發行版本之間的區別Hadoop
- tali -f 和 tail -F 之間的區別AI
- 公共雲和私有云之間的區別
- 【轉】理解 CI 和 CD 之間的區別