Te servelts

1.001 visualizações

Publicada em

Publicada em: Tecnologia, Educação
0 comentários
0 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
1.001
No SlideShare
0
A partir de incorporações
0
Número de incorporações
3
Ações
Compartilhamentos
0
Downloads
21
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Te servelts

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

×