Spring MVC中Controller如何将数据返回给页面

要实现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配置的视图解析器:

 
  1. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

  2. <property name="prefix" value="/jsp/" />

  3. <property name="suffix" value=".jsp" />

  4. </bean>

ReturnModelDataController1.java:

 
  1. package edu.mvcdemo.controller;

  2.  
  3. import java.util.Map;

  4.  
  5. import org.springframework.beans.factory.annotation.Autowired;

  6. import org.springframework.beans.factory.annotation.Qualifier;

  7. import org.springframework.context.annotation.Scope;

  8. import org.springframework.stereotype.Controller;

  9. import org.springframework.ui.Model;

  10. import org.springframework.ui.ModelMap;

  11. import org.springframework.web.bind.annotation.PathVariable;

  12. import org.springframework.web.bind.annotation.RequestMapping;

  13. import org.springframework.web.bind.annotation.RequestMethod;

  14. import org.springframework.web.servlet.ModelAndView;

  15. import edu.mvcdemo.model.User;

  16. import edu.mvcdemo.service.IUserService;

  17.  
  18. /**

  19. * @编写人: yh.zeng

  20. * @编写时间:2017-7-10 下午9:16:54

  21. * @文件描述: Controller中如何将model数据返回给页面的demo1

  22. */

  23. @Controller

  24. @Scope(value="singleton") //只实例化一个bean对象(即每次请求都使用同一个bean对象),默认是singleton

  25. @RequestMapping("users")

  26. public class ReturnModelDataController1 {

  27.  
  28. @Autowired

  29. @Qualifier("userService")

  30. private IUserService userService;

  31.  
  32.  
  33. /**

  34. * 方式一,通过ModelAndView返回用户信息数据到页面

  35. * @return

  36. */

  37. @RequestMapping(value="/view/{userId}/use/ModelAndView", method=RequestMethod.GET)

  38. private ModelAndView getUserInfo(@PathVariable("userId") Integer userId){

  39. User user = userService.getUserById(userId);

  40. return new ModelAndView("userinfo", "user", user);

  41. }

  42.  
  43. /**

  44. * 方式二,通过Model返回用户信息数据到页面

  45. * @return

  46. */

  47. @RequestMapping(value="/view/{userId}/use/Model", method=RequestMethod.GET)

  48. private String getUserInfo(@PathVariable("userId") Integer userId, Model model){

  49. User user = userService.getUserById(userId);

  50. model.addAttribute("user", user);

  51. return "userinfo";

  52. }

  53.  
  54.  
  55. /**

  56. * 方式三,通过ModelMap返回用户信息数据到页面

  57. * @return

  58. */

  59. @RequestMapping(value="/view/{userId}/use/ModelMap", method=RequestMethod.GET)

  60. private String getUserInfo(@PathVariable("userId") Integer userId, ModelMap model){

  61. User user = userService.getUserById(userId);

  62. model.addAttribute("user", user);

  63. return "userinfo";

  64. }

  65.  
  66. /**

  67. * 方式四,通过Map返回用户信息数据到页面

  68. * @return

  69. */

  70. @RequestMapping(value="/view/{userId}/use/Map", method=RequestMethod.GET)

  71. private String getUserInfo(@PathVariable("userId") Integer userId, Map<String,Object> model){

  72. User user = userService.getUserById(userId);

  73. model.put("user", user);

  74. return "userinfo";

  75. }

  76.  
  77. }

