SpringMVC笔记(3)-域对象数据共享与视图
向域中共享数据
在SpringMVC中,我们可以在程序中向域中共享数据。共有三种域,分别是Request域、Session域以及Application域。Request域的有效区域在一个Request请求中;Session域的有效区域在浏览器和服务器的一次连接中,对应一个Session;Application域的有效区域在服务器启动后,对应一次服务器的启动。
在域中共享数据,可以实现动态数据的效果。视图获取到域中的数据然后进行展示。在Thymeleaf中,我们可以访问到不同域中的数据,通过${}
表达式即可:
1 |
|
Request域
向Request域中共享数据有很多种方式,下面分别进行介绍。
第一种方式是通过ServletAPI的方式,调用setAttribute方法:
1 |
|
第二种方式是使用ModelAndView方式:
1 |
|
这种方式也是SpringMVC推荐使用的方式。ModelAndView结合了Model和View的功能,Model主要用于向请求域中共享数据,而View主要用来设置视图,实现页面跳转。注意这里控制器方法的返回值,我们说控制器方法要返回一个视图。前面我们都是通过返回视图名称字符串的形式,实际上最终底层返回的都是ModelAndView。
第三种方式是通过Model、Map或者ModelMap来向Request域对象中共享数据。这三者联系紧密,这里一并进行说明。
利用Model:
1 |
|
利用Map:
1 |
|
利用ModelMap:
1 |
|
实际上,Model、ModelMap、Map类型的参数,本质上都是BindingAwareModelMap类型,它们之间存在继承或实现的关系:
1 |
|
Session域
向Session域中共享数据可以通过HttpSession相关API来实现:
1 |
|
Application域
向Application域中共享数据可以通过HttpSession相关API来实现:
1 |
|
视图
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/>