Reuso Servlet

Pessoal, tenho uma servlet que busca dados no BD e com estes dados preciso montar 2 jsp diferentes.
A busca no banco e chamada da servlet estão ok.
A dúvida é: Como posso fazer um redirect para 2 jsp diferentes?
Segue código

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		try {
			List<Pessoa> pessoas = new ArrayList<Pessoa>();
			PessoasDAO dao = new PessoasDAO();
			pessoas = dao.buscarPessoas();
			
			if (pessoas == null || pessoas.size() == 0) {
				getServletContext().setAttribute("errorMessage", "Não há dados no banco");			
				response.sendRedirect("");
			}
			else{
				request.setAttribute("pessoas", pessoas);
				RequestDispatcher rd = request.getRequestDispatcher("buscarPessoas.jsp");
                                //AQUI necessito que seja redirecionado para outra página, mediante requisição!
				rd.forward(request, response);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

Obrigado!

Ja tentou usar “response.sendRedirect(caminho);

o problema não é o redirecionamento para a outra página. Meu problema é que no index possuo 2 links:
Listar;
Excluir;

Quando clicar em um dos 2, ir na mesma servlet (a que postei o cod.) e ai fazer a verificação: Qual link cliquei para redirecionar para “buscarPessoas.jsp” ou “excluir.jsp”.

Diogo, bom dia.

Apesar de eu não entender qual lógica demanda que você faça o que você descreveu, eu devo lhe dizer que isto não é possível da forma em que você está pensando.

Uma vez que você redireciona para seu JSP, se for a primeira vez que ele é chamado ele será traduzido e provavelmente pela natureza dos JSP’s você irá enviar algum tipo de retorno para o cliente, logo não poderia fazer outro .forward pois isso irá gerar um “IllegalStateException” (por tentar redirecionar a aplicação após ter escrito).

E mesmo que seu JSP não envie nada para o cliente, não é recomendado que faça da forma que está fazendo, afinal, seu cliente irá visualizar apenas uma página.

Sobre o que o “strong” disse acima, o que difere do sendRedirect para o .forward de RequestDispatcher é que, o sendRedirect devolve uma resposta para o cliente requisitante com um codigo de resposta que o browser irá redireciona-lo para a URL informada, enquanto que com .forward você já irá devolver a página especificada, sem necessidade de outra requisição (porque ao devolver um redirect para o navegador, ele fará uma nova solicitação na url especificada).

Redirecionamentos para recursos da mesma aplicação web são recomendados utilizar o .forward(ele só aceita caminhos relativos ou absolutos internos da aplicação), enquanto para aplicações externas é recomendado o .sendRedirect.

ps: Quando o RequestDispatcher é obtido através de um ServletContext ele só aceitará caminhos relativos (iniciados com “/”), caso não seja relativo ele retornará null. Quanto ao RequestDispatcher obtido através de um objeto HttpServletRequest ele terá as mesmas regras que o cliente requisitante, passível a restrições de segurança e a recursos não acessíveis devido a localidade dos mesmos (exemplo: abaixo de /WEB-INF/).

[quote=diogojava123]o problema não é o redirecionamento para a outra página. Meu problema é que no index possuo 2 links:
Listar;
Excluir;

Quando clicar em um dos 2, ir na mesma servlet (a que postei o cod.) e ai fazer a verificação: Qual link cliquei para redirecionar para “buscarPessoas.jsp” ou “excluir.jsp”.
[/quote]

Faz assim, coloca um parametro em um dos seus dois links. Exemplo: e no outro

Aí dentro do servlet vc vai fazer “String acao = request.getParameter(“acao”);”, depois vc faz um if (acao.equals(“excluir”)) { redireciona pra pagina de exclusao } else if (acao.equals(“listar”)) { redireciona pra pagina de listar }

Apesar de essa ser uma abordagem meio feia hehe … vai funcionar! ;D

Mt Obrigado! Funcionou!

Mas qual seria uma abordagem mais elegante?rs

Vlew!

Primeiro, seu controlador (o servlet), tem conhecimento do seu modelo, o que torna sua aplicação menos coesa e dependente de tecnologia específica. Seria legal ter um objeto que representasse o modelo de regras de negocio e outro pra representar o modelo de dados.

Segundo, você está usando um atributo de nível de aplicação (ServletContext) para exibir uma mensagem de erro seguido por um redirect sem URL.

Visto que sua aplicação parece ser simples, provavelmente acadêmica. Certifique-se de manter a menor quantidade de estados no decorrer de várias solicitações, tente manter os dados referentes a uma solicitação no escopo dela.

Caso queira estudar sobre formas mais elegantes e ainda assim “conservadoras” de se implementar o mesmo, considere utilizar: Business Delegate, Service Locator, Transfer Object e Front Controller.

:slight_smile: