J
AVA
S
ERVLETS
C
ONCEITOS Prof. Dr. Henrique Dezani dezani@fatecriopreto.edu.brT
ECNOLOGIAEMI
NFORMÁTICAPARAN
EGÓCIOSC
ONTEÚDO
¢
Arquitetura de uma aplicação Web
HTTP (HyperText Transfer Protocol)
Métodos HTTP GET & HTTP POST
Request & Response
¢
Container Servlet
O que é?
O que ele oferece?
Como ele trata as solicitações?
J2EE, como ele entra nesse assunto?
¢
Descritor XML
A
RQUITETURA
DE
UMA
APLICAÇÃO
WEB
¢
HTTP
(HyperText Transfer Protocol) é um protocolo de
transporte e um sistema de mensagem, porque
solicitações e respostas HTTP são mensagens.
¢
O conteúdo das mensagem HTTP pode ser classificado,
usando o sistema de Fpo
MIME
(Mul4purpose Internet
Mail Extensions).
¢
HTTP também fornece códigos de
status
de resposta
para informar ao solicitante se a solicitação obteve
sucesso e, se não, porque.
A
RQUITETURA
DE
UMA
APLICAÇÃO
WEB
¢
O
HTTP
possui verbos bem conhecidos, oficilamente
conhecidos como
métodos
, os quais são dados na
tabela abaixo:
Método Descrição Significado*
GET Pede para recuperar algum recurso na URL Lê (Read)
POST Pede que o servidor aceitar o conteúdo anexado Cria (Create)
PUT Pede para adicionar alguma informação. Edita(Update)
TRACE Pede para voltar ao início da mensagem de solicitação, para que o cliente possa ver o que está sendo recebido do outro lado (utilizado em geral para testes).
DELETE Pede para apagar um determinado recurso Apaga (Delete) * CRUD (Create, Read, Update and Delete)
A
RQUITETURA
DA
A
PLICAÇÃO
W
EB
Cliente Servidor Solicitação http://www.google.com.brA
RQUITETURA
DA
A
PLICAÇÃO
W
EB
Cliente Servidor RespostaA
RQUITETURA
DA
A
PLICAÇÃO
W
EB
Cliente Servidor Solicitação HTTP GET POSTA
RQUITETURA
DA
A
PLICAÇÃO
W
EB
Cliente Servidor Solicitação (Get/Post) Resposta1 Como é processada a solicitação? 2 Como é definida a resposta?
3 Quando uma solicitação é feita por GET e quando é feita por POST? 4 Como saberemos qual classe será executada?
Perguntas!!
C
ONTAINER
¢
Os servlets não possuem um método main(). Eles
estão sob o controle de outra aplicação Java
chamada Container.
Exemplos: Glassfish e Apache Tomcat (Container
Servlet)
Quando uma aplicação web recebe uma solicitação
para uma servlet, o servidor entrega a solicitação não ao servlet em si, mas para o Container no qual o servlet é distribuído.
O Container então entrega ao servlet a solicitação e a
resposta HTTP e, dependendo do tipo de solicitação, chama o método servlet adequado (doGet, doPost etc).
C
ONTAINER
S
ERVLET
O QUE ELE OFERECE?
¢
Suporte para comunicações
O container já trata as requisições e redireciona para
o servlet correto (veremos adiante), portanto não precisamos nos preocupar com a criação de tráfego, escuta de porta, assim como é feito em aplicações ServerSocket.
Foco na lógica do negócio!
¢
Gerenciamento do ciclo de vida
O container controla a vida e a morte dos seus
servlets, ou seja, ele é responsável por carregar as classes, instânciar, inicializar os servlets e chamar os métodos adequados (Get/Post). E, no final, o próprio container trata de coletar o lixo (Garbage Collector)
Não é necessário se preocupar com o gerenciamento
de recursos.
C
ONTAINER
S
ERVLET
O QUE ELE OFERECE?
¢ Suporte a Multithread O container cria automaticamente uma nova thread em Java para cada solicitação do servlet recebida. Ao finalizar a execução do método do serviço HTTP (Get/Post), a thread é finalizada.
Poupa tempo de trabalho. ¢ Certeza de Segurança
Utilizando o Deployment Descriptor XML (web.xml) você pode configurar a segurança sem ter que alterar (e recompilar) qualquer classe.
Poupa tempo e facilita a manutenção ¢ Suporte ao JSP
O container é responsável por interpretar os códigos escrtios no JSP e criar as páginas visualizadas pelo cliente final.
C
ONTAINER
S
ERVLET
COMO SÃO TRATADAS AS SOLICITAÇÕES?
Container Servlet GET
Solicitação HTTP
Cliente
C
ONTAINER
S
ERVLET
COMO SÃO TRATADAS AS SOLICITAÇÕES?
Container Servlet
Cliente
2
O container “vê” que a solicitação é para um servlet e então cria dois objetos: HttpServletRequest e HttpServletResponseResposta (HttpServletResponse)
Solicitação (HttpServletRequest)
C
ONTAINER
S
ERVLET
COMO SÃO TRATADAS AS SOLICITAÇÕES?
Container Servlet
Cliente
3
O container encontra o servlet correto baseado na URL da solicitação, cria um thread para essa solicitação e passa os objetos de solicitação e resposta para a thread do servlet.Thread Solicitação
Resposta
C
ONTAINER
S
ERVLET
COMO SÃO TRATADAS AS SOLICITAÇÕES?
Container Servlet
Cliente
4
O container chama o método tipo de solicitação (Get ou Postservice() ), o método service chama o método do servlet. De acordo com o correspondente (doGet ou doPost).Neste exemplo consideramos o uso da solicitação por HTTP Get.
Solicitação Resposta
service()
C
ONTAINER
S
ERVLET
COMO SÃO TRATADAS AS SOLICITAÇÕES?
Container Servlet
Cliente
5
O método doGet gera uma página dinamicamente e a insere no objeto resposta (HttpServletResponse). É importante ressaltar que o container ainda tem uma referência do objeto resposta.service() doGet() <html> </html> Resposta
C
ONTAINER
S
ERVLET
COMO SÃO TRATADAS AS SOLICITAÇÕES?
Container Servlet
Cliente
6
O thread é finalizado, o container converte o objeto resposta em uma resposta HTTP e envia de volta para o cliente. Por último, o container apaga os objetos solicitação e resposta.<html> </html>
Resposta Solicitação Resposta HTTP
C
ICLO
DE
V
IDA
DA
S
ERVLET
Container Web Servlet Class Servlet Object Container
AServlet.class
Iniciada
Iniciada
Trata solicitações dos clientes. (doGet(), doPost() etc.) Cada solicitação é tratada em um thread separada. Load class
Instancia a servlet (construtor)
init()
service()
destroy()
O Construtor padrão é executa. NÃO sobrescreva o construtor padrão.
Executado uma única vez no ciclo de vida da servlet e deve ser completado antes do container invocar o método service().
Permite finalizar a servlet antes dela ser eliminada pelo Garbage Collector. Assim como o método init(), este é executado apenas uma vez.
J2EE (J
AVA
T
O
E
NTERPRISE
E
DITION
)
O QUE É E COMO ELE ENTRA NESSE ASSUNTO
¢
J2EE incorpora especificações tais como o
Servlets e a JSP.
¢
A especificação J2EE também inclui a
especificação Enterprise JavaBean para o
Container EJB.
¢
O container web é para componentes web
(Servlets e JSP) e o container EJB é para
componentes de negócios.
¢
Um servidor de aplicação totalmente compatível
com J2EE deve ter tanto um container web como
um container EJB.
O Apache Tomcat é apenas um container web!
V
AMOS
P
ROGRAMAR
!
Mas antes, vamos estudar quais é a estrutura de classes utilizada...
<<interface>> Servlet service(ServletRequest, ServletResponse) init(ServletConfig) destroy() getServletConfig() getServletInfo() GenericServlet service(ServletRequest, ServletResponse) init(ServletConfig) init() destroy() getServletConfig() getServletInfo() getInitParameter() getInitParameterNames() getServletContext() log(String) log(String, Throwable) HttpServlet service(HttpServletRequest, HttpServletResponse) service(ServletRequest, ServletResponse) doGet(HttpServletRequest, HttpServletResponse) doPost(HttpServletRequest, HttpServletResponse) doHead(HttpServletRequest, HttpServletResponse) doPut(HttpServletRequest, HttpServletResponse) doTrace(HttpServletRequest, HttpServletResponse) doDelete(HttpServletRequest, HttpServletResponse) getLastModified(HttpServletRequest) ClienteServlet doGet(HttpServletRequest, HttpServletResponse) Servlet Interface (javax.servlet.Servlet) GenericServlet class (javax.servlet.GenericServlet) HttpServlet class (javax.servlet.http.HttpServlet) ClienteServlet class (br.edu.fatecriopreto.controller)
S
ERVLETS
import javax.servlet.*; import javax.servlet.http.*; import java.io.*;public class ClienteServlet extends HttpServlet { public void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException { }
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { } }
S
ERVLETS
import javax.servlet.*; import javax.servlet.http.*; import java.io.*;public class ClienteServlet extends HttpServlet { public void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException { }
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { } } HttpServlet ClienteServlet
S
ERVLETS
import javax.servlet.*; import javax.servlet.http.*; import java.io.*;public class ClienteServlet extends HttpServlet { public void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException { }
public void doPost(HttpServletRequest request,
HttpServletResponse response) throws IOException { } } Cliente Servidor Solicitação Resposta
S
ERVLETS
import javax.servlet.*; import javax.servlet.http.*; import java.io.*;
public class ClienteServlet extends HttpServlet { public void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException { } } Cliente Servidor Solicitação (GET)
S
ERVLETS
import javax.servlet.*; import javax.servlet.http.*; import java.io.*;public class ClienteServlet extends HttpServlet { public void doPost(HttpServletRequest request,
HttpServletResponse response) throws IOException { } } Cliente Servidor Solicitação (POST)
S
ERVLETS
import javax.servlet.*; import javax.servlet.http.*; import java.io.*;public class ClienteServlet extends HttpServlet { public void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException {
PrintWriter out = response.getWriter();
out.println(“<HTML><BODY>Hello World</BODY></HTML>”); }
}
Cliente Resposta Servidor
D
ESCRITOR
XML
<web-app> <servlet> <servlet-name>ClienteServlet</servlet-name> <servlet-class>ClienteServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ClienteServlet</servlet-name> <url-pattern>/cliente</url-pattern> </servlet-mapping> </web-app>D
ESCRITOR
XML
<web-app> <servlet> <servlet-name>ClienteServlet</servlet-name> <servlet-class>ClienteServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ClienteServlet</servlet-name> <url-pattern>/cliente</url-pattern> </servlet-mapping> </web-app> http://localhost/PedidoWeb/clienteD
ESCRITOR
XML
<web-app> <servlet> <servlet-name>ClienteServlet</servlet-name> <servlet-class>ClienteServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ClienteServlet</servlet-name> <url-pattern>/cliente</url-pattern> </servlet-mapping> </web-app>H
TTP
S
ERVLET
R
EQUEST
I
NDEX
.
JSP
<!DOCTYPE html> <HTML> <HEAD> <TITLE>Cliente</TITLE> </HEAD> <BODY> <A HREF=“cliente?nome=Fulano”>Exibir</A> </BODY> </HTML>H
TTP
S
ERVLET
R
EQUEST
I
NDEX
.
JSP
<!DOCTYPE html> <HTML> <HEAD> <TITLE>Cliente</TITLE> </HEAD> <BODY><A HREF=“cliente?nome=Fulano”>Exibir</A> </BODY>
</HTML> Parâmetros passados para o servidor
Símbolo para indicar que parâmetros serão enviados
URL da Servlet (<url-pattern>/cliente</url-pattern>)
H
TTP
S
ERVLET
R
EQUEST
...
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException {
String nome = request.getParameter(“nome”); }
...
Cliente Servidor
Solicitação (GET)
<A HREF=“cliente?nome=Fulano”>Exibir</A>
M
ENSAGEM
HTTP
M
ÉTODO
GET
GET /localhost/cliente?nome=Fulano HTTP/1.1
Host: localhost
User-‐Agent: Chrome (Macintosh; PPC Mac OS X) Accept: text/xml,application/xml,text/plain Accept-‐Language: en-‐us, en
Accept-‐Encoding: gzip Accept-‐Charset: ISO-‐8859-‐1,utf-‐8 Keep-‐Alive:300 Connection: keep-‐alive Cabeçalho da solicitação Não há corpo da mensagem Método
HTTP O caminho do recurso no servidor web
Nas requisições GET, os parâmetros, caso haja algum, são adicionados à URL da
solicitação
A versão do protocolo que o navegador está solicitando
H
TTP
S
ERVLET
R
EQUEST
I
NDEX
.
JSP
<!DOCTYPE html> <HTML> <HEAD> <TITLE>Cliente</TITLE> </HEAD> <BODY><A HREF=“cliente?nome=Fulano&idade=35”>Exibir</A> </BODY>
</HTML> Símbolo utilizado na concatenação de parâmetros
H
TTP
S
ERVLET
R
EQUEST
...
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException {
String nome = request.getParameter(“nome”); String idade = request.getParameter(“idade”); }
...
Cliente Servidor
Solicitação (GET)
H
TTP
S
ERVLET
R
EQUEST
<<interface>> ServletRequest getAttribute(String) getContentLength() getInputStream() getLocalPort() getParameter() getParameterNames() // E MUITOS OUTROS... <<interface>> HttpServletRequest getContextPath() getCookies() getHeader(String) getQueryString() getSession() getMethod() // E MUITOS OUTROS...H
TTP
S
ERVLET
R
EQUEST
...public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException {
String nome = request.getParameter(“nome”);
String idade = request.getParameter(“idade”); } ... Cliente Servidor Solicitação (GET) Mas idade é um número inteiro...
H
TTP
S
ERVLET
R
EQUEST
...public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException {
String nome = request.getParameter(“nome”);
int idade = request.getParameter(“idade”); }
...
Cliente Servidor
Solicitação (GET)
Agora sim está correto! Mas não compila!!!
H
TTP
S
ERVLET
R
EQUEST
...
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException {
String nome = request.getParameter(“nome”);
int idade = request.getParameter(“idade”); }
...
Cliente Servidor
Solicitação (GET)
Como armazenar uma String como número inteiro?
Parâmetros são sempre do tipo String!!!
H
TTP
S
ERVLET
R
EQUEST
...
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException {
String nome = request.getParameter(“nome”);
String sIdade = request.getParameter(“idade”);
int idade = Integer.parseInt(sIdade); } ... Cliente Servidor Solicitação (GET)
H
TTP
S
ERVLET
R
EQUEST
<!DOCTYPE html> <HTML> <HEAD> <TITLE>Cliente</TITLE> </HEAD> <BODY><FORM ACTION=“cliente” METHOD=“POST”> <INPUT TYPE=“TEXT” NAME=“nome”/> <INPUT TYPE=“SUBMIT” VALUE=“Enviar”/> </FORM>
</BODY> </HTML>
M
ENSAGEM
HTTP
M
ÉTODO
POST
POST /localhost/cliente HTTP/1.1
Host: localhost
User-‐Agent: Chrome (Macintosh; PPC Mac OS X) Accept: text/xml,application/xml,text/plain Accept-‐Language: en-‐us, en
Accept-‐Encoding: gzip Accept-‐Charset: ISO-‐8859-‐1,utf-‐8 Keep-‐Alive:300 Connection: keep-‐alive Cabeçalho da solicitação Corpo da mensagem Método HTTP O caminho do recurso no servidor web
Nas solicitações por POST, os parâmetros são passados no corpo da mensagem e, portanto, não são limitados como o GET.
A versão do protocolo que o navegador está solicitando
nome=Fulano
H
TTP
S
ERVLET
R
EQUEST
<!DOCTYPE html> <HTML> <HEAD> <TITLE>Cliente</TITLE> </HEAD> <BODY><FORM ACTION=“cliente” METHOD=“POST”> <INPUT TYPE=“TEXT” NAME=“nome”/> <INPUT TYPE=“SUBMIT” VALUE=“Enviar”/> </FORM>
</BODY> </HTML>
URL da Servlet (<url-pattern>/cliente</url-pattern>)
H
TTP
S
ERVLET
R
EQUEST
...
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException {
String nome = request.getParameter(“nome”); }
...
Cliente Servidor
Solicitação (POST)
<INPUT TYPE=“TEXT” NAME=“nome”/>
H
TTP
S
ERVLET
R
EQUEST
E se os parâmetros tiverem o mesmo nome?
<FORM ACTION=“MinhaServlet” METHOD=“post”>
<INPUT TYPE=“CHECKBOX” NAME=“modulo” value=“Java”/>
<INPUT TYPE=“CHECKBOX” NAME=“modulo” value=“Net”/>
<INPUT TYPE=“SUBMIT” VALUE=“Enviar”/>
</FORM>
H
TTP
S
ERVLET
R
EQUEST
...
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException {
String[] nome = request.getParameterValues(“modulo”); }
...
Cliente Servidor
Solicitação (POST)
<INPUT TYPE=“CHECKBOX” NAME=“modulo” value=“Java”/> <INPUT TYPE=“CHECKBOX” NAME=“modulo” value=“Net”/>
H
TTP
S
ERVLET
R
EQUEST
¢
E se eu não souber o nome dos
parâmetros?
¢
E se eu quisesse obter informações sobre
o cabeçalho da solicitação?
¢
Como eu faria para obter a quantidade
de saltos de roteadores realizadas?
¢
E para recuperar a sessão do cliente?
¢
E para recuperar os cookies?
¢
Como é possível identificar o método que
será executado (GET/POST)?
H
TTP
S
ERVLET
R
EQUEST
¢ E se eu não souber o nome dos parâmetros? request.getParameterNames()
¢ E se eu quisesse obter informações sobre o cabeçalho da solicitação?
request.getHeader(“User-Agent”)
¢ Como eu faria para obter a quantidade de saltos de roteadores realizadas?
request.getHeader(“Max-Forwards”) ¢ E para recuperar a sessão do cliente?
request.getSession() ¢ E para recuperar os cookies?
request.getCookies()
¢ Como é possível identificar o método que será executado (GET/POST)? request.getMethod() Exis tem mui tos ou tros mét odos ...
H
TTP
S
ERVLET
R
ESPONSE
import javax.servlet.*; import javax.servlet.http.*; import java.io.*;public class ClienteServlet extends HttpServlet { public void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException { }
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException { }
}
Cliente Resposta Servidor
H
TTP
S
ERVLET
R
ESPONSE
<<interface>> ServletResponse getBufferSize() setContentType() getOutputStream() getWriter() // E MUITOS OUTROS... <<interface>> HttpServletResponse addCookie() addHeader() encodeRedirectURL() sendError() setStatus() // E MUITOS OUTROS...H
TTP
S
ERVLET
R
ESPONSE
¢
A resposta para o cliente pode ser:
Caracteres (PrintWriter)
Byes (OutputStream)
¢
Podemos definir o MIME (tipo do conteúdo), por exemplo
“text/html” utilizando o método setContentType();
response.setContentType(“text/html”);
Alguns tipos: text/html application/pdf video/quicktime application/java image/jpeg application/jar application/x-zip
H
TTP
S
ERVLET
R
ESPONSE
import javax.servlet.*; import javax.servlet.http.*; import java.io.*;public class ClienteServlet extends HttpServlet { public void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException {
PrintWriter out = response.getWriter(); out.println(“Algum texto ou HTML”); }
}
Cliente Resposta Servidor
H
TTP
S
ERVLET
R
ESPONSE
import javax.servlet.*; import javax.servlet.http.*; import java.io.*;
public class ClienteServlet extends HttpServlet { public void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException {
PrintWriter out = response.getWriter(); out.println(“Algum texto ou HTML”); }
}
H
TTP
S
ERVLET
R
ESPONSE
import javax.servlet.*; import javax.servlet.http.*; import java.io.*;public class ClienteServlet extends HttpServlet { public void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException {
ServletOutputStream out = response.getOutputStream();
out.write(aByteArray); }
}
Cliente Resposta Servidor
H
TTP
S
ERVLET
R
ESPONSE
import javax.servlet.*; import javax.servlet.http.*; import java.io.*;
public class ClienteServlet extends HttpServlet { public void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException {
ServletOutputStream out = response.getOutputStream(); out.write(aByteArray);
} }
Cliente Resposta Servidor
H
TTP
S
ERVLET
R
ESPONSE
import javax.servlet.*; import javax.servlet.http.*; import java.io.*;
public class ClienteServlet extends HttpServlet { public void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException {
response.setContentType(“text/html”);
PrintWriter out = response.getWriter(); out.println(“<HTML><BODY>Teste</BODY></HTML>”); }
}
Cliente Resposta Servidor
H
TTP
S
ERVLET
R
ESPONSE
import javax.servlet.*; import javax.servlet.http.*; import java.io.*;
public class ClienteServlet extends HttpServlet { public void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException {
response.setContentType(“application/txt”);
PrintWriter out = response.getWriter(); out.println(“Hello World”);
} }
Cliente Resposta Servidor
H
TTP
S
ERVLET
R
ESPONSE
import javax.servlet.*; import javax.servlet.http.*; import java.io.*;
public class ClienteServlet extends HttpServlet { public void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException {
response.setContentType(“application/txt”);
response.setHeader("Content-Disposition","attachment; filename=teste.txt"); PrintWriter out = response.getWriter();
out.println(“Hello World”); }
}
Cliente Resposta Servidor
H
TTP
S
ERVLET
R
ESPONSE
¢
Além de retornar uma resposta para o cliente a
partir de uma Servlet, é possível que você passe
para outra “coisa” lidar com a resposta.
¢
Para isso podemos utilizar tanto
Redirecionamento
quanto
RequestDispatch.
Qual a diferençaH
TTP
S
ERVLET
R
ESPONSE
R
EDIRECIONAMENTO
¢
Quando uma servlet faz um redirecionamento, é
como se pedíssemos que o cliente digitasse outra
URL. Nesse caso o cliente é o Navegador.
O usuário vê a nova URL no navegador!!
H
TTP
S
ERVLET
R
ESPONSE
R
EDIRECIONAMENTO
import javax.servlet.*; import javax.servlet.http.*; import java.io.*;public class ClienteServlet extends HttpServlet { public void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException {
response.sendRedirect(“http://www.google.com.br”); }
}
Cliente Resposta Servidor
H
TTP
S
ERVLET
R
ESPONSE
R
EDIRECIONAMENTO
import javax.servlet.*; import javax.servlet.http.*; import java.io.*;
public class ClienteServlet extends HttpServlet { public void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException {
response.sendRedirect(“cliente?nome=Pedro”); }
}
Cliente Resposta Servidor
Podemos utilizar o redirecionamento para chamar outras classes dentro da aplicação.
H
TTP
S
ERVLET
R
ESPONSE
R
EQUEST
D
ISPATCH
¢
Quando um servlet faz o request dispatch, é como
se pedíssemos que um colega de trabalho
cuidasse de um cliente. O colega de trabalho
acaba respondendo ao cliente, mas o cliente não
sabe disso, e também pouco se importa.
O usuário NÃO vê a nova URL no navegador!!
H
TTP
S
ERVLET
R
ESPONSE
R
EQUEST
D
ISPATCH
import javax.servlet.*; import javax.servlet.http.*; import java.io.*;public class ClienteServlet extends HttpServlet { public void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException { RequestDispatcher view = request.getRequestDispatcher(“index.jsp”); view.forward(request, response); } }
Cliente Resposta Servidor
H
TTP
S
ERVLET
R
ESPONSE
R
EQUEST
D
ISPATCH
import javax.servlet.*; import javax.servlet.http.*; import java.io.*;
public class ClienteServlet extends HttpServlet { public void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException {
RequestDispatcher view =
request.getRequestDispatcher(“index.jsp”); view.forward(request, response);
} }
Cliente Resposta Servidor
Página que continuará a execução
Passamos a solicitação e a resposta, para que quem continuar a execução saiba para onde retornar os dados