Como retornar informações para o  browser ? Fábio Nogueira de Lucena Instituto de Informática (UFG)
Retornando informações para o  browser ServletResponse  (interface) Para enviar informações binárias (figuras, ...) getOutputStream() Para enviar textos (essencialmente HTML) getWriter()   Para enviar textos e binários getOutputStream() Para indicar o tipo de conteúdo retornado public void setContentType(String) public void setCharacterEncoding(String) Para obter os valores padrão public String getCharacterEncoding() public String getContentType()
Onde obter detalhes? Character encodings http://www.iana.org/assignments/character-sets Contenty type (MIME Types) http://www.iana.org/ MIME Types foram escritos para email Atualmente são empregados por HTTP, ... Exemplo (header):  Content-type: text/plain
Enviando arquivo binário [ http://exemplos.googlecode.com/svn/trunk/scwcd/pa07/ ]
doGet() res. setContentType ("image/jpeg"); ServletContext context =  getServletContext (); URL url = context. getResource ("/kyrios-logo.jpg"); OutputStream os = res. getOutputStream (); InputStream is = url.openStream(); byte[] byteArray = new byte[1024]; int bytesLidos = 0; while ((bytesLidos = is.read(byteArray)) != -1) { os.write(byteArray,0,bytesLidos); } os.flush(); is.close();
Artefatos deste exemplo Crie o diretório  pa07 index.html  (página inicial) kyrios-logo.jpg  (arquivo binário a ser retornado) WEB-INF  (diretório) web.xml  (arquivo) classes  (diretório) SendBinary.java  (servlet) SendBinary.class  (servlet compilado)
Questão O que ocorre quando o método POST é empregado? Por que?
Problemas com UTF-8, ISO-8859-1, ... [ http://exemplos.googlecode.com/svn/trunk/scwcd/pa26/ ]
Alerta sobre a codificação empregada Defina o formato empregado setContentType(“text/html;charset=UTF8”) ou setContentType(“text/html;charset=ISO-8859-1”) Use a opção  -encoding UTF-8  para compilar arquivos  escritos no formato UTF-8  ou Use a opção  -encoding ISO-8859-1  para compilar arquivos  escritos em ISO-8859-1
Browser  exibe incorretamente!!!??? Provavelmente está configurado para usar um padrão diferente do fornecido Neste caso, altere o padrão Para o  browser  Firefox  faça... Exibir (menu) Codificação (menu) UTF-8 (opção)
Ciclo de Vida de um Servlet [ http://exemplos.googlecode.com/svn/trunk/scwcd/pa25/ ]
Modelo de ciclo de vida
Servlet contêiner (seqüência de ações) Para cada aplicação em  $CATALINA_HOME/webapps o contêiner Lê descritores de implantação ( web.xml ) Para cada servlet definido em  web.xml Cria uma instância do servlet Class.forName(classe).newInstance() (usa construtor sem argumentos) Envia mensagem  init(ServletConfig)  para a instância Aguarda requisições Recebe requisição, identifica servlet destino Invoca a correspondente mensagem  service()
Exercício Crie um Servlet que registre os principais eventos do ciclo de vida de um servlet, ou seja, o início (init()), o tratamento de uma requisição (get ou post) e o término (destroy()) Crie o arquivo log.txt, no contexto da aplicação para registrar cada um destes “momentos”
HttpServletRequest e HttpServletResponse são interfaces Quem as implementa? [ http://exemplos.googlecode.com/svn/trunk/scwcd/pa27/ ]
Organização de interfaces HttpServletRequest  estende  ServletRequest HttpServletResponse  estende  ServletResponse
Obtendo nome de classe (dado objeto) Quem implementa?  HttpServletRequest HttpServletResponse doGet() PrintWriter pw = res.getWriter(); String n1 = req. getClass().getName() ; String n2 = res.getClass().getName(); pw.println(“<html><body>”); pw.println(n1 + “<br>” + n2); pw.println(“</body></html”); Resposta Depende do contêiner
Benefício do emprego de interfaces
ServletConfig Iniciando um Servlet [ http://exemplos.googlecode.com/svn/trunk/scwcd/pa08/ ]
Cenário típico da vida de um servlet Após a instância de um servlet ser criada o contêiner envia a mensagem  init() Servlet pode fazer uso do  init()  para recuperar argumentos, iniciar SGBD, ... Argumentos são passados em  web.xml (servlet) <init-param>   <param-name> Nome </param-name>   <param-value> Curso de Servlet </param-value> </init-param> Argumentos são recuperados via ServletConfig
Problema (e dicas) Servlet que retorna mensagem fornecida em  web.xml  por meio do parâmetro identificado por  msg Acrescentar em  web.xml  ( <servlet> ) <init-param>   <param-name>msg</param-name>   <param-value>A terra é azul!</param-value> </init-param> Usar métodos em init() ServletConfig getServletConfig() String getInitParameter(String)
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>Init</servlet-name> <servlet-class>Init</servlet-class> < init-param >   < param-name >msg</ param-name >   < param-value >A terra é azul!</ param-value > </ init-param > </servlet> <servlet-mapping> <servlet-name>Init</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app>
Revisão Estrutura do código pa08  (diretório) WEB-INF  (diretório) web.xml  (arquivo descritor da aplicação) (contém elemento  init-param ) classes  (diretório contendo servlet) Init.java  (código fonte do servlet) Init.class  (código compilado do servlet)

servlet-respostas

  • 1.
    Como retornar informaçõespara o browser ? Fábio Nogueira de Lucena Instituto de Informática (UFG)
  • 2.
    Retornando informações parao browser ServletResponse (interface) Para enviar informações binárias (figuras, ...) getOutputStream() Para enviar textos (essencialmente HTML) getWriter() Para enviar textos e binários getOutputStream() Para indicar o tipo de conteúdo retornado public void setContentType(String) public void setCharacterEncoding(String) Para obter os valores padrão public String getCharacterEncoding() public String getContentType()
  • 3.
    Onde obter detalhes?Character encodings http://www.iana.org/assignments/character-sets Contenty type (MIME Types) http://www.iana.org/ MIME Types foram escritos para email Atualmente são empregados por HTTP, ... Exemplo (header): Content-type: text/plain
  • 4.
    Enviando arquivo binário[ http://exemplos.googlecode.com/svn/trunk/scwcd/pa07/ ]
  • 5.
    doGet() res. setContentType(&quot;image/jpeg&quot;); ServletContext context = getServletContext (); URL url = context. getResource (&quot;/kyrios-logo.jpg&quot;); OutputStream os = res. getOutputStream (); InputStream is = url.openStream(); byte[] byteArray = new byte[1024]; int bytesLidos = 0; while ((bytesLidos = is.read(byteArray)) != -1) { os.write(byteArray,0,bytesLidos); } os.flush(); is.close();
  • 6.
    Artefatos deste exemploCrie o diretório pa07 index.html (página inicial) kyrios-logo.jpg (arquivo binário a ser retornado) WEB-INF (diretório) web.xml (arquivo) classes (diretório) SendBinary.java (servlet) SendBinary.class (servlet compilado)
  • 7.
    Questão O queocorre quando o método POST é empregado? Por que?
  • 8.
    Problemas com UTF-8,ISO-8859-1, ... [ http://exemplos.googlecode.com/svn/trunk/scwcd/pa26/ ]
  • 9.
    Alerta sobre acodificação empregada Defina o formato empregado setContentType(“text/html;charset=UTF8”) ou setContentType(“text/html;charset=ISO-8859-1”) Use a opção -encoding UTF-8 para compilar arquivos escritos no formato UTF-8 ou Use a opção -encoding ISO-8859-1 para compilar arquivos escritos em ISO-8859-1
  • 10.
    Browser exibeincorretamente!!!??? Provavelmente está configurado para usar um padrão diferente do fornecido Neste caso, altere o padrão Para o browser Firefox faça... Exibir (menu) Codificação (menu) UTF-8 (opção)
  • 11.
    Ciclo de Vidade um Servlet [ http://exemplos.googlecode.com/svn/trunk/scwcd/pa25/ ]
  • 12.
  • 13.
    Servlet contêiner (seqüênciade ações) Para cada aplicação em $CATALINA_HOME/webapps o contêiner Lê descritores de implantação ( web.xml ) Para cada servlet definido em web.xml Cria uma instância do servlet Class.forName(classe).newInstance() (usa construtor sem argumentos) Envia mensagem init(ServletConfig) para a instância Aguarda requisições Recebe requisição, identifica servlet destino Invoca a correspondente mensagem service()
  • 14.
    Exercício Crie umServlet que registre os principais eventos do ciclo de vida de um servlet, ou seja, o início (init()), o tratamento de uma requisição (get ou post) e o término (destroy()) Crie o arquivo log.txt, no contexto da aplicação para registrar cada um destes “momentos”
  • 15.
    HttpServletRequest e HttpServletResponsesão interfaces Quem as implementa? [ http://exemplos.googlecode.com/svn/trunk/scwcd/pa27/ ]
  • 16.
    Organização de interfacesHttpServletRequest estende ServletRequest HttpServletResponse estende ServletResponse
  • 17.
    Obtendo nome declasse (dado objeto) Quem implementa? HttpServletRequest HttpServletResponse doGet() PrintWriter pw = res.getWriter(); String n1 = req. getClass().getName() ; String n2 = res.getClass().getName(); pw.println(“<html><body>”); pw.println(n1 + “<br>” + n2); pw.println(“</body></html”); Resposta Depende do contêiner
  • 18.
    Benefício do empregode interfaces
  • 19.
    ServletConfig Iniciando umServlet [ http://exemplos.googlecode.com/svn/trunk/scwcd/pa08/ ]
  • 20.
    Cenário típico davida de um servlet Após a instância de um servlet ser criada o contêiner envia a mensagem init() Servlet pode fazer uso do init() para recuperar argumentos, iniciar SGBD, ... Argumentos são passados em web.xml (servlet) <init-param> <param-name> Nome </param-name> <param-value> Curso de Servlet </param-value> </init-param> Argumentos são recuperados via ServletConfig
  • 21.
    Problema (e dicas)Servlet que retorna mensagem fornecida em web.xml por meio do parâmetro identificado por msg Acrescentar em web.xml ( <servlet> ) <init-param> <param-name>msg</param-name> <param-value>A terra é azul!</param-value> </init-param> Usar métodos em init() ServletConfig getServletConfig() String getInitParameter(String)
  • 22.
    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>Init</servlet-name> <servlet-class>Init</servlet-class> < init-param > < param-name >msg</ param-name > < param-value >A terra é azul!</ param-value > </ init-param > </servlet> <servlet-mapping> <servlet-name>Init</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app>
  • 23.
    Revisão Estrutura docódigo pa08 (diretório) WEB-INF (diretório) web.xml (arquivo descritor da aplicação) (contém elemento init-param ) classes (diretório contendo servlet) Init.java (código fonte do servlet) Init.class (código compilado do servlet)