[RESOLVIDO] Listener com Map HashMap

6 respostas
fabiomariner

olá pessoal, eis o problema:

1 - quero inicializar um Map em um Listener
2 - transferir esse Map (com alguns valores pré-definidos) para outro servlet
3 - imprimir esses valores

segue abaixo meu Listener:
public void contextInitialized(ServletContextEvent contextEvent) {	
		
		Map<Long, AlunoTO> alunos = new HashMap<Long, AlunoTO>();		//Classe Bean
		SimpleDateFormat formataData = new SimpleDateFormat("dd/MM/yyyy"); 
		Date data;
		
		try {
			data = formataData.parse("21/12/2012");
			AlunoTO aluno = new AlunoTO("1", "Aluno 01", "Curso teste  01",data);
			alunos.put((long) 1, aluno);
			 contextEvent.getServletContext().setAttribute("alunos", alunos);
			
		} catch (ParseException e) {			
			e.printStackTrace();
		}

agora meu Servlet receptor:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String valor = (String)request.getSession().getAttribute("alunos");
		System.out.println("valor: "+valor);
		//alunos.get(1);
	}

minha saída está sendo null, alguma sujestão de como proceder?

obrigado.

6 Respostas

sergiotaborda

Se bem entendi o listener a que vc se refere é chamado na inicilização do webcontainer. A forma que vc tem para transferir os dados é usando o contexto de aplicação que dura durante toda a vida da aplicação no webcontainer.
É como um session, só que dura para toda a aplicação e é o mesmo para todos os usuários (requisições e sessions).

Ora, vc já está fazendo isso no listener com

contextEvent.getServletContext().setAttribute("alunos", alunos);

Mas está usando a sessão no sevlet. Ora, obviamente não vai funcionar pq o contexto não é o mesmo.

Em vez disto

String valor = (String)request.getSession().getAttribute("alunos");

use isto

Map<Long, AlunoTO> alunos = (Map<Long, AlunoTO>) request.getSession().getSevletContext().getAttribute("alunos");

Repare como usa o SevletContext. Este objeto é quem contem a informação do escopo “application” num web container

fabiomariner

ótima observação, mas agora o problema é outro:

quando tento iprimir o valor usando:

System.out.println("valor: "+MapAlunos.get("1"));

ou

System.out.println("valor: "+MapAlunos.get("1").toString());

ou

for (AlunoTO aluno : alunos.values()) { System.out.println("alunos.values() > "+aluno); }

a saída é o nome do pacote + AlunoTO@132f9bcd

sabe como posso fazer para imprimir o Valor

ramilani12

Olá
Fabio

Esta saindo dessa forma prq vc nao sobrescreveu o metodo toString() da sua classe. Essa saida é a implementação padrão da classe Object

Para sobrescrever faça isso acrescente na sua classe Aluno

public String toSting(){
   return this.atributo_da_classe
}

Ou utilize os metodos getters and setters…

fabiomariner

usando o método acima funcionou quando declarei um Map<String, String>, mas quando passo uma String e um Objeto ?

Map<String, Objeto> alunos = new HashMap<String, Objeto>();
fabiomariner

ok ramilani, vou testar

fabiomariner

caraka bicho… era isso mesmo, muito obrigado a todos

Criado 18 de dezembro de 2012
Ultima resposta 18 de dez. de 2012
Respostas 6
Participantes 3