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