#java #session #servlets #casting
#java #сеанс #сервлеты #Кастинг
Вопрос:
Я сохранил идентификатор пользователя в сеансе, используя следующую команду в сервлете:
HttpSession session = request.getSession();
session.setAttribute("user", user.getId());
Теперь я хочу получить доступ к этому идентификатору пользователя из другого сервлета:
HttpSession session = request.getSession(false);
int userid = (int) session.getAttribute("user"); // This is not working
OR
User user = new User();
user.setId(session.getAttribute("user")); This ain't possible (Object != int)
Вопрос:
- Как я могу преобразовать в int и отправить идентификатор в DAO для инструкции SELECT
Комментарии:
1. Я получаю следующее исключение: java.lang. Исключение ClassCastException: app.models. Пользователь не может быть приведен к java.lang. Целое число
2. Я использовал этот целочисленный идентификатор пользователя = (Целое число) session.getAttribute («пользователь»);
3. @a k какой тип возвращаемого
user.getId()
?4. public int получает идентификатор () {возвращает идентификатор;}
5. public int получает идентификатор () {возвращаемый идентификатор;} и изменяется на Integer и его отображение (java.lang. Исключение NullPointerException) теперь
Ответ №1:
Даже если вы сохранили int
, этот метод ожидает объект, поэтому ваш int
станет Integer
из-за автоматической упаковки. Попробуйте вернуть его обратно в Integer
, и все должно быть в порядке:
int userid = (Integer) session.getAttribute("user");
Однако, если атрибут равен null, вы получите NullPointerException
здесь, так что, возможно, лучше использовать Integer
весь путь:
Integer userid = (Integer) session.getAttribute("user");
После этого вы можете безопасно проверить, userid
есть null
ли это.
РЕДАКТИРОВАТЬ: В ответ на ваши комментарии, вот что я имею в виду под «проверкой на null».
Integer userid = (Integer) session.getAttribute("user");
User user = null;
if (userid != null) {
user = new UserDAO().getUser(userid);
}
// here user will be null if no userid has been stored on the session,
// and it wil be loaded from your persistence layer otherwise.
Комментарии:
1. Я также получаю исключение NullPointerException после второго оператора.
2. После этого? Вы имеете в виду, что у вас есть
Integer userid
назначенный, а что потом? Вы проверяете его на null? Если нет, и вы пытаетесь вызвать что-либо на нем, или вы пытаетесь назначить это какому-тоint
или передать его какому-то ожидающему методуint
, NPE является естественным. Но сама строка на самом деле не может выдавать NPE. Если идентификатор пользователя равен нулю после считывания его из сеанса, это означает, что никто еще не сохранил его там.3. Я передаю его в UserDao UserDao = new UserDao(); и UserDao.getUser(идентификатор пользователя);
4. Я полагаю, вы
getUser()
ожидаетеint
. Проверьтеuserid
значение null, и если это так (у вас ничего не сохранено в сеансе как «пользователь»), избегайте этого вызова (или используйте вместо этого значение по умолчанию, если это имеет смысл: -1 или 0 или что-то еще).
Ответ №2:
Я не силен в JAVA, но раньше я делал это как
Integer.parseInt(session.getAttribute("user").toString())
Попробуйте один раз, но просто убедитесь, что check null
для session.getAttribute("user")
перед вызовом toString
Комментарии:
1. Есть
Integer
атрибут, сохраненный как session. Преобразование его вString
и обратный синтаксический анализ вint
/Integer
не дает вам многого, не так ли?2. Я не уверен, как
Object to int
работает преобразование. Если Object используетсяconverted to Integer
, а затемintValue()
, результаты могут быть хорошими. Как уже говорилось, я не силен в JAVA.3. В C это, конечно, не сработает, потому что
Object class
не будет иметь такого же размера в стеке, какint
4. На самом деле это не
Object
toint
; автофиксация на самом деле являетсяInteger
toint
(илиint
toInteger
), одинаковым дляlong
иLong
и в основном для всех примитивных оболочек. Это означает, что вы можете присвоитьInteger
значениеint
переменной, не заботясь оintValue()
или вы можете присвоитьint
значениеInteger
ссылке, не перенося какnew Integer(value)
. Когда ожидается супертипInteger
(Object
в данном случае),int
будет передан какInteger
. Это просто синтаксический сахар, добавленный в Java 1.5. Как еще можно было бы передатьint
вsetAttribute(String, Object)
?
Ответ №3:
В Java есть Integer
класс-оболочка, вы можете хранить значение int в объекте Integer
//setting
Integer intObj = new Integer(intVal);
session.setAttribute("key",intObj);
//fetching
Integer intObj = (Integer) session.getAttribute("key");
Ответ №4:
Попробуйте int userid = (Integer) session.getAttribute("user");
Комментарии:
1. получаем java.lang. Исключение NullPointerException
2. @я не уверен, почему это значение равно null, но вы можете указать,
int userid = session.getAttribute("user") == null ? (Integer) session.getAttribute("user") : 0 ;
где0
будет значение по умолчанию, если sesson возвращает null. но вам все равно нужно выяснить, почему это значение равно null, если оно не должно быть null.
Ответ №5:
Integer userid = Integer.parseInt(session.getAttribute("user"));
Ответ №6:
Я использовал это:
Integer.parseInt(session.getAttribute("String").toString())
Комментарии:
1. Почему
"String"
какgetAttribute()
аргумент? Вместо этого должно быть"user"
.
Ответ №7:
попробуйте это
int userid = Integer.parseInt(session.getAttribute("user").toString());
Ответ №8:
попробуйте это, у меня сработало: HttpSession session = request.getSession();
if (session.getAttribute("user") != null) {
userid = ((Integer) session.getAttribute("user")).intValue(); } else { userid = 0; }
Ответ №9:
Умножение двух строк из сеанса:
int z = Integer.parseInt((String)session.getAttribute("sintelestis"));
int y = Integer.parseInt((String)session.getAttribute("_embadon_akinitou"));
System.out.println("Ο Συνολικός Φόρος είναι: " (z*y));
Ответ №10:
Попробуйте этот код :
int userId=Integer.parseInt((String)session.getAttribute("user"));