Introdução

RequestDispatcher é um recurso oferecido pelo servlet que permite que uma requisição seja despachado para outro servlet processar e entregar a resposta para o cliente.

Note que o despache de requisição ocorre totalmente no lado servidor, o que aparece no lado cliente é somente a resposta devolvida.

Encaminhamento

Um servlet pode iniciar o processamento e encaminhar para outro servlet concluir.

Isto é feito com o método forward:

RequestDispatcher rd = request.getRequestDispatcher("/lista-clientes.jsp");
rd.forward(request, response);

<jsp:forward>

Dentro do JSP, também podemos encaminhar a requisição:

<jsp:forward page="/lista-clientes.jsp"/>

Antes do corpo da resposta

Nunca escreva o conteúdo da resposta antes do encaminhamento.

// 🚫 Este código servlet falha porque há conteúdo escrito antes de encaminhar
PrintWriter out = response.getWriter();
out.println("<!-- Comentários antes de repassar -->");

RequestDispatcher rd = request.getRequestDispatcher("/lista-clientes.jsp");
rd.forward(request, response);

Include

Outro tipo de despache é o include: nesse tipo, o servlet incluído processa a requisição e depois devolve o controle ao servlet inicial.

//
// Pode ter qualquer código antes...
//
RequestDispatcher rd = request.getRequestDispatcher("/lista-clientes.jsp");
rd.include(request, response);
//
// ...e qualquer código depois!
//

<jsp:include>

<jsp:include page="/lista-clientes.jsp"/>

Enviando valores ao despachar

O objeto ServletRequest permite definir atributos para serem lidos pelos outros servlets que participarem da requisição.

Pessoa p = new Pessoa("João", 46);
request.setAttribute("pessoa", p);

RequestDispatcher rd = request.getRequestDispatcher("/servlet2");
rd.forward(request, response);
Pessoa p = (Pessoa) request.getAttribute("pessoa");

Lendo valores no JSP

Os atributos são particularmente úteis nos arquivos JSP.

Para ler um atributo da requisição, basta ler como uma variável de template.

RequestDispatcher rd = request.getRequestDispatcher("/mostra-nome.jsp");
rd.forward(request, response);
O seu nome é ${pessoa.nome}

Declarando variáveis recebidas no JSP

Não é necessário declarar as variáveis para serem acessíveis no JSP, mas é útil para documentação e habilitar a auto-completação da IDE.

Para isso, usa-se <jsp:useBean> com o atributo type em vez de class.

<jsp:useBean id="pessoa" type="fanese.web.Pessoa" scope="request"/>

Leitura Recomendada

Capítulo 12
Páginas 394 à 398