Сервлет Java и JSP доступ к тому же бобу сессии

Скажем, у меня есть простой сервлет Входа в систему, который проверяет переданный 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 бобовой документации

Чтобы расположиться или инстанцировать Боба, берет следующие шаги, в этом порядке:

  1. Попытки определить местоположение Боба с объемом и именем Вы указываете.
  2. Определяет переменную ссылки на объект с именем, которое Вы указываете.
  3. Если это находит Боб, хранит ссылку на него в переменной. Если Вы указали тип, дает Бобу тот тип.
  4. Если это не находит Боб, инстанцирует его от класса, который Вы указываете, храня ссылку на него в новой переменной. Если имя класса представляет сериализированный шаблон, Боб инстанцирует java.beans. Beans.instantiate.
  5. Если инстанцировал (а не расположился), Боб, и если он имеет теги основного текста или элементы (между и), выполняет теги основного текста.

Вопросы:

Попытки определить местоположение Боба с объемом и именем Вы указываете

Это не указывает "определять местоположение" процесс. Это означает, что это проверит HttpServletRequest.getSession() или просто проверьте, создали ли другие страницы уже этот боб или нет?

Если это не находит Боб, инстанцирует его от класса, который Вы указываете, храня a> ссылку на него в новой переменной.

Это на самом деле означает, что Jsp может связать недавно созданный боб с сессией с помощью jsp_internal_name_user. Нет никакого слова о том, как Jsp хранит и находит бобы на сессии.

Существует опция получить доступ к объектам сессии при помощи ${sessionScope.user} и это гарантирует, что "пользователь" от объекта сессии Java будет, добираются. Тот же я поместил в один.

Использование объектов сессии Java EE 5 доступа "Книжного магазина" в качестве примера ${sessionScope.name} подход.

Используя просто ${user} работы. И это - то, что волнует меня. Я хотел бы видеть определенное предложение в спецификации о locate процесс и ли ${user} должен работать или является ли это до JSP и/или ссылочной реализации JSTL.

10
задан Lundin 7 November 2013 в 15:58
поделиться

3 ответа

В случае контроллера (сервлета), который заботится о модели, jsp: useBean полезен, только если экземпляр по умолчанию (созданный с помощью конструктора no-arg) демонстрирует другое поведение / состояние, чем несуществующий экземпляр. Например. если вы хотите иметь имя пользователя по умолчанию «Неизвестный пользователь», сделайте следующее:

public User {
    this.id = "Unknown User";
}

Иначе конечный пользователь может увидеть «Добро пожаловать» вместо «Добро пожаловать, неизвестный пользователь». В вашем конкретном случае вы можете смело его удалить. Это лишнее.

Однако я также видел аргумент, что это полезно для чистой документации. Вы можете объявить «бесполезными» экземпляры jsp: useBean в верхней части страницы JSP, чтобы иметь представление о том, какие именно модели используются на конкретной странице JSP. Хотя я считаю это довольно разумным, у меня самого никогда не было необходимости в таком способе документирования модели в JSP. Согласно комментариям, еще одним аргументом является то, что таким образом IDE, такие как IDEA и Eclipse, могут автоматически заполнять свойства bean-компонентов в EL.

Обновление : что касается поиска, он использует для этого PageContext # findAttribute () , а затем использует рефлексию / интроспекцию javabean для вызова на нем методов получения. Например.

${user.name}

примерно сводится к

out.print(pageContext.findAttribute("user").getName())

. См. Также спецификацию JSP и спецификацию JSP EL .

Обновление 2 : определенно не использует внутреннее имя или что-то вроде этого в качестве префикса атрибута сеанса. Прокрутите все атрибуты сеанса самостоятельно, чтобы увидеть фактические ключи и значения:

<c:forEach items="${sessionScope}" var="entry">
    ${entry.key} = ${entry.value}<br>
</c:forEach>

или в сервлете

for (String name : Collections.list(session.getAttributeNames())) {
   System.out.println(name + " = " + session.getAttribute(name));
}
6
ответ дан 4 December 2019 в 00:23
поделиться

Из документации:

Элемент находит или создает экземпляр компонента JavaBeans. сначала пытается найти экземпляр компонента. Если компонент не существует, создает его экземпляр из класса или сериализованного шаблона.

Поскольку «определение местоположения» bean-компонента совершенно нормально, мы можем предположить, что bean-компонент может быть доступен другими способами, кроме создания экземпляра через . Например, создав его в сервлете.

2
ответ дан 4 December 2019 в 00:23
поделиться

Цитата из спецификации JSP JSP.5.1

Базовая семантика пытается найти существующий объект, используя идентификатор и область видимости . Если объект не найден, он попытается создать объект, используя другие атрибуты .

Другими словами,

<jsp:useBean id="user" scope="session" class="package.name.User"/>

можно примерно перевести на Java как:

package.name.User user = (package.name.User)session.getAttribute("user");
if (user == null){
  user = new package.name.User();
  session.setAttribute("user", user);
}
4
ответ дан 4 December 2019 в 00:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: