Области видимости Session scope и Request scope в Spring MVC. Работа с объектами
Обзор различных областей видимости объектов — session scope и request scope в Spring MVC. Работа с объектами.
Обзор приложения Spring MVC + AngularJS + Bootstrap + HTML5
Используемые технологии и библиотеки
- Spring MVC 4.2.4.Release
- Maven 3.2.5
- IntelliJ IDEA 15.0.2
1. Описание задачи
Рассмотреть на примере как сохранять объекты в различных областях видимости приложения Spring MVC: Request scope, Session Scope. Рассмотреть часто встречающуюся задачу — как сохранить объект в сессии приложения Spring MVC.
2. Структура проекта
Как и в предыдущих частях здесь используется пара java класс-контроллер и его представление. В классе ScopeController будет записываться объект, который будет доступен либо на протяжении жизни сессии, либо только запроса. Там же предусмотрен метод сброса сессии. В представлении scope.jsp будет виден результат работы контроллера.
3. Файлы конфигурации Spring
Для темы данной статьи нет необходимости менять какую-либо конфигурацию или добавлять зависимости. Поэтому все настройки можете посмотреть в предыдущих частях или скачать исходный код в конце страницы.
4. ScopeController
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
package ru.javastudy.mvcHtml5Angular.mvc.scope; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; /** * Created for JavaStudy.ru on 03.03.2016. */ @Controller public class ScopeController { @RequestMapping(value = "/scopeSession", method = RequestMethod.GET) public ModelAndView scopeExample(HttpSession session) { System.out.println("ScopeController scopeSession() is called"); session.setMaxInactiveInterval(3600); session.setAttribute("sessionObject", "Value is session object"); return new ModelAndView("/scope/scope"); } @RequestMapping(value = "/invalidateSession", method=RequestMethod.GET) public ModelAndView invalidateSession(HttpSession session) { System.out.println("ScopeController invalidate is called"); session.invalidate(); return new ModelAndView("/scope/scope"); } @RequestMapping(value = "/scopeRequest", method=RequestMethod.GET) public ModelAndView requestScopeExample(HttpServletRequest request) { System.out.println("ScopeController requestScopeExample is called"); request.setAttribute("requestObject", "This is request object"); return new ModelAndView("/scope/scope"); } } |
В первом методе в качестве аргумента передается HttpSession session. В нее записываем объект с именем sessionObject и временем жизни 1 час. Далее метод возвращает адрес для поиска представления (переход к scope.jsp).
Второй метод аннулирует сессию.
Следующий метод аналогичен первому, но пишет объект в область видимости request.
5. Представление scope.jsp
scope.jsp:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
<!DOCTYPE html> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> <%@ taglib prefix="page" tagdir="/WEB-INF/tags" %> <page:template> <jsp:body> <!-- Page Content --> <div class="container"> <!-- Page Heading/Breadcrumbs --> <div class="row"> <div class="col-lg-12"> <h1 class="page-header">Сохранение объекта <small>в session, request, view scope</small> </h1> <ol class="breadcrumb"> <li><a href="index.html">Home</a> </li> <li class="active">Пример работы с scope</li> </ol> </div> </div> <!-- /.row --> <c:url value="/scopeSession" var="scopeSession" /> <c:url value="/invalidateSession" var="invalidateSession" /> <c:url value="/scopeRequest" var="scopeRequest" /> <c:url value="/file.html" var="file" /> <!-- Content Row --> <div class="row"> <div class="col-lg-12"> <p>Объект в сессии </p> <p><a href="${scopeSession}">Set object in session</a> </p> <p> <a href="${invalidateSession}">Invalidate Session</a> </p> <p><b>SessionScope attribute:</b> ${sessionScope.sessionObject} </p> <br /> <p>Объект в области видимости request</p> <a href="${scopeRequest}">Set object in request</a> <p><b>Request attribute: </b> ${requestScope.requestObject} </p> <br /> <p><a href="${file}">Проверить на другой странице</a></p> </div> </div> <!-- /.row --> <hr> </div> <!-- /.container --> </jsp:body> </page:template> |
Объекты из разных областей видимости вызываются с помощью такой записи:
1 2 3 4 5 |
<p>Объект в сессии </p> <p><b>SessionScope attribute:</b> ${sessionScope.sessionObject} </p> <p>Объект в области видимости request</p> <p><b>Request attribute: </b> ${requestScope.requestObject} </p> |
Объект в области видимости request будет обновляться при каждом новом запросе (например просто обновив страницу). Для того, чтобы проверить сохранение объекта в сессии в конце страницы была добавлена ссылка на переход к другому представлению (file.jsp), где так же вызывается ${sessionScope.sessionObject}.
file.jsp:
1 2 3 4 5 6 7 |
..... <br /> <%--Объект из примера scope.jstl--%> <c:if test="${not empty sessionScope.sessionObject}"> <p>Объект в области видимости session:</p> <b>${sessionScope.sessionObject}</b> </c:if> |
6. Запуск приложения
Запустим приложение и посмотрим результат сохранения объектов.
Как видите объект в сессии доступен на разных страницах для одного и того же пользователя.
Работа с объектами в других областях видимости строится аналогично.
Можеть быть интересно
На сайте есть еще одна по теме как сохранить объект в сессии, в которой описан другой подход к работе с объектами.
Исходные коды
MVC_AngularJS_Html5 full project — полный проект Spring MVC + AngularJS + Bootstrap + HTML5.
12. Session and Request scopes — код для этой части