Fazendo requisições (GET) Prática acompanhada 1 [ http://exemplos.googlecode.com/svn/trunk/scwcd/pa01/ ]  Fábio Nogueira de Lucena Instituto de Informática (UFG)
GET Exemplo http://www.google.com Exemplo com argumentos http://www.google.com.br/search?q=kyriosdata Em html (index.html) <html> <body> Use <a href=“GET?a=x”>get</a> </body> </html>
Passos Crie o diretório correspondente à aplicação web ( pa01 ) com seus subdiretórios WEB-INF WEB-INF/classes Crie o arquivo  index.html  (veja slide anterior)  Crie o descritor de implantação ( web.xml ) Crie Servlet que exibe argumentos recebidos, caso existam (veja slide seguinte) Compile, implante, inicie o Tomcat  e experimente
Descritor de implantação (web.xml) <?xml version=&quot;1.0&quot; encoding=&quot; ISO-8859-1 &quot;?> < web-app  xmlns=&quot;http://java.sun.com/xml/ns/j2ee&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd&quot; version=&quot;2.4&quot;> < servlet > <servlet-name>Identificador</servlet-name> <servlet-class>ObtemArgumento</servlet-class> </ servlet > < servlet-mapping > <servlet-name>Identificador</servlet-name> <url-pattern>/GET</url-pattern> </ servlet-mapping > </ web-app >
Servlet import java.io.*; import javax.servlet.ServletException; import javax.servlet.http.*; public class ObtemArgumento extends  HttpServlet  { public void  service ( HttpServletRequest  r, HttpServletResonse  s) throws ServletException, IOException { PrintWriter pw = s.getWriter(); String parametro = r.getParameter(“a”); pw.println(“<html><body>”); pw.println(“<h1>Parâmetro</h1>”); pw.println(“Argumento: a<br>Valor: ” + parametro); pw.println(“</body></html>”); } }
Compilação... Para compilar é necessário  servlet-api.jar Coloque em seu  CLASSPATH set CLASSPATH=%CLASSPATH%;<aqui> (win) CLASSPATH=$CLASSPATH:<aqui> (linux) javac -cp <aqui> ... Para iniciar o Tomcat startup.bat  (windows)  startup.sh  (Linux) Experimentar http://localhost:8080/pa01  (carrega index.html) http://localhost:8080/pa01/GET?a=testando
Resultado
Fazendo requisições POST Prática acompanhada 2 [ http://exemplos.googlecode.com/svn/trunk/scwcd/pa02/ ]
POST Exemplo HTML <html><body> <form name=“teste” method=“ POST ” action=“ /pa02/POST ”> <input type=“text” name=“ a ”> <input type=“submit” name=“botao” value=“Envie”> </form> </body></html> Crie o diretório  pa02  e neste Acrescente o arquivo  index.html  (veja acima) WEB-INF  (conterá  web.xml ) WEB-INF/classes  (conterá o Servlet)
Descritor de implantação (web.xml) <?xml version=&quot;1.0&quot; encoding=&quot; ISO-8859-1 &quot;?> < web-app  xmlns=&quot;http://java.sun.com/xml/ns/j2ee&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd&quot; version=&quot;2.4&quot;> < servlet > <servlet-name>pa02</servlet-name> <servlet-class>ObtemArgumento</servlet-class> </ servlet > < servlet-mapping > <servlet-name>pa02</servlet-name> <url-pattern>/POST</url-pattern> </ servlet-mapping > </ web-app >
Servlet, compilação, ... Para experimentar http://localhost:8080/pa02 URL do  browser  não mostra “?a=...”
Quando usar GET? Quando usar POST? GET Tipo de dado:  texto  (visível por meio da URL) Quantidade de dados:  em geral 255 caracteres POST Tipo de dado:  qualquer  (não visível pela URL) Quantidade de dados:  ilimitada Dicas: Use  GET  para recuperar arquivo HTML, figura, ... Use  POST  para enviar dados (formulário, senha, ...)
Tratando requisições Métodos de HttpServlet
Método HTTP x métodos HttpServlet  GET doGet () HEAD doHead () POST doPost () PUT doPut () DELETE doDelete () OPTIONS doOptions () TRACE doTrace ()
Seqüência típica de uma requisição
Obtendo todos os parâmetros Prática acompanhada 3 Exibindo parâmetros [ http://exemplos.googlecode.com/svn/trunk/scwcd/pa03/ ]
Processo de criação de um servlet Crie o diretório do servlet ( pa03 ) e neste... WEB-INF  (dir) WEB-INF/classes   (dir) Crie descritor de implantação ( web.xml ) Deposite-o em  pa03/WEB-INF Crie o servlet ( ExibeParametros.java ) Deposite-o em  pa03/WEB-INF/classes Compile o Servlet Inicie o tomcat Passaremos item por item...
Grave em sua mente... Todo Servlet é fornecido em um diretório a ser depositado em  webapps Por exemplo exemplo Neste diretório há pelo menos um outro WEB-INF No qual encontra-se  web.xml No qual existe pelo menos o diretório  classes
Em WEB-INF encontra-se web.xml <?xml version=&quot;1.0&quot; encoding=&quot; ISO-8859-1 &quot;?> < web-app  xmlns=&quot;http://java.sun.com/xml/ns/j2ee&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd&quot; version=&quot;2.4&quot;> < servlet > <servlet-name> Identificador </servlet-name> <servlet-class>ExibeParametros</servlet-class> </ servlet > < servlet-mapping > <servlet-name> Identificador </servlet-name> <url-pattern> /* </url-pattern> </ servlet-mapping > </ web-app >
Estrutura típica de um Servlet (HTTP) import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class  MeuServlet  extends  HttpServlet  { // Aqui é sobrescrito doGet, doPost, ... // Observe que temos sobrescrito service() }
Servlet típico que sobrescreve doGet import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class  ExibirParametros  extends  HttpServlet  { public void doGet( HttpServletRequest  r, HttpServletResonse  s) throws  ServletException ,  IOException  { // Código que trata requisição GET } }
Servlet que sobrescreve doGet import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class  ExibirParametros  extends  HttpServlet  { public void doGet( HttpServletRequest  r, HttpServletResonse  s) throws  ServletException ,  IOException  { // Exibindo todos os parâmetros   PrintWriter pw = s.getWriter();   pw.println(“<html><body>”); pw.println(“<h1>Simples resposta</h1>”);   pw.println(“</body></html”); } }
doGet() PrintWriter pw = res.getWriter(); pw.println(“ <html><body> ”); pw.println(“ <h1>ExibeParametros</h1> ”); Enumeration pars = req.getParameterNames(); String parametro; while (pars.hasMoreElements()) { parametro = (String) pars.nextElement(); pw.println( “<br>” + parametro + “: “ ); pw.println( req.getParameter(parametro) ); } pw.println(“ </body></html> ”);
doGet() alternativo ao anterior PrintWriter pw = req.getWriter(); pw.println(“<html><body>”); pw.println(“<h1>ExibeParametros</h1>”); Map<String,String[]> pars = req.getParameterMap(); for (String parametro : pars.keySet()) {   pw.println(&quot;<br>&quot; + parametro);   for (String valor : pars.get(parametro)) pw.println(valor + &quot; &quot;); } Este código “corrige” erro do anterior, que obtinha apenas um valor por parâmetro. De fato, vários podem ser definidos.
Requisições e retornos correspondentes http://localhost:8080/pa03   Apenas o título ExibeParametros é mostrado http://localhost:8080/pa03?a=1&b=2   Além do título seguem duas linhas: a: 1 b: 2
Resultado Observe no  browser  o motivo pelo qual o método GET não é adequado para enviar informações sigilosas
Método POST Prática acompanhada 4 [ http://exemplos.googlecode.com/svn/trunk/scwcd/pa04/ ]
Problema Crie página que captura o nome de uma cidade e o estado correspondente por meio do arquivo  index.html Ao pressionar botão “Envie”, servidor retorna as informações fornecidas para a requisição que emprega o método POST O contexto da aplicação deverá ser  pa04 Nome do Servlet deverá ser  pesquisa Classe que implementa será  Pesquisa URL da consulta será  /pesquisa
Solução Crie estrutura diretório  pa04 subdiretório  WEB-INF subdiretório  classes Crie página inicial (index.html) Crie descritor de aplicação ( web.xml ) Observe restrições no slide anterior
Página HTML (index.html) <html> <body> <form name=“pesquisa” action=“/pa04/pesquisa” method=“ POST ”> <br> Cidade: <input name=“cidade” type=“text”> <br><br> Estado: <input name=“estado” type=“text”> <br><br> <input value=“Envie” type=“submit”> </form> </body> </html>
web.xml <?xml version=&quot;1.0&quot; encoding=&quot; ISO-8859-1 &quot;?> < web-app  xmlns=&quot;http://java.sun.com/xml/ns/j2ee&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd&quot; version=&quot;2.4&quot;> < servlet > <servlet-name> Pesquisa </servlet-name> <servlet-class>Pesquisa</servlet-class> </ servlet > < servlet-mapping > <servlet-name> Pesquisa </servlet-name> <url-pattern> /pesquisa </url-pattern> </ servlet-mapping > </ web-app >
Assinatura do método doPost() protected void  doPost (HttpServletRequest  req, HttpServletResponse  res) throws  ServletException ,  IOException  { // Coloque aqui código para tratar // requisição de método POST }
doPost() PrintWriter pw = res.getWriter(); pw.println(“<html><body>”); pw.println(“<h1>Pesquisa de Opinião</h1>”); pw.println(“Sua cidade preferida: <b>”); pw.println(req.getParameter(“cidade”)); pw.println(“</b><br>”); pw.println(“Estado: <b>”); pw.println(req.getParameter(“estado”)); pw.println(“</b><br><br>”); pw.println(“Muito obrigado!”);
Execução URL ( http://localhost:8080/pa04 ) Arquivo  index.html  é carregado
Retorno fornecido pelo servlet...
Tarefa [ http://exemplos.googlecode.com/svn/trunk/scwcd/pa05/ ]
Problema Uma mensagem HTTP tem como um de seus elementos um  header  ou cabeçalho O cabeçalho é formado por várias entradas. Faça um servlet que exiba todos os cabeçalhos de uma requisição Dicas HttpServletRequest.getHeaderNames() HttpServletRequest.getHeader(String)
Tarefas [ http://exemplos.googlecode.com/svn/trunk/scwcd/pa06/ ]
Problema Lista de opções de pelo menos três portais distintos é exibida por meio de  index.html Usuário seleciona uma das opções e clica em botão que faz com que o Servlet, ao receber a requisição, redirecione o  browser  para o portal selecionado.  Observe que o Servlet irá redirecionar o  browser , ou seja, não se trata de um link em  index.html  que requisita um dos portais desejados.
Dicas HttpServletResponse.sendRedirect() Use um  form  com o elemento  select .  <select name=“portal” size=“2”> <option value=“CNN”>CNN</option> ... </select> Obtenha o valor do parâmetro “portal” e compare com CNN, GOOGLE, ...  Se houver igualdade, então redirecione para o portal correspondente Senão, gere uma exceção throw new RuntimeException(“Algo estranho”)
Resultado (veja argumento “inválido”)

servlet-requisicoes

  • 1.
    Fazendo requisições (GET)Prática acompanhada 1 [ http://exemplos.googlecode.com/svn/trunk/scwcd/pa01/ ] Fábio Nogueira de Lucena Instituto de Informática (UFG)
  • 2.
    GET Exemplo http://www.google.comExemplo com argumentos http://www.google.com.br/search?q=kyriosdata Em html (index.html) <html> <body> Use <a href=“GET?a=x”>get</a> </body> </html>
  • 3.
    Passos Crie odiretório correspondente à aplicação web ( pa01 ) com seus subdiretórios WEB-INF WEB-INF/classes Crie o arquivo index.html (veja slide anterior) Crie o descritor de implantação ( web.xml ) Crie Servlet que exibe argumentos recebidos, caso existam (veja slide seguinte) Compile, implante, inicie o Tomcat e experimente
  • 4.
    Descritor de implantação(web.xml) <?xml version=&quot;1.0&quot; encoding=&quot; ISO-8859-1 &quot;?> < web-app xmlns=&quot;http://java.sun.com/xml/ns/j2ee&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd&quot; version=&quot;2.4&quot;> < servlet > <servlet-name>Identificador</servlet-name> <servlet-class>ObtemArgumento</servlet-class> </ servlet > < servlet-mapping > <servlet-name>Identificador</servlet-name> <url-pattern>/GET</url-pattern> </ servlet-mapping > </ web-app >
  • 5.
    Servlet import java.io.*;import javax.servlet.ServletException; import javax.servlet.http.*; public class ObtemArgumento extends HttpServlet { public void service ( HttpServletRequest r, HttpServletResonse s) throws ServletException, IOException { PrintWriter pw = s.getWriter(); String parametro = r.getParameter(“a”); pw.println(“<html><body>”); pw.println(“<h1>Parâmetro</h1>”); pw.println(“Argumento: a<br>Valor: ” + parametro); pw.println(“</body></html>”); } }
  • 6.
    Compilação... Para compilaré necessário servlet-api.jar Coloque em seu CLASSPATH set CLASSPATH=%CLASSPATH%;<aqui> (win) CLASSPATH=$CLASSPATH:<aqui> (linux) javac -cp <aqui> ... Para iniciar o Tomcat startup.bat (windows) startup.sh (Linux) Experimentar http://localhost:8080/pa01 (carrega index.html) http://localhost:8080/pa01/GET?a=testando
  • 7.
  • 8.
    Fazendo requisições POSTPrática acompanhada 2 [ http://exemplos.googlecode.com/svn/trunk/scwcd/pa02/ ]
  • 9.
    POST Exemplo HTML<html><body> <form name=“teste” method=“ POST ” action=“ /pa02/POST ”> <input type=“text” name=“ a ”> <input type=“submit” name=“botao” value=“Envie”> </form> </body></html> Crie o diretório pa02 e neste Acrescente o arquivo index.html (veja acima) WEB-INF (conterá web.xml ) WEB-INF/classes (conterá o Servlet)
  • 10.
    Descritor de implantação(web.xml) <?xml version=&quot;1.0&quot; encoding=&quot; ISO-8859-1 &quot;?> < web-app xmlns=&quot;http://java.sun.com/xml/ns/j2ee&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd&quot; version=&quot;2.4&quot;> < servlet > <servlet-name>pa02</servlet-name> <servlet-class>ObtemArgumento</servlet-class> </ servlet > < servlet-mapping > <servlet-name>pa02</servlet-name> <url-pattern>/POST</url-pattern> </ servlet-mapping > </ web-app >
  • 11.
    Servlet, compilação, ...Para experimentar http://localhost:8080/pa02 URL do browser não mostra “?a=...”
  • 12.
    Quando usar GET?Quando usar POST? GET Tipo de dado: texto (visível por meio da URL) Quantidade de dados: em geral 255 caracteres POST Tipo de dado: qualquer (não visível pela URL) Quantidade de dados: ilimitada Dicas: Use GET para recuperar arquivo HTML, figura, ... Use POST para enviar dados (formulário, senha, ...)
  • 13.
  • 14.
    Método HTTP xmétodos HttpServlet GET doGet () HEAD doHead () POST doPost () PUT doPut () DELETE doDelete () OPTIONS doOptions () TRACE doTrace ()
  • 15.
    Seqüência típica deuma requisição
  • 16.
    Obtendo todos osparâmetros Prática acompanhada 3 Exibindo parâmetros [ http://exemplos.googlecode.com/svn/trunk/scwcd/pa03/ ]
  • 17.
    Processo de criaçãode um servlet Crie o diretório do servlet ( pa03 ) e neste... WEB-INF (dir) WEB-INF/classes (dir) Crie descritor de implantação ( web.xml ) Deposite-o em pa03/WEB-INF Crie o servlet ( ExibeParametros.java ) Deposite-o em pa03/WEB-INF/classes Compile o Servlet Inicie o tomcat Passaremos item por item...
  • 18.
    Grave em suamente... Todo Servlet é fornecido em um diretório a ser depositado em webapps Por exemplo exemplo Neste diretório há pelo menos um outro WEB-INF No qual encontra-se web.xml No qual existe pelo menos o diretório classes
  • 19.
    Em WEB-INF encontra-seweb.xml <?xml version=&quot;1.0&quot; encoding=&quot; ISO-8859-1 &quot;?> < web-app xmlns=&quot;http://java.sun.com/xml/ns/j2ee&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd&quot; version=&quot;2.4&quot;> < servlet > <servlet-name> Identificador </servlet-name> <servlet-class>ExibeParametros</servlet-class> </ servlet > < servlet-mapping > <servlet-name> Identificador </servlet-name> <url-pattern> /* </url-pattern> </ servlet-mapping > </ web-app >
  • 20.
    Estrutura típica deum Servlet (HTTP) import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class MeuServlet extends HttpServlet { // Aqui é sobrescrito doGet, doPost, ... // Observe que temos sobrescrito service() }
  • 21.
    Servlet típico quesobrescreve doGet import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class ExibirParametros extends HttpServlet { public void doGet( HttpServletRequest r, HttpServletResonse s) throws ServletException , IOException { // Código que trata requisição GET } }
  • 22.
    Servlet que sobrescrevedoGet import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class ExibirParametros extends HttpServlet { public void doGet( HttpServletRequest r, HttpServletResonse s) throws ServletException , IOException { // Exibindo todos os parâmetros PrintWriter pw = s.getWriter(); pw.println(“<html><body>”); pw.println(“<h1>Simples resposta</h1>”); pw.println(“</body></html”); } }
  • 23.
    doGet() PrintWriter pw= res.getWriter(); pw.println(“ <html><body> ”); pw.println(“ <h1>ExibeParametros</h1> ”); Enumeration pars = req.getParameterNames(); String parametro; while (pars.hasMoreElements()) { parametro = (String) pars.nextElement(); pw.println( “<br>” + parametro + “: “ ); pw.println( req.getParameter(parametro) ); } pw.println(“ </body></html> ”);
  • 24.
    doGet() alternativo aoanterior PrintWriter pw = req.getWriter(); pw.println(“<html><body>”); pw.println(“<h1>ExibeParametros</h1>”); Map<String,String[]> pars = req.getParameterMap(); for (String parametro : pars.keySet()) { pw.println(&quot;<br>&quot; + parametro); for (String valor : pars.get(parametro)) pw.println(valor + &quot; &quot;); } Este código “corrige” erro do anterior, que obtinha apenas um valor por parâmetro. De fato, vários podem ser definidos.
  • 25.
    Requisições e retornoscorrespondentes http://localhost:8080/pa03 Apenas o título ExibeParametros é mostrado http://localhost:8080/pa03?a=1&b=2 Além do título seguem duas linhas: a: 1 b: 2
  • 26.
    Resultado Observe no browser o motivo pelo qual o método GET não é adequado para enviar informações sigilosas
  • 27.
    Método POST Práticaacompanhada 4 [ http://exemplos.googlecode.com/svn/trunk/scwcd/pa04/ ]
  • 28.
    Problema Crie páginaque captura o nome de uma cidade e o estado correspondente por meio do arquivo index.html Ao pressionar botão “Envie”, servidor retorna as informações fornecidas para a requisição que emprega o método POST O contexto da aplicação deverá ser pa04 Nome do Servlet deverá ser pesquisa Classe que implementa será Pesquisa URL da consulta será /pesquisa
  • 29.
    Solução Crie estruturadiretório pa04 subdiretório WEB-INF subdiretório classes Crie página inicial (index.html) Crie descritor de aplicação ( web.xml ) Observe restrições no slide anterior
  • 30.
    Página HTML (index.html)<html> <body> <form name=“pesquisa” action=“/pa04/pesquisa” method=“ POST ”> <br> Cidade: <input name=“cidade” type=“text”> <br><br> Estado: <input name=“estado” type=“text”> <br><br> <input value=“Envie” type=“submit”> </form> </body> </html>
  • 31.
    web.xml <?xml version=&quot;1.0&quot;encoding=&quot; ISO-8859-1 &quot;?> < web-app xmlns=&quot;http://java.sun.com/xml/ns/j2ee&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd&quot; version=&quot;2.4&quot;> < servlet > <servlet-name> Pesquisa </servlet-name> <servlet-class>Pesquisa</servlet-class> </ servlet > < servlet-mapping > <servlet-name> Pesquisa </servlet-name> <url-pattern> /pesquisa </url-pattern> </ servlet-mapping > </ web-app >
  • 32.
    Assinatura do métododoPost() protected void doPost (HttpServletRequest req, HttpServletResponse res) throws ServletException , IOException { // Coloque aqui código para tratar // requisição de método POST }
  • 33.
    doPost() PrintWriter pw= res.getWriter(); pw.println(“<html><body>”); pw.println(“<h1>Pesquisa de Opinião</h1>”); pw.println(“Sua cidade preferida: <b>”); pw.println(req.getParameter(“cidade”)); pw.println(“</b><br>”); pw.println(“Estado: <b>”); pw.println(req.getParameter(“estado”)); pw.println(“</b><br><br>”); pw.println(“Muito obrigado!”);
  • 34.
    Execução URL (http://localhost:8080/pa04 ) Arquivo index.html é carregado
  • 35.
  • 36.
  • 37.
    Problema Uma mensagemHTTP tem como um de seus elementos um header ou cabeçalho O cabeçalho é formado por várias entradas. Faça um servlet que exiba todos os cabeçalhos de uma requisição Dicas HttpServletRequest.getHeaderNames() HttpServletRequest.getHeader(String)
  • 38.
  • 39.
    Problema Lista deopções de pelo menos três portais distintos é exibida por meio de index.html Usuário seleciona uma das opções e clica em botão que faz com que o Servlet, ao receber a requisição, redirecione o browser para o portal selecionado. Observe que o Servlet irá redirecionar o browser , ou seja, não se trata de um link em index.html que requisita um dos portais desejados.
  • 40.
    Dicas HttpServletResponse.sendRedirect() Useum form com o elemento select . <select name=“portal” size=“2”> <option value=“CNN”>CNN</option> ... </select> Obtenha o valor do parâmetro “portal” e compare com CNN, GOOGLE, ... Se houver igualdade, então redirecione para o portal correspondente Senão, gere uma exceção throw new RuntimeException(“Algo estranho”)
  • 41.
    Resultado (veja argumento“inválido”)