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=&quot;POST&quot; action=&quot;SelectBeer.do&quot;> Select beer characteristics<p> Color: <select  name = &quot;color&quot;  size=&quot;1&quot;> <option>light <option>amber <option>brown <option>dark </select> <br><br>  <center> <input type=&quot;SUBMIT&quot;> </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 = &quot;color&quot;  size=&quot;1&quot;> <option>light <option>amber <option>brown <option>dark </select>   <select  name = “taste&quot;  size=&quot;1&quot;> <option>medium <option>malty <option>heavy </select> <br><br>  <center> <input type=&quot;SUBMIT&quot;> </center> </form>
Utilizando dois parâmetros Solicitação HTTP POST
 
Utilizando dois parâ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(&quot;text/html&quot;); PrintWriter out = response.getWriter(); out.println(&quot;Beer Selection Advice<br>&quot;); String c = request.getParameter(&quot;color&quot;); out.println(&quot;<br>Got beer color &quot; + 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&quot;); 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ção de 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.
Redirecionamento da 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)
Redirecionamento da 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 = cliente Dispatch = servidor

Te servelts

  • 1.
    Tópicos Especiais J2EE Prof. Cristina Valadares Curso de Ciência da Computação
  • 2.
    Servlets Prof. CristinaValadares Curso de Ciência da Computação
  • 3.
    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
  • 4.
    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() )
  • 5.
  • 6.
    O Servlet herda os métodos do ciclo de vida
  • 7.
    Figura da página65 apenas explicações
  • 8.
    Os três grandesmomentos 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
  • 9.
    Os três grandesmomentos 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
  • 10.
    Os três grandesmomentos 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
  • 11.
    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.
  • 12.
    Cada solicitação executaem 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
  • 13.
    Cada solicitação executaem uma thread separada
  • 14.
    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?
  • 15.
    Inicialização do Servlet:Quando um objeto torna-se um Servlet
  • 16.
    Solicitação & RespostaA chave de tudo, e os argumentos para o service()
  • 17.
  • 18.
    Solicitação & RespostaO 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 .
  • 19.
    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.
  • 20.
    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
  • 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.
    NENHUM corpo,apenas a informação do header
  • 23.
  • 24.
    Método idempotente Oque é 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
  • 25.
    O que determinaa 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().
  • 26.
    Utilizando um únicoparâmetro Formulário HTML
  • 27.
    <form method=&quot;POST&quot; action=&quot;SelectBeer.do&quot;>Select beer characteristics<p> Color: <select name = &quot;color&quot; size=&quot;1&quot;> <option>light <option>amber <option>brown <option>dark </select> <br><br> <center> <input type=&quot;SUBMIT&quot;> </center> </form>
  • 28.
    Utilizando um únicoparâmetro Solicitação HTTP POST
  • 29.
  • 30.
    Utilizando um únicoparâmetro Classe Servlet
  • 31.
    Classe Servlet: trecho de código public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ String colorParam = request.getParameter(“color”); }
  • 32.
    Utilizando dois parâmetros Formulário HTML
  • 33.
    <form ... <select name = &quot;color&quot; size=&quot;1&quot;> <option>light <option>amber <option>brown <option>dark </select> <select name = “taste&quot; size=&quot;1&quot;> <option>medium <option>malty <option>heavy </select> <br><br> <center> <input type=&quot;SUBMIT&quot;> </center> </form>
  • 34.
    Utilizando dois parâmetrosSolicitação HTTP POST
  • 35.
  • 36.
  • 37.
    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”); }
  • 38.
    Além dos parâmetros,o que mais o objeto Request retorna? As interfaces ServletRequest e HttpServletRequest possui uma série de métodos
  • 39.
    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();
  • 40.
    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();
  • 41.
    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.
  • 42.
    Resposta São chamadosdois 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
  • 43.
    import javax.servlet.*; importjavax.servlet.http.*; import java.io.*; public class BeerSelect extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ response.setContentType(&quot;text/html&quot;); PrintWriter out = response.getWriter(); out.println(&quot;Beer Selection Advice<br>&quot;); String c = request.getParameter(&quot;color&quot;); out.println(&quot;<br>Got beer color &quot; + c); } }
  • 44.
    Stream desaí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
  • 45.
    public class CodeReturnextends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ response.setContentType(“application/jar&quot;); 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(); } }
  • 46.
    Tipos MIMES comunstext/html application/pdf video/quicktime application/java image/jpeg application/jar aplication/octer-stream aplication/x-zip
  • 47.
    Stream desaída Existem duas opções para saída: caracteres ou bytes ServletOutPutStream para bytes PrinteWriter para dados em caracteres
  • 48.
    Stream desaí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”);
  • 49.
    Stream desaí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.
  • 50.
    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.
  • 51.
    Redirecionamento da RespostaPode-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)
  • 52.
    Redirecionamento da RespostaO 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”);
  • 53.
    Request Dispatch XRedirecionamento Request Dispatch acontece no lado servidor, pois outro componente no lado servidor executa o trabalho Redirecionamento faz o cliente executar o trabalho Redirecionamento = cliente Dispatch = servidor