Допустим, у меня есть простой сервлет входа в систему, который проверяет переданный name и создает объект User и сохраняет его в сеансе.
User user = new User();
user.setId(name);
request.getSession().setAttribute("user", user);
response.sendRedirect("index.jsp");
На странице index.jsp я получаю доступ к объекту пользователя через jsp:useBean
<jsp:useBean id="user" scope="session"
class="package.name.User"/>
<div class="panel">
Welcome ${user.id}
</div>
Это работает до сих пор.
Из документации jsp beans
Чтобы найти или создать экземпляр Bean, выполните следующие шаги в указанном порядке:
- Пытается найти Bean с указанной вами областью действия и именем.
- Определяет переменную ссылки на объект с указанным вами именем.
- Если он находит Bean, сохраняет ссылку на него в переменной. Если вы указали тип, присваивает Бину этот тип.
- Если он не находит Bean, создает его экземпляр из указанного вами класса, сохраняя ссылку на него в новой переменной. Если имя класса представляет собой сериализованный шаблон, экземпляр Bean создается с помощью java.beans.Beans.instantiate.
- Если был создан (а не обнаружен) объект Bean, и если он имеет теги или элементы body (между и ), выполняет теги body.
Вопросы:
Попытки найти Bean с указанной вами областью действия и именем
Он не определяет процесс «найти». Означает ли это, что он проверит HttpServletRequest.getSession() или просто проверит, создали ли другие страницы этот компонент или нет?
Если он не находит Bean, создает его экземпляр из указанного вами класса, сохраняя ссылку > на него в новой переменной.
На самом деле это означает, что Jsp может связать вновь созданный компонент с сеансом, используя jsp_internal_name_user. Нет ни слова о том, как Jsp хранит и находит bean-компоненты в сеансе.
Существует возможность доступа к объектам сеанса с помощью ${sessionScope.user}, что гарантирует получение «пользователя» из объекта сеанса Java. Тот самый, который я поставил сам.
Пример Java EE 5 "Книжный магазин" доступ к объектам сеанса с использованием подхода ${sessionScope.name}.
Использование только ${user} работает. И вот что меня беспокоит. Я хотел бы увидеть в спецификации конкретное предложение о процессе locate и о том, должен ли работать ${user} или это зависит от эталонной реализации JSP и/или JSTL.