Tópicos Especiais J2EE Prof. Cristina Valadares Curso de Ciência da Computação.
Transcript of Tópicos Especiais J2EE Prof. Cristina Valadares Curso de Ciência da Computação.
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