Introdução a Servlets

Programação Java para Web

Prof. Wagner Macedo

## Servlets - [Definições](#sec-definicoes) - [Criando um Servlet](#sec-criar-servlet) - [Mapeando a URL](#sec-mapear-servlet) - [Servlet HTTP](#sec-servlet-http) - [Obtendo dados do usuário](#sec-obter-dados-servlet)

Servlet

Pequenos programas Java para responder a requisições HTTP.

Antes de uma requisição de cliente chegar a um Servlet, esta requisição passará pelo Container Web em que o Servlet foi configurado.

Servlets são partes de uma Aplicação Java Web

Um Container Web pode executar várias aplicações ao mesmo tempo.

Cada aplicação pode ter múltiplos servlets configurados para responder.

Criando um Servlet

ou, como colocar um Servlet no forno…

Inicie uma Aplicação Web com o NetBeans

Quando estiver criando o projeto na IDE:

  • Escolha o servidor Apache Tomcat
  • Não escolha nenhum framework

Caso a opção Apache Tomcat não apareça, você deve reinstalar o NetBeans, certificando de marcar a opção na janela do instalador.

Baixe a opção Java EE da IDE NetBeans para vir com as ferramentas de web.

Crie uma Classe Java

Classes Servlet

Servlet Genérico


        package fanese.web;

        import java.io.IOException;
        import java.io.PrintWriter;
        import javax.servlet.GenericServlet;
        import javax.servlet.ServletException;
        import javax.servlet.ServletRequest;
        import javax.servlet.ServletResponse;

        public class ExemploServlet extends GenericServlet {
            @Override
            public void service(ServletRequest request, ServletResponse response)
                    throws ServletException, IOException {
                PrintWriter conteudo = response.getWriter();
                conteudo.println("<html>");
                conteudo.println("<head><title>Java Web</title>"
                        + "<meta charset=utf-8></head>");
                conteudo.println("<body>Olá Mundo Java</body>");
                conteudo.println("</html>");
            }
        }
      

Mapeando o Servlet para URL

Configurando a aplicação para conhecer o Servlet

Crie o arquivo WEB-INF/web.xml

Configurando Servlet para responder em /OlaMundo


        <?xml version="1.0" encoding="UTF-8"?>
        
        <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
                 version="3.1">
            <servlet>
                <servlet-name>Servlet01</servlet-name>
                <servlet-class>fanese.web.ExemploServlet</servlet-class>
            </servlet>
            <servlet-mapping>
                <servlet-name>Servlet01</servlet-name>
                <url-pattern>/OlaMundo</url-pattern>
            </servlet-mapping>
        
            <session-config>
                <session-timeout>
                    30
                </session-timeout>
            </session-config>
        </web-app>
      

Requisitando o Servlet

Configure o Tomcat para ouvir em localhost

No arquivo server.xml, você vai adicionar o atributo address="localhost" às seguintes linhas

        <Connector address="localhost" URIEncoding="utf-8" connectionTimeout="20000" port="8084" protocol="HTTP/1.1" redirectPort="8443"/>
      

        <Connector address="localhost" port="8009" protocol="AJP/1.3" redirectPort="8443"/>
      
O que é localhost?

Execute a aplicação e acesse /OlaMundo

Prática Servlet I

  1. Dentro do método service(), insira antes de escrever o conteúdo, a instrução abaixo.

    Depois teste no browser e responda: mudou alguma coisa?

    
            response.setCharacterEncoding("utf-8");
          
  2. No mesmo método, informe o tipo de conteúdo da resposta:
    
            response.setContentType("text/html");
          
    • Troque o tipo de conteúdo por "text/plain"
    • Troque o tipo de conteúdo por "image/png"

