SpringMVC笔记(3)-域对象数据共享与视图

向域中共享数据

在SpringMVC中,我们可以在程序中向域中共享数据。共有三种域,分别是Request域、Session域以及Application域。Request域的有效区域在一个Request请求中;Session域的有效区域在浏览器和服务器的一次连接中,对应一个Session;Application域的有效区域在服务器启动后,对应一次服务器的启动。

在域中共享数据,可以实现动态数据的效果。视图获取到域中的数据然后进行展示。在Thymeleaf中,我们可以访问到不同域中的数据,通过${}表达式即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Success</title>
</head>
<body>
<h1>Success</h1>
Request域:<p th:text="info"></p>
Session域:<p th:text="session.info"></p>
Application域:<p th:text="application.info"></p>
</body>
</html>

Request域

向Request域中共享数据有很多种方式,下面分别进行介绍。

第一种方式是通过ServletAPI的方式,调用setAttribute方法:

1
2
3
4
5
@RequestMapping("/testRequestScope1")
public String testRequestScope(HttpServletRequest request) {
request.setAttribute("info", "HttpServletRequest");
return "success";
}

第二种方式是使用ModelAndView方式:

1
2
3
4
5
6
7
8
9
@RequestMapping("/testRequestScope2")
public ModelAndView testRequestScope() {
ModelAndView modelAndView = new ModelAndView();
// 向Request域中共享数据
modelAndView.addObject("info", "ModelAndView");
// 设置视图,实现页面跳转
modelAndView.setViewName("success");
return modelAndView;
}

这种方式也是SpringMVC推荐使用的方式。ModelAndView结合了Model和View的功能,Model主要用于向请求域中共享数据,而View主要用来设置视图,实现页面跳转。注意这里控制器方法的返回值,我们说控制器方法要返回一个视图。前面我们都是通过返回视图名称字符串的形式,实际上最终底层返回的都是ModelAndView。

第三种方式是通过Model、Map或者ModelMap来向Request域对象中共享数据。这三者联系紧密,这里一并进行说明。

利用Model:

1
2
3
4
5
@RequestMapping("/testRequestScope3")
public String testRequestScope(Model model) {
model.addAttribute("info", "Model");
return "success";
}

利用Map:

1
2
3
4
5
@RequestMapping("/testRequestScope4")
public String testRequestScope(Map<String, Object> map) {
map.put("info", "Map");
return "success";
}

利用ModelMap:

1
2
3
4
5
@RequestMapping("/testRequestScope5")
public String testRequestScope(ModelMap modelMap) {
modelMap.addAttribute("info", "ModelMap");
return "success";
}

实际上,Model、ModelMap、Map类型的参数,本质上都是BindingAwareModelMap类型,它们之间存在继承或实现的关系:

1
2
3
4
public class BindingAwareModelMap extends ExtendedModelMap;
public class ExtendedModelMap extends ModelMap implements Model;
public interface Model;
public class ModelMap extends LinkedHashMap<String, Object>;

Session域

向Session域中共享数据可以通过HttpSession相关API来实现:

1
2
3
4
5
@RequestMapping("/testSessionScope")
public String testSessionScope(HttpSession session) {
session.setAttribute("info", "SessionInfo");
return "success";
}

Application域

向Application域中共享数据可以通过HttpSession相关API来实现:

1
2
3
4
5
6
@RequestMapping("/testApplicationScope")
public String testApplicationScope(HttpSession session) {
ServletContext application = session.getServletContext();
application.setAttribute("info", "ApplicationInfo");
return "success";
}

视图

SpringMVC中的视图View,这是一个接口,主要作用是数据渲染,将模型Model中的数据展示给用户。SpringMVC中视图默认有转发视图和重定向视图。

当控制器方法中所设置的视图名称没有任何前缀的时候,此时的视图名称会被SpringMVC配置文件中所配置的视图解析器解析,对应的视图名称会拼接前缀和后缀。我们使用了Thymeleaf,在SpringMVC配置文件中配置了对应的视图解析器,解析后得到ThymeleafView。最后是通过转发的方式实现跳转。

SpringMVC中默认的转发视图是InternalResourceView。当控制器方法中所设置的视图名称前缀为forward:时,SpringMVC会创建InternalResourceView视图,此时视图名称不会被SpringMVC配置文件中所设置的视图解析器所解析,而是会将前缀去掉,剩余部分作为最终路径转发。

SpringMVC中默认的重定向视图是RedirectView。当控制器方法中所设置的视图名称前缀为redirect:时,SpringMVC会创建RedirectView视图,此时视图名称不会被SpringMVC配置文件所配置的视图视图解析器所解析,而是会将前缀去掉,剩余部分作为最终路径进行重定向。

如果控制器方法只用来实现页面跳转,即只设置了视图名称而没有其他操作时,我们可以用view-controller标签来代替,在SpringMVC配置文件中添加如下内容,可以理解为基于XML的请求映射:

1
<mvc:view-controller path="/testView" view-name="success"></mvc:view-controller>

其中,path用来设置处理的请求地址,view-name用来设置请求地址所对应的视图名称。

但是需要注意的时,当SpringMVC中设置了任何一个view-controller,其他基于注解的控制器方法对应的请求映射将会失效,此时需要在配置文件中开启基于注解的驱动,利用如下标签即可:

1
<mvc:annotation-driven/>

SpringMVC笔记(3)-域对象数据共享与视图
http://example.com/2022/10/17/SpringMVC笔记-3-域对象数据共享与视图/
作者
EverNorif
发布于
2022年10月17日
许可协议