2010-04-18 3 views
9

Предположим, у меня есть простой сервлет входа, который проверяет пройденный name и создает объект User и сохраняет его в сеансе.Java-сервлет и JSP-доступ к одному сеансовому компоненту

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 фасоли

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

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

вопросы:

Попытки найти Bean с размахом и задаваемое имя

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

Если он не находит Bean, он запускает его из указанного вами класса, сохраняя в нем ссылку> в новой переменной.

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

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

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

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

ответ

6

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

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

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

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

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

${user.name} 

примерно решает

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

Также смотрите JSP specification и JSP EL specification.

Update 2: <jsp:useBean>, конечно не использует внутреннее имя или так, как префикс атрибутов сеанса. Цикл по всем сессии атрибуты себя, чтобы увидеть фактические ключи и значения:

<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)); 
} 
+0

Есть некоторые документы, которые в явном виде описать процесс переменных разрешающих на странице JSP? –

+0

Intellij IDEA заполняет поля переменных только в случае явного объявления. –

+1

1) Ты говоришь об ЭЛЕ? Проверьте спецификацию [JSP EL] (https://jsp.dev.java.net/spec/jsp-2_1-fr-spec-el.pdf). В двух словах, он 'PageContext # findAttribute()' определяет атрибуты в любой области. 2) Это действительно еще один аргумент, который я видел раньше. – BalusC

2

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

<jsp:useBean> элемент находит или конкретизирует компонент JavaBeans. <jsp:useBean> Первые попытки найти экземпляр Боба. Если Bean не существует, <jsp:useBean> создает экземпляр класса или сериализованного шаблона .

Поскольку «местоположения» боб идеально Allright тогда мы можем предположить, что компонент может быть доступен другим, чем конкретизации средства через <jsp:useBean>. Например, создав его в сервлет.

4

Цитируя спецификации JSP.5 JSP.1

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

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

<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); 
} 
+0

Эй, рад видеть вас здесь :) Ваш ответ действительно подходит для конкретной строки 'jsp: usebean', вы только забыли« session.setAttribute («пользователь», пользователь); 'в блоке' if';) – BalusC

+0

Я хотел бы увидеть описание процесса «найти существующий». Фактически jsp может хранить объект, используя имя пользователя user_jsp_internal. –

+0

Нет, это не так. Объект хранится с ключом атрибута, как указано в 'id'. Как еще вы могли бы получить доступ к нему в plain EL с помощью '$ {user}' и т. Д.? – BalusC

Смежные вопросы