Servlet HTTP


        package fanese.web;

        import java.io.IOException;
        import java.io.PrintWriter;
        import javax.servlet.ServletException;
        import javax.servlet.http.HttpServlet;
        import javax.servlet.http.HttpServletRequest;
        import javax.servlet.http.HttpServletResponse;

        public class ExemploServlet2 extends HttpServlet {
          @Override
          protected void doGet(HttpServletRequest request, HttpServletResponse response)
                  throws ServletException, IOException {
              PrintWriter conteudo = response.getWriter();
              conteudo.println("Acesso via GET realizado");
          }

          @Override
          protected void doPost(HttpServletRequest request, HttpServletResponse response)
                  throws ServletException, IOException {
              PrintWriter conteudo = response.getWriter();
              conteudo.println("Acesso via POST realizado");
          }
        }
      

Configure o web.xml para o novo Servlet


      <servlet>
          <servlet-name>Servlet via HTTP</servlet-name>
          <servlet-class>fanese.web.ExemploServlet2</servlet-class>
      </servlet>
      <servlet-mapping>
          <servlet-name>Servlet via HTTP</servlet-name>
          <url-pattern>/via-http</url-pattern>
      </servlet-mapping>
    

Prática Servlet II

Usando o Postman, faça as seguintes requisições:

Obtendo Dados da Requisição

Servlet que obtém parâmetros da query string


        public class ExemploServlet3 extends HttpServlet {
          @Override
          protected void doGet(HttpServletRequest request, HttpServletResponse response)
                  throws ServletException, IOException {
              // Obtém os dados enviados
              String txtNome = request.getParameter("nome");
              String txtIdade = request.getParameter("idade");
              // Processa os dados
              if (txtNome == null) {
                  txtNome = "[anônimo]";
              }
              String classeIdade = "menor";
              int idade = Integer.parseInt(txtIdade);
              if (idade >= 18) {
                  classeIdade = "maior";
              }
              // Devolve uma resposta com os dados
              PrintWriter conteudo = response.getWriter();
              conteudo.println("<html><head><meta charset=utf-8></head>");
              conteudo.println("<body>");
              conteudo.println("<b>" + txtNome + "</b> tem <b>"
                      + idade + "</b> anos (de " + classeIdade + ")");
              conteudo.println("</body></html>");
          }
        }
      

Obter parâmetros via POST: a implementação é igual


        public class ExemploServlet4 extends HttpServlet {
          @Override
          protected void doPost(HttpServletRequest request, HttpServletResponse response)
                  throws ServletException, IOException {
              // Obtém os dados enviados
              String txtNome = request.getParameter("nome");
              String txtIdade = request.getParameter("idade");
              // Processa os dados
              if (txtNome == null) {
                  txtNome = "[anônimo]";
              }
              String classeIdade = "menor";
              int idade = Integer.parseInt(txtIdade);
              if (idade >= 18) {
                  classeIdade = "maior";
              }
              // Devolve uma resposta com os dados
              PrintWriter conteudo = response.getWriter();
              conteudo.println("<html><head><meta charset=utf-8></head>");
              conteudo.println("<body>");
              conteudo.println("<b>" + txtNome + "</b> tem <b>"
                      + idade + "</b> anos (de " + classeIdade + ")");
              conteudo.println("</body></html>");
          }
        }
      

Prática Servlet III

  1. Configure no web.xml os servlets:
    • ExemploServlet3
    • ExemploServlet4
  2. Acesse usando o browser a URL do ExemploServlet3
  3. Acesse usando o browser a URL do ExemploServlet4

Servlets também podem ser mapeados por anotação:


    package fanese.web;

    ⋮
    import javax.servlet.GenericServlet;
    import javax.servlet.annotation.WebServlet;

    @WebServlet(name = "Servlet01", urlPatterns = {"/OlaMundo"})
    public class ExemploServlet extends GenericServlet {
        ⋮
    }
  
Leitura Recomendada 🔖

Capítulo 3: Servlets

Capítulo 4: Introd. aos Servlets
Capítulo 6: A classe HttpServlet

Dúvidas?

Este slide pode ser encontrado em:
http://prof.wagnermacedo.com/2017-2/PJW/5