Variavel Session

14 respostas
C

Fala Pessoal.

Estou com um pequeno problema aonde não consigo ressolver.

Tenho uma aplicação em JSP e estou precisando recuperar um valor de uma session de outra pagina.

Pagina1.jsp

session.setAttribute("cod_material", rs.getInt("id"));

O Problema que preciso pegar esse valor na Pagina2

Pagina2.jsp

Não sei se está certo mas dá erro sempre.

int cod = session.getAttribute("cod_material");

Não sei se está certo ou se tem outras formas de pegar os valores de session ou enviar por outra forma.

algum pode me ajudar ?

Valeu.

14 Respostas

F

Tenho uma aplicação em JSP e estou precisando recuperar um valor de uma session de outra pagina.

Cara existe uma sessão por cliente e não uma sessão por página.

Tente tranformar para Integer acho que na sessão vc não pode colocar tipos primitivos.

session.setAttribute("cod_material", Integer.valueOf(s.getInt("id")));
F

Esqueci de uma coisa vc vai ter que fazer um cast aqui, a sessão sempre retorna um object

int cod = (Integer) session.getAttribute("cod_material");
C

Flavio Muito Obrigado!

Você me ajudou muitoooooooo.

Valeu.

Clei

F

Valeu

A

Um esclarecimento, o session trabalha assim:

session.setAttribute(String textoReferencia, Object objetoEnviado);

então não é necessário lançar valueOf ou qualquer coisa, já que o valor repassado no session será sempre do tipo String, e o valor recebido será qualquer tipo derivado do Object.
Dêem uma olhada neste link que fica um pouco mais claro (que é a documentação)

F

Então mais é isso que esta acontecendo acima o cleiflavio precisa colocar um numero na sessão que é um int como eu falei primitivos não podem ser colocados na sessão então falei para ele colocar um objeto que é um Integer.

A

Aí que está o erro, todos os primitivos podem ser um Object, se você tentar compilar isso por exemplo:

int i = 10;
		String t = "teste";
		long n = 1l;
		char c = 'a';
		double d = 0.0;
		float f = 1231f;
		
		Object obj;
		obj = i;
		obj = t;
		obj = n;
		obj = c;
		obj = d;
		obj = f;

você não vai objetr nenhum erro, porque todos estes tipos são obrigatoriamente um object.
então o maior problema que você terá será a conversão desse tipo no momento da captura do objeto de sessão.

F

Na verdade ele são convertidos automaticamente para integer, mais primitivos não são objetos.
Rode isso;

int i = 0;

Object obj = i;

if(obj instanceof Integer){

System.out.println(“É integer);

}
A

Não estou dizendo que É um objeto, estou dizendo que a origem de todos é Object, mas como o escopo aqui é a sessão, e de qualquer forma um casting ou um parse tem que acontecer, não tem o porquê em não passar o tipo primitivo diretamente. Se você acessar cada um dos tipos primitivos do java, você verá isso logo no inicio da documentação:

Integer

java.lang
Class Integer

java.lang.Object <<<<<<<<<<<<<<
extended by java.lang.Number
extended by java.lang.Integer

String

java.lang
Class String

java.lang.Object <<<<<<<<<<<<<<
extended by java.lang.String

Double

java.lang
Class Double

java.lang.Object <<<<<<<<<<<<<<
extended by java.lang.Number
extended by java.lang.Double

todos tem base no tipo Object, por isso não difere passar um valueOf, por exemplo, de um tipo primitivo.
O exemplo que você me passou para rodar não está errado, mas o instanceof ele pode ser chamado de um verificador, ele nada mas verifica se o objeto passado é pertencente a uma classe, que no caso seria a classe que você está querendo obter, ou não, e como o nosso colega postou a dúvida aqui de como capturar este valor, já sabendo o que esperar, que no caso é o id como int, não tería a necessidade de um instanceof como o exemplo que você repassou. Não está errado, só estou colocando uma forma mais direta a modo de enxugar o scriplet.

D

andre.froes:
Não estou dizendo que É um objeto, estou dizendo que a origem de todos é Object, mas como o escopo aqui é a sessão, e de qualquer forma um casting ou um parse tem que acontecer, não tem o porquê em não passar o tipo primitivo diretamente. Se você acessar cada um dos tipos primitivos do java, você verá isso logo no inicio da documentação:

Integer

java.lang
Class Integer

java.lang.Object <<<<<<<<<<<<<<
extended by java.lang.Number
extended by java.lang.Integer

String

java.lang
Class String

java.lang.Object <<<<<<<<<<<<<<
extended by java.lang.String

Double

java.lang
Class Double

java.lang.Object <<<<<<<<<<<<<<
extended by java.lang.Number
extended by java.lang.Double

