Buscar o valor da Sessao
Boa tarde eu estou tentando pegar um objeto da sessão que se chama "usuario" , e jogar em uma String para passar como parametro em um relatorio, o problema que fora do while ele não consegue achar o objeto login. para preencher a valor do usuario. Obrigado.
List listSession = (List) httpSession.getAttribute("login");
Iterator i = listSession.iterator();
while (i.hasNext()){
Login login = (Login)i.next();
login.setUsuario(login.getUsuario());
}
Map parameter = new HashMap();
parameter.put("Marco", httpServletRequest.getParameter("marco_opr"));
parameter.put("AtividadePrincipal",Integer.parseInt(atividade_principal));
parameter.put("AtividadeSecundaria",Integer.parseInt(atividade_secundaria));
parameter.put("Usuario","1");
List listSession = (List) httpSession.getAttribute("login");
Iterator i = listSession.iterator();
while (i.hasNext()){
Login login = (Login)i.next();
login.setUsuario(login.getUsuario());
}
Map parameter = new HashMap();
parameter.put("Marco", httpServletRequest.getParameter("marco_opr"));
parameter.put("AtividadePrincipal",Integer.parseInt(atividade_principal));
parameter.put("AtividadeSecundaria",Integer.parseInt(atividade_secundaria));
parameter.put("Usuario","1");
Cristian Mietlicki
Curtidas 0
Respostas
Henrique Weissmann
10/03/2009
Olá Cristian,
vamos analisar seu problema:
List listSession = (List) httpSession.getAttribute("login");
Iterator i = listSession.iterator();
while (i.hasNext()){
Login login = (Login)i.next();
login.setUsuario(login.getUsuario());
}
Map parameter = new HashMap();
parameter.put("Marco", httpServletRequest.getParameter("marco_opr"));
parameter.put("AtividadePrincipal",Integer.parseInt(atividade_principal));
parameter.put("AtividadeSecundaria",Integer.parseInt(atividade_secundaria));
parameter.put("Usuario","1");
Aqui entram duas possibilidades:
Possibilidade 1: dentro de sua sessão se encontra armazenado um objeto do tipo Login, e não um objeto do tipo List.
Neste caso, não precisa buscar um objeto deste tipo da lista. Você poderia modificar o seu código para algo como
Login login = (Login) httpSession.getAttribute("login");
Neste caso, verifique se uma excessão do tipo ClassCastException não está sendo disparada quando você executa o código
List listSession = (List) httpSession.getAttribute("login");
Possibilidade 2:
Realmente, dentro da sessão se encontra armazenado um objeto do tipo Iterator.
Neste segundo caso Cristian, talvez o problema não se encontre neste trecho específico de código, mas sim em alguma parte anterior à execução do mesmo dentro de sua aplicação.
Vamos ver este trecho:
Iterator i = listSession.iterator();
while (i.hasNext()){
Login login = (Login)i.next();
login.setUsuario(login.getUsuario());
}
No caso, novamente pergunto: será que este Iterator realmente contém uma lista de objetos do tipo Login? Continuando na mesmo caso: será que o Iterator foi realmente enviado para a sessão?
No caso do objeto não ter ido parar para a sessão, você irá se deparar com uma excessão do tipo NullPointerException, o que já excluirá esta possibilidade.
Caso o NullPointerException não seja disparado, e um Iterator de fato esteja sendo retornado, verifique se no trecho de código responsáve por inserir este Iterator na sessão o mesmo já foi enviado populado.
Caso mesmo assim a dúvida persista, por favor, me envie mais detalhes sobre o seu problema: você esta usando algum framework ou trabalhando diretamente com Servlets/JSP? Poderia também me enviar o seu trecho de código responsável por popular este Iterator que se encontra na sessão.
Aguardo seu retorno.
vamos analisar seu problema:
List listSession = (List) httpSession.getAttribute("login");
Iterator i = listSession.iterator();
while (i.hasNext()){
Login login = (Login)i.next();
login.setUsuario(login.getUsuario());
}
Map parameter = new HashMap();
parameter.put("Marco", httpServletRequest.getParameter("marco_opr"));
parameter.put("AtividadePrincipal",Integer.parseInt(atividade_principal));
parameter.put("AtividadeSecundaria",Integer.parseInt(atividade_secundaria));
parameter.put("Usuario","1");
Aqui entram duas possibilidades:
Possibilidade 1: dentro de sua sessão se encontra armazenado um objeto do tipo Login, e não um objeto do tipo List.
Neste caso, não precisa buscar um objeto deste tipo da lista. Você poderia modificar o seu código para algo como
Login login = (Login) httpSession.getAttribute("login");
Neste caso, verifique se uma excessão do tipo ClassCastException não está sendo disparada quando você executa o código
List listSession = (List) httpSession.getAttribute("login");
Possibilidade 2:
Realmente, dentro da sessão se encontra armazenado um objeto do tipo Iterator.
Neste segundo caso Cristian, talvez o problema não se encontre neste trecho específico de código, mas sim em alguma parte anterior à execução do mesmo dentro de sua aplicação.
Vamos ver este trecho:
Iterator i = listSession.iterator();
while (i.hasNext()){
Login login = (Login)i.next();
login.setUsuario(login.getUsuario());
}
No caso, novamente pergunto: será que este Iterator realmente contém uma lista de objetos do tipo Login? Continuando na mesmo caso: será que o Iterator foi realmente enviado para a sessão?
No caso do objeto não ter ido parar para a sessão, você irá se deparar com uma excessão do tipo NullPointerException, o que já excluirá esta possibilidade.
Caso o NullPointerException não seja disparado, e um Iterator de fato esteja sendo retornado, verifique se no trecho de código responsáve por inserir este Iterator na sessão o mesmo já foi enviado populado.
Caso mesmo assim a dúvida persista, por favor, me envie mais detalhes sobre o seu problema: você esta usando algum framework ou trabalhando diretamente com Servlets/JSP? Poderia também me enviar o seu trecho de código responsável por popular este Iterator que se encontra na sessão.
Aguardo seu retorno.
GOSTEI 0
Cristian Mietlicki
10/03/2009
Bom dia , relamente o valor está na sessão , eu pego da mesma maneira em outra tela , mas o que acontece eu não quero colocar meu codigo dentro do while , pq o codigo tem que ficar dentro do while? pq fora não reconheçe o bjeto login. dentro da sessao eu tenho o usuario eo grupo eu quero capturar o usuario e jogar como parâmetro no Map. assim que está:
while (i.hasNext()){
Login login = (Login)i.next();
login.setUsuario(login.getUsuario());
}
Map parameter = new HashMap();
parameter.put("Marco", httpServletRequest.getParameter("marco_opr"));
parameter.put("AtividadePrincipal",Integer.parseInt(atividade_principal));
parameter.put("AtividadeSecundaria",Integer.parseInt(atividade_secundaria));
parameter.put("Usuario","1");
JasperPrint report = null;
ConexaoIreport conexaoIreport = new ConexaoIreport();
try{
report = JasperFillManager.fillReport(relJasper, parameter, conexaoIreport.getConnection());
JasperExportManager.exportReportToPdfFile(report, "ArquivoPdf.pdf");
httpServletResponse.setContentType("application/pdf");
byte x1[] = JasperExportManager.exportReportToPdf(report);
httpServletResponse.getOutputStream().write(x1);
Eu posso resolver dessa maneira : Mas não quero fazer assim , porque caso eu precise passar varios valores para lista vai afetar no desempenho da aplicação. Obrigado.
while (i.hasNext()){
Login login = (Login)i.next();
login.setUsuario(login.getUsuario());
Map parameter = new HashMap();
parameter.put("Marco", httpServletRequest.getParameter("marco_opr"));
parameter.put("AtividadePrincipal",Integer.parseInt(atividade_principal));
parameter.put("AtividadeSecundaria",Integer.parseInt(atividade_secundaria));
parameter.put("Usuario","login.getUsuario()");
JasperPrint report = null;
ConexaoIreport conexaoIreport = new ConexaoIreport();
try{
report = JasperFillManager.fillReport(relJasper, parameter, conexaoIreport.getConnection());
JasperExportManager.exportReportToPdfFile(report, "ArquivoPdf.pdf");
httpServletResponse.setContentType("application/pdf");
byte x1[] = JasperExportManager.exportReportToPdf(report);
httpServletResponse.getOutputStream().write(x1);
}
while (i.hasNext()){
Login login = (Login)i.next();
login.setUsuario(login.getUsuario());
}
Map parameter = new HashMap();
parameter.put("Marco", httpServletRequest.getParameter("marco_opr"));
parameter.put("AtividadePrincipal",Integer.parseInt(atividade_principal));
parameter.put("AtividadeSecundaria",Integer.parseInt(atividade_secundaria));
parameter.put("Usuario","1");
JasperPrint report = null;
ConexaoIreport conexaoIreport = new ConexaoIreport();
try{
report = JasperFillManager.fillReport(relJasper, parameter, conexaoIreport.getConnection());
JasperExportManager.exportReportToPdfFile(report, "ArquivoPdf.pdf");
httpServletResponse.setContentType("application/pdf");
byte x1[] = JasperExportManager.exportReportToPdf(report);
httpServletResponse.getOutputStream().write(x1);
Eu posso resolver dessa maneira : Mas não quero fazer assim , porque caso eu precise passar varios valores para lista vai afetar no desempenho da aplicação. Obrigado.
while (i.hasNext()){
Login login = (Login)i.next();
login.setUsuario(login.getUsuario());
Map parameter = new HashMap();
parameter.put("Marco", httpServletRequest.getParameter("marco_opr"));
parameter.put("AtividadePrincipal",Integer.parseInt(atividade_principal));
parameter.put("AtividadeSecundaria",Integer.parseInt(atividade_secundaria));
parameter.put("Usuario","login.getUsuario()");
JasperPrint report = null;
ConexaoIreport conexaoIreport = new ConexaoIreport();
try{
report = JasperFillManager.fillReport(relJasper, parameter, conexaoIreport.getConnection());
JasperExportManager.exportReportToPdfFile(report, "ArquivoPdf.pdf");
httpServletResponse.setContentType("application/pdf");
byte x1[] = JasperExportManager.exportReportToPdf(report);
httpServletResponse.getOutputStream().write(x1);
}
GOSTEI 0
Cristian Mietlicki
10/03/2009
Estou utilizando somente jsp e servlets , obrigado.
GOSTEI 0
Henrique Weissmann
10/03/2009
Ola Cristian,
bom: pelo que você me contou então, dentro da sua sessão encontra-se armazenado um objeto do tipo List.
Neste caso, realmente não há como acessar a variável login fora do loop, se a mesma já se encontra dentro de uma lista.
No entanto, se você quiser buscar apenas uma das instâncias de Login presente dentro das Listas, você pode referenciá-la diretamente pelo índice, não? Neste caso, não teria a perda de performance que está mencionando.
Claro, neste segundo caso, se a instancia de Login que voce busca não se encontrar na primeira posição, alguma perda de performance você possuirá, pois terá de percorrer a lista para encontrá-la.
No entanto Cristian, é importante mencionar que caso venha a ocorrer uma perda de performance na sua aplicação por estar iterando em cima de uma lista, esta só virá a ocorrer se houver uma quantidade gigantesca de itens dentro da mesma.
Bom: dando uma olhada na solução que você propôs, deu pra perceber que se trata de um relatório específico por login, correto? Neste caso, porque não ao invés de adicionar uma lista na sessão, como tem sido feito, não adicionar simplesmente uma única instancia de login para que você possa gerar o relatório?
Mesmo porque, na solução que você me passou, você realmente teria alguns problemas:
pra começar, se houver mais de um login, ao enviar sucessivos relatórios para o stream de saída, possívelmente eles irão ser enviados de tal modo que o usuário não conseguirá visualizá-los:
Veja bem: na primeira iteração, seria criado um stream que seria transmitido para o usuário e depois fechado.
Na segunda iteração, como o stream já foi fechado, você teria um erro do tipo IOException.
O que me diz desta solução proposta portanto?
bom: pelo que você me contou então, dentro da sua sessão encontra-se armazenado um objeto do tipo List.
Neste caso, realmente não há como acessar a variável login fora do loop, se a mesma já se encontra dentro de uma lista.
No entanto, se você quiser buscar apenas uma das instâncias de Login presente dentro das Listas, você pode referenciá-la diretamente pelo índice, não? Neste caso, não teria a perda de performance que está mencionando.
Claro, neste segundo caso, se a instancia de Login que voce busca não se encontrar na primeira posição, alguma perda de performance você possuirá, pois terá de percorrer a lista para encontrá-la.
No entanto Cristian, é importante mencionar que caso venha a ocorrer uma perda de performance na sua aplicação por estar iterando em cima de uma lista, esta só virá a ocorrer se houver uma quantidade gigantesca de itens dentro da mesma.
Bom: dando uma olhada na solução que você propôs, deu pra perceber que se trata de um relatório específico por login, correto? Neste caso, porque não ao invés de adicionar uma lista na sessão, como tem sido feito, não adicionar simplesmente uma única instancia de login para que você possa gerar o relatório?
Mesmo porque, na solução que você me passou, você realmente teria alguns problemas:
pra começar, se houver mais de um login, ao enviar sucessivos relatórios para o stream de saída, possívelmente eles irão ser enviados de tal modo que o usuário não conseguirá visualizá-los:
Veja bem: na primeira iteração, seria criado um stream que seria transmitido para o usuário e depois fechado.
Na segunda iteração, como o stream já foi fechado, você teria um erro do tipo IOException.
O que me diz desta solução proposta portanto?
GOSTEI 0
Cristian Mietlicki
10/03/2009
Henrique ai que tá é um relatório de que deve mostrar o usuario que imprimiu, nesse caso eu estou passando as instancia usuario para a sessão para pegar o usuario logado no sistema , dessa maneira ele joga só um usuario , consequentemente ele passa uma vez pelo while, mas eu achei meio feio assim.
GOSTEI 0
Henrique Weissmann
10/03/2009
Olá Cristian,
pois bem: neste caso então, a solução é simples: ao invés de incluir na sua sessão um List contendo o(s) usuário(s) logado(s), inclua apenas o usuário logado na sessão (fora da lista).
Ai não precisará iterar sobre loops e ainda poderá acessar a variável diretamente, ao invés de pegar a lista e, dentro da mesma, pegar o usuário que se encontra presente dentro dela.
pois bem: neste caso então, a solução é simples: ao invés de incluir na sua sessão um List contendo o(s) usuário(s) logado(s), inclua apenas o usuário logado na sessão (fora da lista).
Ai não precisará iterar sobre loops e ainda poderá acessar a variável diretamente, ao invés de pegar a lista e, dentro da mesma, pegar o usuário que se encontra presente dentro dela.
GOSTEI 0
Cristian Mietlicki
10/03/2009
Henrique você poderia mostrar por gentileza como fica em código isso? Obrigado.
GOSTEI 0
Henrique Weissmann
10/03/2009
Claro Cristian!
muito bem: vamos lá: primeiro (irei tratar aqui com base em suposições apenas) que na sua aplicação, no momento em que você enviou o Iterator para a Session, ao invés do objeto Login, seria algo basicamente assim:
// Supondo que em seu código exista uma função que, a partir de um login e senha, retorne um objeto do
// tipo login, que represente este usuário.
Login login = metodoQueRetornaOLoginOuUsuario(request.getAttribute("login"), request.getAttribute("senha"));
// Em seguida, incluo diretamente a minha instancia de login na sessão do usuário.
// posso inserir um Object mesmo
request.getSession().setAttribute("login", login);
Bem: agora, vamos voltar ao seu código agora:
Aonde você coloca
while (i.hasNext()){
Login login = (Login)i.next();
login.setUsuario(login.getUsuario());
}
colocaria simplesmente
Login login = (Login) request.getSession().getAttribute("login");
Qualquer coisa Cristian, estou a seu dispor para maiores esclarecimentos.
muito bem: vamos lá: primeiro (irei tratar aqui com base em suposições apenas) que na sua aplicação, no momento em que você enviou o Iterator para a Session, ao invés do objeto Login, seria algo basicamente assim:
// Supondo que em seu código exista uma função que, a partir de um login e senha, retorne um objeto do
// tipo login, que represente este usuário.
Login login = metodoQueRetornaOLoginOuUsuario(request.getAttribute("login"), request.getAttribute("senha"));
// Em seguida, incluo diretamente a minha instancia de login na sessão do usuário.
// posso inserir um Object mesmo
request.getSession().setAttribute("login", login);
Bem: agora, vamos voltar ao seu código agora:
Aonde você coloca
while (i.hasNext()){
Login login = (Login)i.next();
login.setUsuario(login.getUsuario());
}
colocaria simplesmente
Login login = (Login) request.getSession().getAttribute("login");
Qualquer coisa Cristian, estou a seu dispor para maiores esclarecimentos.
GOSTEI 0
Cristian Mietlicki
10/03/2009
Henrique Fiz dessa maneira:
Login login = (Login) httpServletRequest.getSession().getAttribute("login");
String usuario = login.getUsuario();
Deu esse erro:
java.util.LinkedList cannot be cast to com.br.beans.Login
Aguardo a sua resposta , obrigado.
Login login = (Login) httpServletRequest.getSession().getAttribute("login");
String usuario = login.getUsuario();
Deu esse erro:
java.util.LinkedList cannot be cast to com.br.beans.Login
Aguardo a sua resposta , obrigado.
GOSTEI 0
Henrique Weissmann
10/03/2009
Exato Cristian,
deu este erro pelo seguinte motivo: em sua aplicação, no momento em que incluio elemento "login" na sua sessão, está a incluir um objeto do tipo List, ao invés de um objeto do tipo Login.
(Caso tenha dúvidas com relação este trecho, pode me passar o código para que eu o explique com maiores detalhes para você)
Para resolver o problema, basta que em sua aplicação você modifique este trecho do seu código incluindo na sessão um objeto do tipo com.br.beans.Login ao invés de java.util.List e o problema será resolvido.
deu este erro pelo seguinte motivo: em sua aplicação, no momento em que incluio elemento "login" na sua sessão, está a incluir um objeto do tipo List, ao invés de um objeto do tipo Login.
(Caso tenha dúvidas com relação este trecho, pode me passar o código para que eu o explique com maiores detalhes para você)
Para resolver o problema, basta que em sua aplicação você modifique este trecho do seu código incluindo na sessão um objeto do tipo com.br.beans.Login ao invés de java.util.List e o problema será resolvido.
GOSTEI 0
Cristian Mietlicki
10/03/2009
Obrigado , Henrique ajudou muito.
GOSTEI 0
Henrique Weissmann
10/03/2009
Cristian,
precisando estou a disposição.
precisando estou a disposição.
GOSTEI 0