RetunnModelDataController2.java:

 
  1. package edu.mvcdemo.controller;

  2.  
  3. import org.springframework.beans.factory.annotation.Autowired;

  4. import org.springframework.beans.factory.annotation.Qualifier;

  5. import org.springframework.context.annotation.Scope;

  6. import org.springframework.stereotype.Controller;

  7. import org.springframework.web.bind.annotation.PathVariable;

  8. import org.springframework.web.bind.annotation.RequestMapping;

  9. import org.springframework.web.bind.annotation.RequestMethod;

  10. import org.springframework.web.bind.annotation.SessionAttributes;

  11. import org.springframework.web.servlet.ModelAndView;

  12. import edu.mvcdemo.model.User;

  13. import edu.mvcdemo.service.IUserService;

  14.  
  15. /**

  16. * @编写人: yh.zeng

  17. * @编写时间:2017-7-11 下午9:09:03

  18. * @文件描述: Controller中如何将model数据返回给页面的demo2

  19. */

  20. @Controller

  21. @Scope(value="singleton") //只实例化一个bean对象(即每次请求都使用同一个bean对象),默认是singleton

  22. @RequestMapping("users")

  23. @SessionAttributes({"user"}) //Model中key=user的数据也会存到HttpSession

  24. public class RetunnModelDataController2 {

  25.  
  26. @Autowired

  27. @Qualifier("userService")

  28. private IUserService userService;

  29.  
  30. /**

  31. * 方式五,通过@SessionAttributes将指定key的模型数据存到HttpSession,让页面可以获取

  32. * @return

  33. */

  34. @RequestMapping(value="/view/{userId}/use/SessionAttributes", method=RequestMethod.GET)

  35. private ModelAndView getUserInfo(@PathVariable("userId") Integer userId){

  36. User user = userService.getUserById(userId);

  37. return new ModelAndView("userinfo", "user", user);

  38. }

  39.  
  40. }

RetunnModelDataController3.java:

 
  1. package edu.mvcdemo.controller;

  2.  
  3. import org.springframework.beans.factory.annotation.Autowired;

  4. import org.springframework.beans.factory.annotation.Qualifier;

  5. import org.springframework.context.annotation.Scope;

  6. import org.springframework.stereotype.Controller;

  7. import org.springframework.ui.Model;

  8. import org.springframework.web.bind.annotation.ModelAttribute;

  9. import org.springframework.web.bind.annotation.PathVariable;

  10. import org.springframework.web.bind.annotation.RequestMapping;

  11. import org.springframework.web.bind.annotation.RequestMethod;

  12. import edu.mvcdemo.model.User;

  13. import edu.mvcdemo.service.IUserService;

  14.  
  15. /**

  16. * @编写人: yh.zeng

  17. * @编写时间:2017-7-11 下午9:09:03

  18. * @文件描述: Controller中如何将model数据返回给页面的demo3

  19. */

  20. @Controller

  21. @Scope(value="singleton") //只实例化一个bean对象(即每次请求都使用同一个bean对象),默认是singleton

  22. @RequestMapping("users")

  23. public class RetunnModelDataController3 {

  24.  
  25. @Autowired

  26. @Qualifier("userService")

  27. private IUserService userService;

  28.  
  29. /**

  30. * 注解@ModelAttribute用法一:

  31. * 使用@ModelAttribute注解的方法会在此Controller每个方法执行前被执行,

  32. * 指定@ModelAttribute的name或value都是一样的功能,都是作为key,将注解的方法返回的对象作为value存放到Model中,

  33. * 不指定name和value的话,则以注解的方法返回的类型名称首字母小写作为key。

  34. * @param userId ResetFul路径的请求参数

  35. * @return

  36. */

  37. @ModelAttribute(name="user")

  38. public User addAccount(@PathVariable("userId") Integer userId) {

  39. return userService.getUserById(userId);

  40. }

  41.  
  42. /**

  43. * 注解@ModelAttribute用法二:

  44. * 使用@ModelAttribute注解的方法会在此Controller每个方法执行前被执行

  45. * @param userId ResetFul路径的请求参数

  46. * @param model 模型对象,可以使用org.springframework.ui.Model、org.springframework.ui.ModelMap

  47. * 或 java.uti.Map 作为入参类型,以引用模型对象

  48. */

  49. /*@ModelAttribute

  50. public void addAccount(@PathVariable("userId") Integer userId, Model model) {

  51. User user = userService.getUserById(userId);

  52. model.addAttribute("user", user);

  53. }*/

  54.  
  55. /**

  56. * 方式六,通过@SessionAttributes将指定key的模型数据存到HttpSession,让页面可以获取

  57. * @return

  58. */

  59. @RequestMapping(value="/view/{userId}/use/ModelAttribute", method=RequestMethod.GET)

  60. private String getUserInfo(@PathVariable("userId") Integer userId){

  61. return "userinfo";

  62. }

  63.  
  64. }