todos tem base no tipo Object, por isso não difere passar um valueOf, por exemplo, de um tipo primitivo.
O exemplo que você me passou para rodar não está errado, mas o instanceof ele pode ser chamado de um verificador, ele nada mas verifica se o objeto passado é pertencente a uma classe, que no caso seria a classe que você está querendo obter, ou não, e como o nosso colega postou a dúvida aqui de como capturar este valor, já sabendo o que esperar, que no caso é o id como int, não tería a necessidade de um instanceof como o exemplo que você repassou. Não está errado, só estou colocando uma forma mais direta a modo de enxugar o scriplet.


Não, camarada, você está equivocado.
Todos os primitivos (int, long, char, double, boolean) são tipos primitivos, não objetos.
Java permite, a partir da versão 5, que classes wrapper (Integer, Long, Character, Double, Boolean) sejam instanciadas automaticamente quando fazemos associação de objetos e primitivos.

Tanto é que você não consegue fazer isso:

int nulo = null;

mas consegue

Integer nulo = null;

pois tipos primitivos não podem ser nulos.

Quando você faz

int e = 0;
Object o = e;

Você está fazendo

int e = 0;
Object o = new Integer(e);

como o wrapper de int é Integer e Integer é uma classe, instanciar um objeto de Object a partir de uma Integer que herda (extende) Object é plenamente possível.

Outro erro no teu ponto de vista e comentário é sobre o cast.
Cast, nada mais é que um parse explícito, realizado a partir de um tipo de objeto que está contido em outro que o suporte.
Esse suporte é definido por uma série de fatores, por exemplo, até a versão 1.4 do java, não existia suporte à generalização, assim, a classe java.util.List não continha o <Object> em sua declaração. Isso forçava a necessidade de um cast, para indicar o tipo de objeto a ser resgatado da lista.
O parse em si, a conversão, em português, é algo que irá ser tentado pela JVM, considerando aspectos gerais, entre objeto de um tipo de classe para outro, sem garantias que isso possa ocorrer (não que no cast haja garantias). Tanto é, que é necessário colocar o trecho do parse em um try/catch ou declarar o método que o contém como possível lançador de exception (throws).

Para finalizar, tipos primitivos são, pura e simplesmente, tipos primitivos.
Classes são estruturas que, dentro do java, são filhas de Object, podem ser nulas e, principalmente, podem conter tipos primitivos variados, enquanto que, um int, por exemplo, suporta apenas ints e chars.

F

Entendi oque ta acontecendo é que estou estou estudando para scwcd e devo ter pegado algum similado de 1.4 que essas conversões não eram automáticas, e tem uma questão que a resposta certa é que não pode colocar primitivos na sessão.

A

quando disse isso, me referi a forma como o usuário vai realizar a conversão, não estou me referindo a serem coisas distintas

também estou ciente disto, na documentação isso tudo está bem explicito, o ponto que gerou esse debate foi a respeito da forma de ser repassado um valor via session, que pode ser passado qualquer valor primitivo, já que o setattribute do session recebe como parametros um String contendo o nome da variavel a ser capturada posteriormente e um Object, e não havendo a necessidade de

Integer.valueOf(s.getInt("id"))

Esse valor poderia ser repassado apenas como

session.setAttribute("cod_material", s.getInt("id"));

já que todas as classes são filhas de Object, esse é o ponto de esclarecimento. :lol:

D

andre.froes:

de qualquer forma um casting ou um parse tem que acontecer

quando disse isso, me referi a forma como o usuário vai realizar a conversão, não estou me referindo a serem coisas distintas

também estou ciente disto, na documentação isso tudo está bem explicito, o ponto que gerou esse debate foi a respeito da forma de ser repassado um valor via session, que pode ser passado qualquer valor primitivo, já que o setattribute do session recebe como parametros um String contendo o nome da variavel a ser capturada posteriormente e um Object, e não havendo a necessidade de

Integer.valueOf(s.getInt("id"))

Esse valor poderia ser repassado apenas como

session.setAttribute("cod_material", s.getInt("id"));

já que todas as classes são filhas de Object, esse é o ponto de esclarecimento. :lol:

Independente de ser sobre isso ou sobre aquilo, o que me pareceu (e acredito, para os demais também) é que você estava afirmando que primitivos e classes são a mesma coisa.
Temos que tomar cuidado com o que escrevemos aqui, afinal, não apenas quem está envolvido no tópico, mas todas as pessoas que porventura possuam a mesma dúvida.

Por isso, precisamos deixar claro o que é certo, a forma de se fazer e/ou de não se fazer.

G

Ficou bem confuso a forma como andre.froes se referiu aos primitivos/wrappers como se fossem a mesma coisa. A resposta era simplesmente isso:

Criado 19 de dezembro de 2011
Ultima resposta 20 de dez. de 2011
Respostas 14
Participantes 5