要實現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,讓頁面可以獲取
項目demo見https://github.com/zengyh/MavenSpringMvcDemo.git
要實現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配置的視圖解析器:
ReturnModelDataController1.java:
RetunnModelDataController2.java:
RetunnModelDataController3.java:
RetunnModelDataController4.java:
用戶信息頁面userinfo.jsp:
效果:
方式一:通過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,讓頁面可以獲取