#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, это, должно быть, произошло.