Buscar o valor da Sessao

10/03/2009

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");
       
Cristian Mietlicki

Cristian Mietlicki

Curtidas 0

Respostas

Henrique Weissmann

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.
GOSTEI 0
Cristian Mietlicki

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


            }






GOSTEI 0
Cristian Mietlicki

Cristian Mietlicki

10/03/2009

Estou utilizando somente jsp e servlets , obrigado.
GOSTEI 0
Henrique Weissmann

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?
GOSTEI 0
Cristian Mietlicki

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

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.


GOSTEI 0
Cristian Mietlicki

Cristian Mietlicki

10/03/2009

Henrique você poderia mostrar por gentileza como fica em código  isso? Obrigado.
GOSTEI 0
Henrique Weissmann

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.
GOSTEI 0
Cristian Mietlicki

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.
GOSTEI 0
Henrique Weissmann

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.
GOSTEI 0
Cristian Mietlicki

Cristian Mietlicki

10/03/2009

Obrigado , Henrique ajudou muito.
GOSTEI 0
Henrique Weissmann

Henrique Weissmann

10/03/2009

Cristian,

precisando estou a disposição.
GOSTEI 0
POSTAR