HttpSession, session.getAttribute(), проблема

#java #jsp #session #servlets

#java #jsp #сессия #сервлеты

Вопрос:

У меня проблема, связанная с сеансами Java-сервлета. Я не понимаю, почему getAttribute() функция объекта сеанса использовалась раньше setAttribute(); Вот код:

 Vector buylist=(Vector)session.getAttribute("Register");
if (action.equals("del")) {
String del = request.getParameter("deli");
int d = (new Integer(del)).intValue();
buylist.removeElementAt(d);
}
session.setAttribute("Register", buylist);
  

Спасибо.

Комментарии:

1. Спросите коллегу, который это написал. Или вы, ребята, общаетесь через stackoverflow? 🙂

2. Может быть, он читает учебник.

Ответ №1:

Этот код предназначен для сохранения измененного вектора, представленного атрибутом Register session. Однако вам не нужно устанавливать атрибут обратно даже после удаления или добавления некоторых элементов, потому что его ссылка в любом случае хранится в session и любые изменения в нем по существу применяются к тому же объекту.

Ответ №2:

Поскольку Register атрибут может быть установлен из какого-либо другого места (например. из jsp (в плохом случае), сервлета или фильтра . . )

Ответ №3:

Единственное объяснение, которое я могу придумать, это: прежде всего, вы извлекаете вектор, затем вносите изменения и после сохраняете его обратно в объект сеанса.

Ответ №4:

Код либо поврежден, либо setAttribute() бесполезен.

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

  session.setAttribute("Register", buylist);
 session.setAttribute("Register", buylist);
 session.setAttribute("Register", buylist);
  

Ни одна строка, кроме первой, не имеет эффекта.

Другая возможность заключается в том, что в коде есть ошибка, и на самом деле имелось в виду следующее:

 Vector buylist = session.getAttribute("Register");
if( buylist == null ) {
    buylist = new Vector();
    session.setAttribute("Register", buylist);
}
  

т.е. создайте новый вектор, если он еще не существует.

Комментарии:

1. Я не понимаю одну вещь, разве мы не должны сначала установить атрибут, а затем использовать метод getAttribute для сеанса! Как этот код использует атрибут «Register», когда он нигде не был определен, единственный способ определить атрибут «Register» — использовать setAttribue(), а затем использовать getAttribute для сохранения его в сеансе!

2. getAttribute() вернется null для неизвестных атрибутов. Опубликованный вами код работает только в том случае, если кто-то другой уже где-то поместил Register атрибут в сеанс. Поскольку вы не получили NPE, это, должно быть, произошло.