Fórum Buscar o valor da Sessao #3433
10/03/2009
0
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
Curtir tópico
+ 0Posts
10/03/2009
Henrique Weissmann
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
11/03/2009
Cristian Mietlicki
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
11/03/2009
Cristian Mietlicki
Gostei + 0
11/03/2009
Henrique Weissmann
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
11/03/2009
Cristian Mietlicki
Gostei + 0
11/03/2009
Henrique Weissmann
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
11/03/2009
Cristian Mietlicki
Gostei + 0
11/03/2009
Henrique Weissmann
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
11/03/2009
Cristian Mietlicki
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
11/03/2009
Henrique Weissmann
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
11/03/2009
Cristian Mietlicki
Gostei + 0
11/03/2009
Henrique Weissmann
precisando estou a disposição.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)