首页 专题 文章 代码 归档
SpringMVC处理模型数据
2020.02.01 10:38 2020.02.01 16:20

1. 处理模型数据

  • ModelAndView:处理方法返回值类型为ModelAndView时,方法体即可通过该对象添加模型数据
  • Map及Model:入参为org.springframework.ui.Model、org.springframework.ui.ModelMap或java.uti.Map时,处理方法返回时,Map中的数据会自动添加到模型中。
  • @SessionAttrihutes:将模型中的某个属性暂存到HttpSession中,以便多个请求之间可以共享这个属性
  • @ModelAttribute:方法入参标注该注解后,入参的对象就会放到数据模型中

2. 简单演示

代码:

TestController


@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView() {
    String viewName = SUCCESS;
    ModelAndView modelAndView = new ModelAndView(viewName);
    // 添加模型数据到modelAndView
    modelAndView.addObject("time", new Date());

    return modelAndView;

}

success.jsp

<h4>Hello, This Success Page!</h4>

Time:${requestScope.time}
</body>

结果:

截图-1580104799

3. 具体类型

3.1. Map类型

  • Spring MVC在调用方法前会创建一个隐含的模型对象作为模型数据的存储容器。
  • 如果方法的入参为Map或Model类型,Spring MVC会将隐含模型的引用传递给这些入参。在方法体内,开发者可以通过这个入参对象访问到模型中的所有数据,也可以向模型中添加新的属性数据

代码:

TestController

/**
 * 目标方法可以添加Map类型的参数。
 */
@RequestMapping("/testMap")
public String testMap(Map<String, Object> map) {
    System.out.println(map.getClass().getName());
    map.put("name", Arrays.asList("Tom", "Tim", "Mike"));
    return SUCCESS;
}

success.jsp

<body>
<h4>Hello, This Success Page!</h4>

<%--Time:${requestScope.time}--%>

Names: ${requestScope.name}
</body>

结果:

截图-1580110852

3.2. SessionAttributes

若希望在多个请求之间共用某个模型属性数据,则可以在控制器类上标注一个@SessionAttributes,Spring MVC 将在模型中对应的属性暂存到HttpSession中。

@SessionAttributes除了可以通过属性名指定需要放到会话中的属性外,还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中

  • @SessionAttributes(ypes=User.class)会将隐含模型中所有类型为User.class的属性添加到会话中。
  • @SessionAttributes(value={"user1","user2"})
  • @SessionAttributes(types=({User.class,Dept.class)
  • @SessionAttributes(value={"user1","user2"},types=({Dept.class})

代码:

package com.misiai.controller;

import com.misiai.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;
import java.util.Date;
import java.util.Map;

@SessionAttributes(value = {"user"}, types = {String.class})
@Controller
@RequestMapping("/test")
public class TestController {
    private static final String SUCCESS = "success";

    @RequestMapping("/testSession")
    public String testSession(Map<String, Object> map) {
        User user = new User("kuan", 18);
        map.put("user", user);
        map.put("Misiai", "misiai.com");
        return SUCCESS;
    }
}

success.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Success</title>
</head>
<body>
<h4>Hello, This Success Page!</h4>

<%--Time:${requestScope.time}--%>

Names: ${requestScope.name}

<br><br>

Request user ${requestScope.user}

<br><br>
Session user ${sessionScope.user}
<br><br>

Request Misiai ${requestScope.Misiai}

<br><br>
Session Misiai ${sessionScope.Misiai}
</body>
</html>

结果:

截图-1580111509

解释:

1、我们给类加上了@SessionAttributes(value = {"user"}, types = {String.class})注解,value是要在session共享的变量名称,types是要共享的类型。

2、我们在testSession方法中,使用map.put放置了两种类型的值,一种User,一种String,所以能在session中共享。

User user = new User("kuan", 18);
map.put("user", user);
map.put("Misiai", "misiai.com");
本节阅读完毕! (分享
二维码图片 扫描关注我们哟