目录
SpringMVC域对象共享数据
一、域对象
1. 域对象的作用
就是在一定范围内可以共享数据,通常有 3 种:
- request: 一次请求,多个资源共享数据
- session: 默认一次会话,多个请求,多个资源共享数据
- servletContext: 一个应用,多个会话,多个请求,多个资源共享同一份数据
2. 域对象生命周期
- request: 创建-请求开始,销毁-响应结束
- session: 创建-第一次调用,销毁- tomcat超时三十分钟(默认)、或者手动调用invalidate()、或者服务器非正常关闭
- servletContext: 创建-启动时,销毁-关闭时
3. 使用原则
在满足需求的前提下,能选择小范围的就不选择大范围的。
举例,一个查询列表场景,这种一般放在 request 域中,当然了放在更大的2个里面也可以,但是没必要。
因为除了查询还同时会存在增删改的功能,所以我们要每次去查询一次才可以保证数据是最新的,这时候如果放在更大的域比如 session 中,那么在一次请求中只会用到一次,其他时候这个空间就浪费掉了。
二、向域对象共享数据
1. 向 request 域对象共享数据
(1)使用 servletAPI 向 request 域对象共享数据
@Controller public class ScopeController { @RequestMapping(\"/testServletAPI\") public String testServletAPI(HttpServletRequest request){ request.setAttribute(\"testScope\", \"hello,servletAPI\"); return \"success\"; } }
在控制器方法里,设置 request 域对象中的数据,key 是testScope,value是"hello,servletAPI",最后这个请求转发到了 success.html 上。
那么在 success.html 中就可以获得域对象中的数据了,直接使用 key:
<!DOCTYPE html> <html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\"> <head> <meta charset=\"UTF-8\"> <title>Title</title> </head> <body> <p>success</p> <p th:text=\"${testScope}\"></p> </body> </html>
现在访问http://localhost:8080/springmvc/testServletAPI,
可以看到展示出了获取到的 request 域中共享的数据。
(2)使用 ModelAndView 向 request 域对象共享数据
ModelAndView 有 Model和 View的功能,Model主要用于向请求域共享数据,View主要用于设置视图,实现页面跳转。这种也是 springMVC 建议使用的方式。
注意控制器方法必须要返回 ModelAndView 类型的对象。
@RequestMapping(\"/testModelAndView\") public ModelAndView testModelAndView(){ /** * ModelAndView有Model和View的功能 * Model主要用于向请求域共享数据 * View主要用于设置视图,实现页面跳转 */ ModelAndView mav = new ModelAndView(); //向请求域共享数据 mav.addObject(\"testScope\", \"hello,ModelAndView\"); //设置视图,实现页面跳转 mav.setViewName(\"success\"); return mav; }
访问一下http://localhost:8080/springmvc/testModelAndView:
获取成功。
(3)使用 Model 向 request 域对象共享数据
这里的 Model 其实就是上面 ModelAndView 中的 Model 。
@RequestMapping(\"/testModel\") public String testModel(Model model){ model.addAttribute(\"testScope\", \"hello,Model\"); return \"success\"; }
测试一下:
获取成功。
(4)使用 map 向 request 域对象共享数据
还可以使用 map 集合来实现,这时候向 map 集合中存放的数据,就是要共享的数据:
@RequestMapping(\"/testMap\") public String testMap(Map<String, Object> map){ map.put(\"testScope\", \"hello,Map\"); return \"success\"; }
测试一下:
获取成功。
(5)使用 ModelMap 向 request 域对象共享数据
@RequestMapping(\"/testModelMap\") public String testModelMap(ModelMap modelMap){ modelMap.addAttribute(\"testScope\", \"hello,ModelMap\"); return \"success\"; }
测试一下:
获取成功。
Model、ModelMap、Map的关系
Model、ModelMap、Map类型的参数其实本质上都是 BindingAwareModelMap 类型的。
分别查看源码可知如下关系:
public interface Model{} public class ModelMap extends LinkedHashMap<String, Object> {} public class ExtendedModelMap extends ModelMap implements Model {} public class BindingAwareModelMap extends ExtendedModelMap {}
2. 向 session 域共享数据
直接使用 servlet 原生的 HttpSession 即可:
@RequestMapping(\"/testSession\") public String testSession(HttpSession session){ session.setAttribute(\"testSessionScope\", \"hello,session\"); return \"success\"; }
success 页面也需要修改了,通过 session.testSessionScope获取数据展示:
... ... <p th:text=\"${session.testSessionScope}\"></p> ... ...
重新部署访问http://localhost:8080/springmvc/testSession:
3. 向 application 域共享数据
其实这里的 application 指的就是 ServletContext 对象,用 session.getServletContext() 来获取即可:
@RequestMapping(\"/testApplication\") public String testApplication(HttpSession session){ ServletContext application = session.getServletContext(); application.setAttribute(\"testApplicationScope\", \"hello,application\"); return \"success\"; }
success.html 修改:
... ...<p th:text="${application.testApplicationScope}"></p>... ...
重新部署访问http://localhost:8080/springmvc/testApplication:
获取成功。
感谢《尚硅谷》的学习资源。
以上就是SpringMVC域对象共享数据示例详解的详细内容,更多关于SpringMVC域对象共享数据的资料请关注其它相关文章!
做猪小侠源码的代理,提供一站式服务
如果你不懂得搭建网站或者服务器,小程序,源码之类的怎么办? 第一通过本站学习各种互联网的技术 第二就是联系客服,我帮帮你搭建(当然要收取部分的费用) 第三成为我们的代理,我们提供整套的服务。