SpringMVC学习总结(四)使用ModelAndView、Model、Map、ModelMap向request域对象共享数据/向session、application域对象共享数据

我们知道,四大域对象包括:pageContext、request、session和application,而pageContext有效范围为一个jsp页面,太小了,而application有效范围为整个web工程,又太大了。因此我们平时的开发中在域对象中共享数据主要是用request和session。

我们来搭建本博客的环境
首先,创建一个 web 模块并配置好web.xml和部署Tomcat
其次,在webapp/WEB-INF/templates/下创建index.html和target.html(名字任取)文件。
然后,编写跳转到首页index.html的请求控制器controller代码:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class IndexController {

    @RequestMapping("/")
    public String testRequestMapping(){
        return "index";
    }
}

一、向 request 域对象共享数据

(一)使用ServletAPI向request域对象共享数据

案例

controller:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;

@Controller
public class MyController {

    @RequestMapping(value = "/testRequestByServletAPI")
    public String testRequestByServletAPI(HttpServletRequest request){
        request.setAttribute("testRequestScope","hello servletAPI");
        return "target";
    }
}

index.html:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org"><!--这个是thymeleaf命名空间-->
<head>
	<meta charset="UTF-8">
	<title>首页</title>
</head>
<body>
这是index.html<br>
<a th:href="@{/testRequestByServletAPI}">通过servletAPI向request域对象共享数据</a>
</body>
</html>

target.html:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
	<meta charset="UTF-8">
	<title>Title</title>
</head>
<body>
这是target.html<br>
<p th:text="${testRequestScope}"></p>
<!--这是thymeleaf的语法,访问request域中数据只需要写attribute的名字,
而如果是session域,就要写session.名字;
如果是application域,就要写application.名字-->
</body>
</html>

运行Tomcat:
在这里插入图片描述
在这里插入图片描述

(二)使用ModelAndView向request域对象共享数据(推荐)

案例
controller:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class MyController {

    @RequestMapping(value = "/testModelAndView")
    public ModelAndView testModelAndView(){
        ModelAndView mav = new ModelAndView();
        //处理模型数据,即向请求域request共享数据
        mav.addObject("testRequestScope","hello ModelAndView");
        //设置视图名称
        mav.setViewName("target");
        return mav;
    }
}

index.html:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org"><!--这个是thymeleaf命名空间-->
<head>
	<meta charset="UTF-8">
	<title>首页</title>
</head>
<body>
这是index.html<br>
<a th:href="@{/testModelAndView}">通过ModelAndView向request域对象共享数据</a>
</body>
</html>

target.html:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
	<meta charset="UTF-8">
	<title>Title</title>
</head>
<body>
这是target.html<br>
<p th:text="${testRequestScope}"></p>
<!--这是thymeleaf的语法,访问request域中数据只需要写attribute的名字,
而如果是session域,就要写session.名字;
如果是application域,就要写application.名字-->
</body>
</html>

启动Tomcat:
在这里插入图片描述
在这里插入图片描述

(三)使用Model向request域对象共享数据

案例
controller:

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class MyController {

    @RequestMapping(value = "/testModel")
    public String testModel(Model model){
        model.addAttribute("testRequestScope","hello model");
        return "target";
    }
}

index.html:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org"><!--这个是thymeleaf命名空间-->
<head>
	<meta charset="UTF-8">
	<title>首页</title>
</head>
<body>
这是index.html<br>
<a th:href="@{/testModel}">通过Model向request域对象共享数据</a>
</body>
</html>

target.html:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
	<meta charset="UTF-8">
	<title>Title</title>
</head>
<body>
这是target.html<br>
<p th:text="${testRequestScope}"></p>
<!--这是thymeleaf的语法,访问request域中数据只需要写attribute的名字,
而如果是session域,就要写session.名字;
如果是application域,就要写application.名字-->
</body>
</html>

启动Tomcat:
在这里插入图片描述
在这里插入图片描述

(四)使用map向request域对象共享数据

案例
controller:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.Map;

@Controller
public class MyController {

    @RequestMapping(value = "/testMap")
    public String testMap(Map<String,Object> map){//请求域中的内容各种各样,因此是Object
        map.put("testRequestScope","hello map");
        return "target";
    }
}

index.html:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org"><!--这个是thymeleaf命名空间-->
<head>
	<meta charset="UTF-8">
	<title>首页</title>
</head>
<body>
这是index.html<br>
<a th:href="@{/testMap}">通过Map向request域对象共享数据</a>
</body>
</html>

target.html:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
	<meta charset="UTF-8">
	<title>Title</title>
</head>
<body>
这是target.html<br>
<p th:text="${testRequestScope}"></p>
<!--这是thymeleaf的语法,访问request域中数据只需要写attribute的名字,
而如果是session域,就要写session.名字;
如果是application域,就要写application.名字-->
</body>
</html>

启动Tomcat:
在这里插入图片描述
在这里插入图片描述

