Доступ к атрибуту сеанса и преобразование в int?

#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)
  

Вопрос:

  1. Как я могу преобразовать в 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 to int ; автофиксация на самом деле является Integer to int (или int to Integer ), одинаковым для 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"));