Tópicos Especiais J2EE Prof. Cristina Valadares Curso de Ciência da Computação.

Post on 21-Apr-2015

103 views 0 download

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