(五)使用ModelMap向request域对象共享数据

案例
controller:

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class MyController {

    @RequestMapping(value = "/testModelMap")
    public String testModelMap(ModelMap modelMap){
        modelMap.addAttribute("testRequestScope","hello ModelMap");
        return "target";
    }
}

index.html:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org"><!--这个是thymeleaf命名空间-->
<head>
	<meta charset="UTF-8">
	<title>首页</title>
</head>
<body>
这是index.html<br>
<a th:href="@{/testModelMap}">通过ModelMap向request域对象共享数据</a>
</body>
</html>

target.html:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
	<meta charset="UTF-8">
	<title>Title</title>
</head>
<body>
这是target.html<br>
<p th:text="${testRequestScope}"></p>
<!--这是thymeleaf的语法,访问request域中数据只需要写attribute的名字,
而如果是session域,就要写session.名字;
如果是application域,就要写application.名字-->
</body>
</html>

启动Tomcat:
在这里插入图片描述
在这里插入图片描述

(六)Model、ModelMap、Map的关系

案例
假如我们把上面三个例子都写到一块儿,并且在控制器方法的最后输出方法参数对应实例化对象的名字:
controller:

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.Map;

@Controller
public class MyController {
    @RequestMapping(value = "/testModel")
    public String testModel(Model model){
        model.addAttribute("testRequestScope","hello model");
        System.out.println(model.getClass().getName());
        return "target";
    }

    @RequestMapping(value = "/testMap")
    public String testMap(Map<String,Object> map){//请求域中的内容各种各样,因此是Object
        map.put("testRequestScope","hello map");
        System.out.println(map.getClass().getName());
        return "target";
    }

    @RequestMapping(value = "/testModelMap")
    public String testModelMap(ModelMap modelMap){
        modelMap.addAttribute("testRequestScope","hello ModelMap");
        System.out.println(modelMap.getClass().getName());
        return "target";
    }
}

index.html:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org"><!--这个是thymeleaf命名空间-->
<head>
	<meta charset="UTF-8">
	<title>首页</title>
</head>
<body>
这是index.html<br>
<a th:href="@{/testModel}">通过Model向request域对象共享数据</a><br>
<a th:href="@{/testMap}">通过Map向request域对象共享数据</a><br>
<a th:href="@{/testModelMap}">通过ModelMap向request域对象共享数据</a>
</body>
</html>

启动Tomcat:

在这里插入图片描述
三个链接都点一遍,观察IDEA输出:
在这里插入图片描述
我们发现,Model、ModelMap、Map类型的参数其实本质上都是 BindingAwareModelMap 类型的。
而且我们通过以下的继承关系中可以看出BindingAwareModelMap是能够实例化Model、ModelMap、Map类型的。

public interface Model{}
public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>{}
public class ModelMap extends LinkedHashMap<String, Object> {}
public class ExtendedModelMap extends ModelMap implements Model {}
public class BindingAwareModelMap extends ExtendedModelMap {}

二、向 session 域对象共享数据

案例
controller:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpSession;

@Controller
public class MyController {

    @RequestMapping(value = "/testSession")
    public String testSession(HttpSession session){
        session.setAttribute("testSessionScope","hello session");
        return "target";
    }
}

index.html:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org"><!--这个是thymeleaf命名空间-->
<head>
	<meta charset="UTF-8">
	<title>首页</title>
</head>
<body>
这是index.html<br>
<a th:href="@{/testSession}">向session域对象共享数据</a><br>
</body>
</html>

target.html:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
	<meta charset="UTF-8">
	<title>Title</title>
</head>
<body>
这是target.html<br>
<p th:text="${session.testSessionScope}"></p>
<!--这是thymeleaf的语法,访问request域中数据只需要写attribute的名字,
而如果是session域,就要写session.名字;
如果是application域,就要写application.名字-->
</body>
</html>

启动Tomcat:
在这里插入图片描述
在这里插入图片描述

三、向 application 域对象共享数据

案例

controller:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;

@Controller
public class MyController {

    @RequestMapping(value = "/testApplication")
    public String testApplication(HttpSession session){
        ServletContext application = session.getServletContext();
        application.setAttribute("testApplicationScope","hello application");
        return "target";
    }
}

index.html:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org"><!--这个是thymeleaf命名空间-->
<head>
	<meta charset="UTF-8">
	<title>首页</title>
</head>
<body>
这是index.html<br>
<a th:href="@{/testApplication}">向application域对象共享数据</a><br>
</body>
</html>

target.html:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
	<meta charset="UTF-8">
	<title>Title</title>
</head>
<body>
这是target.html<br>
<p th:text="${application.testApplicationScope}"></p>
<!--这是thymeleaf的语法,访问request域中数据只需要写attribute的名字,
而如果是session域,就要写session.名字;
如果是application域,就要写application.名字-->
</body>
</html>

启动Tomcat:
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值