RetunnModelDataController4.java:

 
  1. package edu.mvcdemo.controller;

  2.  
  3. import javax.servlet.http.HttpServletRequest;

  4. import javax.servlet.http.HttpSession;

  5. import org.springframework.beans.factory.annotation.Autowired;

  6. import org.springframework.beans.factory.annotation.Qualifier;

  7. import org.springframework.context.annotation.Scope;

  8. import org.springframework.stereotype.Controller;

  9. import org.springframework.web.bind.annotation.PathVariable;

  10. import org.springframework.web.bind.annotation.RequestMapping;

  11. import org.springframework.web.bind.annotation.RequestMethod;

  12. import edu.mvcdemo.model.User;

  13. import edu.mvcdemo.service.IUserService;

  14.  
  15. /**

  16. * @编写人: yh.zeng

  17. * @编写时间:2017-7-11 下午9:09:03

  18. * @文件描述: Controller中如何将model数据返回给页面的demo2

  19. */

  20. @Controller

  21. @Scope(value="singleton") //只实例化一个bean对象(即每次请求都使用同一个bean对象),默认是singleton

  22. @RequestMapping("users")

  23. public class RetunnModelDataController4 {

  24.  
  25. @Autowired

  26. @Qualifier("userService")

  27. private IUserService userService;

  28.  
  29. /**

  30. * 方式七,直接将数据存到HttpSession,让页面可以获取

  31. * @param userId

  32. * @param session

  33. * @return

  34. */

  35. @RequestMapping(value="/view/{userId}/use/HttpSession", method=RequestMethod.GET)

  36. private String getUserInfo(@PathVariable("userId") Integer userId, HttpSession session){

  37. User user = userService.getUserById(userId);

  38. session.setAttribute("user", user);

  39. return "userinfo";

  40. }

  41.  
  42. /**

  43. * 方式八,直接将数据存到HttpServletRequest,让页面可以获取

  44. * @param userId

  45. * @param session

  46. * @return

  47. */

  48. @RequestMapping(value="/view/{userId}/use/HttpServletRequest", method=RequestMethod.GET)

  49. private String getUserInfo(@PathVariable("userId") Integer userId, HttpServletRequest request){

  50. User user = userService.getUserById(userId);

  51. request.setAttribute("user", user);

  52. return "userinfo";

  53. }

  54.  
  55. }

用户信息页面userinfo.jsp:

 
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"

  2. pageEncoding="UTF-8"%>

  3. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

  5. <html>

  6. <head>

  7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

  8. <title>userinfo.jsp</title>

  9. </head>

  10. <body>

  11. <c:if test="${sessionScope.user != null}">

  12. <h3>HttpSession对象中也存了用户信息!用户信息如下:</h3>

  13. 用户编号:${sessionScope.user.no}

  14. <br>

  15. 用户名:${sessionScope.user.userName}

  16. <br>

  17. 年龄:${sessionScope.user.age}

  18. </c:if>

  19. <c:if test="${requestScope.user != null}">

  20. <h3>HttpServletRequest对象中存的用户信息如下:</h3>

  21. 用户编号:${requestScope.user.no}

  22. <br>

  23. 用户名:${requestScope.user.userName}

  24. <br>

  25. 年龄:${requestScope.user.age}

  26. </c:if>

  27. </body>

  28. </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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值