Post on 21-Apr-2015
Tópicos Especiais J2EE
Prof. Cristina Valadares
Curso de Ciência da Computação
Servlets
Prof. Cristina Valadares
Curso de Ciência da Computação
Servlet Servlets vivem para servir clientes, sua
função é receber uma solicitação do cliente e devolver uma resposta
A solicitação traz consigo dados cruciais e o código do Servlet tem que saber como encontrá-los e utilizá-los
A resposta, leva a informação que o browser precisa para montar uma página, e o código do Servlet tem que saber como enviá-los
Servlet Servlets são controlados pelo
container, porém, a vida do Servlet não é só isso
O ciclo de vida do Servlet é simples: Existe apenas um estado principal:
Inicializado Se o Servlet não está inicializado
(executando o construtor ou método init() ), ou está sendo inicializado ou sendo destruído (executando destroy() )
Servlet
Figura da página 64
O Servlet herda os métodos do ciclo de vida
Figura da página 65 apenas explicações
Os três grandes momentos do Ciclo de Vida
init(): Quando é chamado?
O container chama o init() na instância servlet depois que a instância servlet foi criada, porém, antes que sirva a qualquer solicitação do cliente.
Para que Serve? Possibilita que o servlet seja inicializado
antes de tratar qualquer solicitação do cliente
Pode ser anulado? Possivelmente
1
Os três grandes momentos do Ciclo de Vida
service(): Quando é chamado?
Quando chega a primeira solicitação do cliente, o container inicia uma nova thread, fazendo com que o método seja ativado.
Para que Serve? Analisa a solicitação, determina o método
HTTP (GET OU POST), e chama o respectivo: doGet(), ou o doPost().
Pode ser anulado? Não! Não se pode anulá-lo manualmente.
2
Os três grandes momentos do Ciclo de Vida
doGet() e/ou doPost(): Quando é chamado?
O método service() faz a chamada baseado no método HTTP da solicitação.
Para que Serve? A implementação do código começa aqui! Este
método é responsável por tudo que esperamos que a aplicação faça.
Pode ser anulado? Sempre, pelo menos um deles! Aquele que anular irá
informar ao container que o servlet não dá suporte a determinadas solicitações
3
Método doGet() & doPost()
Cada vez que os métodos doGet() & doPost() executam, eles executam em threads separadas
O método service() é sempre chamado em sua própria pilha.
Cada solicitação executa em uma thread separada
Não existem várias instâncias de nenhuma classe Servlet
O container executa várias threads para processar as várias solicitações para um único Servlet Cada solicitação do cliente gera um
novo par de objetos de solicitação e resposta
Cada solicitação executa em uma thread separada
Perguntar não ofende!
Pergunta: O que acontece se o mesmo cliente fizer várias solicitações?
E se o container usar cluster e distribuir a aplicação em mais de uma JVM?
Inicialização do Servlet: Quando um objeto torna-se um Servlet
Solicitação & Resposta
A chave de tudo, e os argumentos para o service()
Figura da página 70
Solicitação & Resposta
O HttpServletRequest e o HttpServletResponse são extensões do ServletRequest e do ServletResponse, e que a maior parte da implementação de um HttpServlet vem, de fato, do GenericServlet.
Protocolos HTTP: mundo Servlet
No mundo Servlet, só interessam o GET e o POST, porém, é interessante saber os outros métodos HTTP.
GET: pede para obter alguma coisa (recurso/arquivo) na URL requisitada;
POST: pede para o servidor aceitar a informação do corpo anexada na solicitação, e a entrega para aquilo que consta na URL.
Protocolos HTTP: mundo Servlet
HEAD: pede apenas a parte do header daquilo que o GET vai retornar. É como o GET, mas sem corpo na resposta. Informa a URL requisitada sem de fato retornar a coisa;
TRACE: solicita um loopback da mensagem de solicitação, para que o cliente veja o que está sendo recebido do outro lado;
PUT: diz para colocar a informação anexada (o corpo) na URL requisitada;
DELETE: diz para apagar alguma coisa (recurso/arquivo) na URL requisitada;
OPTIONS: solicita uma lista de métodos HTTP para os quais a solicitação na URL requisitada pode responder
CONNECT: diz para conectar
A diferença entre o GET & o POST
Diferença: tamanho, segurança e bookmark, GET:
obtém coisas e não altera nada no servidor, POST: envia
dados para serem processados
NENHUM corpo, apenas a informação
do header
Método idempotente O que é idempotente? Quando pode-se
efetuar uma ação repetidamente, sem efeitos colaterais.
POST não é idempotente: os dados submetidos em seu corpo podem ser destinados a uma transação que não pode ser desfeita.
Cabe ao programador ter certeza que a lógica de programação da aplicação esteja correta.
PUT, HEAD e GET são considerados idempotentes
O que determina a solicitação GET ou POST?
Um hiperlink simples Dentro da tag do form indicação da
utilização de: method = ‘POST’ GET é o padrão Exemplo: formulário html onde se
esquece da chamada a POST, e no Servlet, existe a implementação do método doPost().
Utilizando um único parâmetro
Formulário HTML
<form method="POST" action="SelectBeer.do"> Select beer characteristics<p> Color: <select name = "color" size="1"> <option>light <option>amber <option>brown <option>dark </select> <br><br> <center> <input type="SUBMIT"> </center></form>
Utilizando um único parâmetro
Solicitação HTTP POST
Utilizando um único parâmetro
Classe Servlet
Classe Servlet: trecho de código
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException{
String colorParam = request.getParameter(“color”);
}
Utilizando dois parâmetros
Formulário HTML
<form ... <select name = "color" size="1"> <option>light <option>amber <option>brown <option>dark </select>
<select name = “taste" size="1"> <option>medium <option>malty <option>heavy </select> <br><br> <center> <input type="SUBMIT"> </center></form>
Utilizando doisparâmetros
Solicitação HTTP POST
Utilizando doisparâmetros
Classe Servlet
Classe Servlet: trecho de código
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException{
String colorParam = request.getParameter(“color”);
String tasteParam = request.getParameter(“taste”);
}
Além dos parâmetros, o que mais o objeto Request retorna?
As interfaces ServletRequest e HttpServletRequest possui uma série de métodos
Além dos parâmetros, o que mais o objeto Request retorna?
A plataforma do cliente e a informação do browser:
String cliente = request.getHeader(“User-Agent”);
Os cookies associados a este cliente:Cookie[] cookies =
request.getCookies();
Além dos parâmetros, o que mais o objeto Request retorna?
A sessão associada a este cliente:HttpSession sessao =
request.getSession(); Os método HTTP da solicitação:String metodo =
request.getMethod(); A strea de dados da solicitação:InputStream entrada =
request.getInputStream();
Métodos
getServerPort(): para qual porta a solicitação foi enviada
getLocalPort(): onde a solicitação foi parar
getRemotePort(): o cliente é remoto em relação ao servidor, obtém a porta do cliente.
Resposta São chamados dois métodos na
resposta: setContentType() e getWriter()
Tipicamente utiliza-se o objeto de resposta para conseguir um stream de saída (Writer), e utiliza-se o stream para escrever o HTML
O objeto de resposta possui outros métodos além do I/O output, podendo também configurar o header, enviar erros e adicionar cookies
import javax.servlet.*;import javax.servlet.http.*;import java.io.*;
public class BeerSelect extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException{ response.setContentType("text/html"); PrintWriter out = response.getWriter();
out.println("Beer Selection Advice<br>"); String c = request.getParameter("color"); out.println("<br>Got beer color " + c); }}
Stream de saída X JSP
O correto é utilizar páginas JSP para retornar ao usuário a resposta
Porém pode acontecer de ter que trabalhar a stream de saída: 1º) Provedor pode não suportar JSP 2º) Não é só HTML que uma resposta
deve retornar, pode-se retornar outras coisas! Utilização do stream de saída
public class CodeReturn extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException{ response.setContentType(“application/jar"); ServletContext ctx = getServletContext(); InputStream is =
ctx.getResourceAsStream(“/bookCode.jar”);
int read = 0; byte[] bytes = new byte[1024]; OutPutStream os = response.getOutPutStream(); while((read = is.read(bytes)) != -1) os.write(bytes, 0, read); os.flush(); os.close(); }}
Tipos MIMES comuns
text/html application/pdf video/quicktime application/java image/jpeg application/jar aplication/octer-stream aplication/x-zip
Stream de saída Existem duas opções para saída:
caracteres ou bytes ServletOutPutStream para bytes PrinteWriter para dados em
caracteres
Stream de saída
PrintWriter: exemplo
Usado para exibir dados de texto para um stream de caracteres. É utilizado para tratar dados em caractere.
PrintWriter writer = response.getWriter();
writer.println(“algum texto e html”);
Stream de saída
OutPutStream: exemplo
Usado para escrever qualquer coisa
ServletOutPutStream out =
response.getOutPutStream();
out.writer(umArrayDeBytes);
NOTA: o PrintWriter empacota o ServletOutPutStream, ele possui uma referência para o ServletOutPutStream, adicionando métodos de alto nível para tratar caracteres.
Configuração e Adiçãode Headers de resposta
setHeader(“nomeHeader”, “tipoHeader”):sobrescreve o valor do header existente.
OBS: quando o método setContentType(“text/html”)
é chamado, é a mesma coisa que:setHeader(“content-type”,”text/html”);
addHeader(“nomeHeader”, “tipoHeader”):adiciona um novo valor de header.
Redirecionamentoda Resposta
Pode-se decidir que algo diferente trate a resposta para a sua solicitação.
Redirecionando a solicitação para uma URL completamente diferente, ou despachá-la para algum outro componente da sua aplicação (geralmente um JSP)
Redirecionamentoda Resposta O redirecionamento deixa o Servlet
“aliviado”. Após perceber que ele não poderá desempenhar o trabalho o Servlet chama o método sendRedirect()
if (Se o trabalho for para o Servlet){
// O Servlet trata a solicitação
}
else response.sendRedirect(“http://www.ufla.br”);
Request Dispatch X Redirecionamento
Request Dispatch acontece no lado servidor, pois outro componente no lado servidor executa o trabalho
Redirecionamento faz o cliente executar o trabalho
Redirecionamento = clienteDispatch = servidor