要實作Controller傳回資料給頁面,Spring MVC 提供了以下幾種途徑:
- ModelAndView:将視圖和資料封裝成ModelAndView對象,作為方法的傳回值,資料最終會存到HttpServletRequest對象中!
- Model對象:通過給方法添加引用Model對象入參,直接往Model對象添加屬性值。那麼哪些類型的入參才能夠引用Model對象,有三種類型,分别是 org.springframework.ui.Model、org.springframework.ui.ModelMap 或 java.uti.Map。隻要是這些類型的入參,都是指向Model對象的,而且不管定義多少個這些類型的入參都是指向同一個Model對象!
- @SessionAttributes:通過給Controller類添加@SessionAttributes注解,該注解的name和value屬性值都是Model的key值,意思是指Model中這些key對應的資料也會存到HttpSession,不僅僅存到HttpServletRequest對象中!這樣頁面可以共享HttpSession中存的資料了!
- @ModelAttribute:使用@ModelAttribute注解的方法會在此Controller每個方法執行前被執行,指定@ModelAttribute的name或value都是一樣的功能,都是作為key,将注解的方法傳回的對象作為value存放到Model中,不指定name和value的話,則以注解的方法傳回的類型名稱首字母小寫作為key。
當然,除了上述的途徑,也可以使用傳統的方式,那就是直接使用HttpServletRequest或HttpSession對象來存資料,頁面上再去取。
注意:Model中存的資料,最終都會存放到HttpServletRequest對象中,頁面上可以通過HttpServletRequest對象擷取資料。
接下來,我們就看看demo,通過demo來了解如何通過這幾種方式實作将資料傳回給頁面。
demo場景:通過ResetFul風格的URL路徑傳遞使用者ID給Controller,Controller查詢出對應的使用者資訊傳回給頁面。
Spring MVC配置的視圖解析器:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
ReturnModelDataController1.java:
package edu.mvcdemo.controller;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import edu.mvcdemo.model.User;
import edu.mvcdemo.service.IUserService;
/**
* @編寫人: yh.zeng
* @編寫時間:2017-7-10 下午9:16:54
* @檔案描述: Controller中如何将model資料傳回給頁面的demo1
*/
@Controller
@Scope(value="singleton") //隻執行個體化一個bean對象(即每次請求都使用同一個bean對象),預設是singleton
@RequestMapping("users")
public class ReturnModelDataController1 {
@Autowired
@Qualifier("userService")
private IUserService userService;
/**
* 方式一,通過ModelAndView傳回使用者資訊資料到頁面
* @return
*/
@RequestMapping(value="/view/{userId}/use/ModelAndView", method=RequestMethod.GET)
private ModelAndView getUserInfo(@PathVariable("userId") Integer userId){
User user = userService.getUserById(userId);
return new ModelAndView("userinfo", "user", user);
}
/**
* 方式二,通過Model傳回使用者資訊資料到頁面
* @return
*/
@RequestMapping(value="/view/{userId}/use/Model", method=RequestMethod.GET)
private String getUserInfo(@PathVariable("userId") Integer userId, Model model){
User user = userService.getUserById(userId);
model.addAttribute("user", user);
return "userinfo";
}
/**
* 方式三,通過ModelMap傳回使用者資訊資料到頁面
* @return
*/
@RequestMapping(value="/view/{userId}/use/ModelMap", method=RequestMethod.GET)
private String getUserInfo(@PathVariable("userId") Integer userId, ModelMap model){
User user = userService.getUserById(userId);
model.addAttribute("user", user);
return "userinfo";
}
/**
* 方式四,通過Map傳回使用者資訊資料到頁面
* @return
*/
@RequestMapping(value="/view/{userId}/use/Map", method=RequestMethod.GET)
private String getUserInfo(@PathVariable("userId") Integer userId, Map<String,Object> model){
User user = userService.getUserById(userId);
model.put("user", user);
return "userinfo";
}
}
RetunnModelDataController2.java:
package edu.mvcdemo.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.servlet.ModelAndView;
import edu.mvcdemo.model.User;
import edu.mvcdemo.service.IUserService;
/**
* @編寫人: yh.zeng
* @編寫時間:2017-7-11 下午9:09:03
* @檔案描述: Controller中如何将model資料傳回給頁面的demo2
*/
@Controller
@Scope(value="singleton") //隻執行個體化一個bean對象(即每次請求都使用同一個bean對象),預設是singleton
@RequestMapping("users")
@SessionAttributes({"user"}) //Model中key=user的資料也會存到HttpSession
public class RetunnModelDataController2 {
@Autowired
@Qualifier("userService")
private IUserService userService;
/**
* 方式五,通過@SessionAttributes将指定key的模型資料存到HttpSession,讓頁面可以擷取
* @return
*/
@RequestMapping(value="/view/{userId}/use/SessionAttributes", method=RequestMethod.GET)
private ModelAndView getUserInfo(@PathVariable("userId") Integer userId){
User user = userService.getUserById(userId);
return new ModelAndView("userinfo", "user", user);
}
}
RetunnModelDataController3.java:
package edu.mvcdemo.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import edu.mvcdemo.model.User;
import edu.mvcdemo.service.IUserService;
/**
* @編寫人: yh.zeng
* @編寫時間:2017-7-11 下午9:09:03
* @檔案描述: Controller中如何将model資料傳回給頁面的demo3
*/
@Controller
@Scope(value="singleton") //隻執行個體化一個bean對象(即每次請求都使用同一個bean對象),預設是singleton
@RequestMapping("users")
public class RetunnModelDataController3 {
@Autowired
@Qualifier("userService")
private IUserService userService;
/**
* 注解@ModelAttribute用法一:
* 使用@ModelAttribute注解的方法會在此Controller每個方法執行前被執行,
* 指定@ModelAttribute的name或value都是一樣的功能,都是作為key,将注解的方法傳回的對象作為value存放到Model中,
* 不指定name和value的話,則以注解的方法傳回的類型名稱首字母小寫作為key。
* @param userId ResetFul路徑的請求參數
* @return
*/
@ModelAttribute(name="user")
public User addAccount(@PathVariable("userId") Integer userId) {
return userService.getUserById(userId);
}
/**
* 注解@ModelAttribute用法二:
* 使用@ModelAttribute注解的方法會在此Controller每個方法執行前被執行
* @param userId ResetFul路徑的請求參數
* @param model 模型對象,可以使用org.springframework.ui.Model、org.springframework.ui.ModelMap
* 或 java.uti.Map 作為入參類型,以引用模型對象
*/
/*@ModelAttribute
public void addAccount(@PathVariable("userId") Integer userId, Model model) {
User user = userService.getUserById(userId);
model.addAttribute("user", user);
}*/
/**
* 方式六,通過@SessionAttributes将指定key的模型資料存到HttpSession,讓頁面可以擷取
* @return
*/
@RequestMapping(value="/view/{userId}/use/ModelAttribute", method=RequestMethod.GET)
private String getUserInfo(@PathVariable("userId") Integer userId){
return "userinfo";
}
}
RetunnModelDataController4.java:
package edu.mvcdemo.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import edu.mvcdemo.model.User;
import edu.mvcdemo.service.IUserService;
/**
* @編寫人: yh.zeng
* @編寫時間:2017-7-11 下午9:09:03
* @檔案描述: Controller中如何将model資料傳回給頁面的demo2
*/
@Controller
@Scope(value="singleton") //隻執行個體化一個bean對象(即每次請求都使用同一個bean對象),預設是singleton
@RequestMapping("users")
public class RetunnModelDataController4 {
@Autowired
@Qualifier("userService")
private IUserService userService;
/**
* 方式七,直接将資料存到HttpSession,讓頁面可以擷取
* @param userId
* @param session
* @return
*/
@RequestMapping(value="/view/{userId}/use/HttpSession", method=RequestMethod.GET)
private String getUserInfo(@PathVariable("userId") Integer userId, HttpSession session){
User user = userService.getUserById(userId);
session.setAttribute("user", user);
return "userinfo";
}
/**
* 方式八,直接将資料存到HttpServletRequest,讓頁面可以擷取
* @param userId
* @param session
* @return
*/
@RequestMapping(value="/view/{userId}/use/HttpServletRequest", method=RequestMethod.GET)
private String getUserInfo(@PathVariable("userId") Integer userId, HttpServletRequest request){
User user = userService.getUserById(userId);
request.setAttribute("user", user);
return "userinfo";
}
}
使用者資訊頁面userinfo.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>userinfo.jsp</title>
</head>
<body>
<c:if test="${sessionScope.user != null}">
<h3>HttpSession對象中也存了使用者資訊!使用者資訊如下:</h3>
使用者編号:${sessionScope.user.no}
<br>
使用者名:${sessionScope.user.userName}
<br>
年齡:${sessionScope.user.age}
</c:if>
<c:if test="${requestScope.user != null}">
<h3>HttpServletRequest對象中存的使用者資訊如下:</h3>
使用者編号:${requestScope.user.no}
<br>
使用者名:${requestScope.user.userName}
<br>
年齡:${requestScope.user.age}
</c:if>
</body>
</html>
效果:
方式一:通過org.springframework.web.servlet.ModelAndView實作
方式二:通過org.springframework.ui.Model實作
方式三:通過org.springframework.ui.ModelMap實作
方式四:通過java.util.Map實作
方式五:通過org.springframework.web.bind.annotation.SessionAttributes标注指定Model中的某些資料也存儲到HttpSession中
方式六:通過org.springframework.web.bind.annotation.ModelAttribute實作
方式七:直接将資料存到HttpSession,讓頁面可以擷取
方式八:直接将資料存到HttpServletRequest,讓頁面可以擷取