какую область (application, servletContext, httpSession) EL будет использовать для интерпретации атрибутов - PullRequest
4 голосов
/ 27 июля 2010

когда я использую <c:out value="${track}"> в jsp, где должен находиться атрибут track (servletContext, httpSession и request)?

Я попытался установить контроллер для установки атрибута trackна httpSession, но тогда ${track} ничего не дает мне в .jsp.С другой стороны, если я установлю его на servletContext, ${track} даст мне значение.Это не кажется правильным.Можете ли вы указать направление передачи атрибутов между .jsp (используя jstl) и контроллерами (.java)?Заранее спасибо.

1 Ответ

4 голосов
/ 27 июля 2010

Под капотом будет использоваться JspContext#findAttribute() для поиска атрибута.В связанном javadoc упоминается следующее:

Выполняет поиск именованного атрибута в странице, запросе, сеансе (если он действителен) и области (-ах) приложения в порядке и возвращает значениесвязанный или нуль.

Итак, он вернет первое ненулевое значение, найденное после поиска в порядке областей страниц, запросов, сеансов и приложений (servletcontext).

Если у вас естьатрибуты с одинаковыми именами в нескольких областях и / или вы хотите получить атрибут из определенной области, затем вы можете получить к нему доступ с помощью карт атрибутов, доступных в ${pageScope}, ${requestScope}, ${sessionScope} и / или${applicationScope}.Например,

${requestScope.track}

См. Также:


Возвращаясь к вашей реальной проблеме: если у вас есть проблемы с доступом к атрибутам области сеанса, то это может только означать, что JSP не использует тот же сеанс, что и сервлетиспользует.Вы можете отладить его, напечатав идентификатор сеанса в сервлете следующим образом:

System.out.println(session.getId());

, а в JSP -

${pageContext.session.id}

Оба должны печатать одинаково.Если нет, то это определенно не разделяет тот же сеанс.Сеанс зависит от домена, контекста и файла cookie.

Вы можете отобразить все доступные атрибуты сеанса, просто напечатав ${sessionScope}.Он отобразит строку в формате, как описано в AbstractMap#toString(), содержащем все атрибуты сеанса.

${sessionScope}
...