Servlets - dados de formulário

Você deve ter se deparado com muitas situações em que precisa passar algumas informações de seu navegador para o servidor da web e, finalmente, para o programa de back-end. O navegador usa dois métodos para passar essas informações ao servidor da web. Esses métodos são Método GET e Método POST.

Método GET

O método GET envia as informações codificadas do usuário anexadas à solicitação de página. A página e as informações codificadas são separadas pelo? (ponto de interrogação) símbolo da seguinte forma -

http://www.test.com/hello?key1 = value1&key2 = value2

O método GET é o método padrão para passar informações do navegador para o servidor da web e produz uma longa string que aparece na caixa Location: do seu navegador. Nunca use o método GET se você tiver uma senha ou outras informações confidenciais para passar para o servidor. O método GET tem limitação de tamanho: apenas 1024 caracteres podem ser usados ​​em uma string de solicitação.

Esta informação é passada usando o cabeçalho QUERY_STRING e estará acessível através da variável de ambiente QUERY_STRING e o Servlet lida com este tipo de requisição usando doGet() método.

Método POST

Um método geralmente mais confiável de passar informações para um programa de back-end é o método POST. Isso empacota as informações exatamente da mesma maneira que o método GET, mas em vez de enviá-las como uma string de texto após um? (ponto de interrogação) no URL, ele o envia como uma mensagem separada. Esta mensagem chega ao programa de backend na forma de entrada padrão que você pode analisar e usar para o seu processamento. O servlet lida com este tipo de solicitações usandodoPost() método.

Leitura de dados de formulário usando servlet

Servlets lida com a análise de dados de formulário automaticamente usando os seguintes métodos, dependendo da situação -

  • getParameter() - Você chama o método request.getParameter () para obter o valor de um parâmetro de formulário.

  • getParameterValues() - Chame este método se o parâmetro aparecer mais de uma vez e retornar vários valores, por exemplo, caixa de seleção.

  • getParameterNames() - Chame esse método se quiser uma lista completa de todos os parâmetros na solicitação atual.

Exemplo de método GET usando URL

Aqui está uma URL simples que passará dois valores para o programa HelloForm usando o método GET.

http://localhost:8080/HelloForm?first_name = ZARA&last_name = ALI

Dado abaixo é o HelloForm.javaprograma servlet para lidar com a entrada fornecida pelo navegador da web. Vamos usargetParameter() método que torna muito fácil acessar as informações passadas -

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

// Extend HttpServlet class
public class HelloForm extends HttpServlet {
 
   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      
      // Set response content type
      response.setContentType("text/html");

      PrintWriter out = response.getWriter();
      String title = "Using GET Method to Read Form Data";
      String docType =
         "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
         
      out.println(docType +
         "<html>\n" +
            "<head><title>" + title + "</title></head>\n" +
            "<body bgcolor = \"#f0f0f0\">\n" +
               "<h1 align = \"center\">" + title + "</h1>\n" +
               "<ul>\n" +
                  "  <li><b>First Name</b>: "
                  + request.getParameter("first_name") + "\n" +
                  "  <li><b>Last Name</b>: "
                  + request.getParameter("last_name") + "\n" +
               "</ul>\n" +
            "</body>" +
         "</html>"
      );
   }
}

Supondo que seu ambiente esteja configurado corretamente, compile HelloForm.java da seguinte maneira -

$ javac HelloForm.java

Se tudo correr bem, a compilação acima produzirá HelloForm.classArquivo. Em seguida, você teria que copiar este arquivo de classe em <Tomcat-installationdirectory> / webapps / ROOT / WEB-INF / classes e criar as seguintes entradas emweb.xml arquivo localizado em <Tomcat-installation-directory> / webapps / ROOT / WEB-INF /

<servlet>
   <servlet-name>HelloForm</servlet-name>
   <servlet-class>HelloForm</servlet-class>
</servlet>

<servlet-mapping>
   <servlet-name>HelloForm</servlet-name>
   <url-pattern>/HelloForm</url-pattern>
</servlet-mapping>

Agora digite http: // localhost: 8080 / HelloForm? First_name = ZARA & last_name = ALI na caixa Location: do seu navegador e certifique-se de que já iniciou o servidor tomcat, antes de disparar o comando acima no navegador. Isso geraria o seguinte resultado -

Using GET Method to Read Form Data

  • First Name: ZARA
  • Last Name: ALI

Exemplo de método GET usando formulário

Aqui está um exemplo simples que passa dois valores usando HTML FORM e o botão de envio. Vamos usar o mesmo Servlet HelloForm para lidar com essa entrada.

<html>
   <body>
      <form action = "HelloForm" method = "GET">
         First Name: <input type = "text" name = "first_name">
         <br />
         Last Name: <input type = "text" name = "last_name" />
         <input type = "submit" value = "Submit" />
      </form>
   </body>
</html>

Mantenha este HTML em um arquivo Hello.htm e coloque-o no diretório <Tomcat-installationdirectory> / webapps / ROOT. Quando você acessa http: // localhost: 8080 / Hello.htm , aqui está a saída real do formulário acima.

Tente inserir o nome e o sobrenome e clique no botão enviar para ver o resultado em sua máquina local onde o tomcat está sendo executado. Com base na entrada fornecida, ele gerará um resultado semelhante ao mencionado no exemplo acima.

Exemplo de método POST usando formulário

Vamos fazer pequenas modificações no servlet acima, para que ele possa lidar com os métodos GET e POST. Abaixo estáHelloForm.java programa servlet para lidar com a entrada fornecida pelo navegador da web usando os métodos GET ou POST.

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

// Extend HttpServlet class
public class HelloForm extends HttpServlet {

   // Method to handle GET method request.
   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      
      // Set response content type
      response.setContentType("text/html");

      PrintWriter out = response.getWriter();
      String title = "Using GET Method to Read Form Data";
      String docType =
         "<!doctype html public \"-//w3c//dtd html 4.0 " +
         "transitional//en\">\n";
         
      out.println(docType +
         "<html>\n" +
            "<head><title>" + title + "</title></head>\n" +
            "<body bgcolor = \"#f0f0f0\">\n" +
               "<h1 align = \"center\">" + title + "</h1>\n" +
               "<ul>\n" +
                  "  <li><b>First Name</b>: "
                  + request.getParameter("first_name") + "\n" +
                  "  <li><b>Last Name</b>: "
                  + request.getParameter("last_name") + "\n" +
               "</ul>\n" +
            "</body>"
         "</html>"
      );
   }

   // Method to handle POST method request.
   public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

      doGet(request, response);
   }
}

Agora compile e implante o Servlet acima e teste-o usando Hello.htm com o método POST da seguinte forma -

<html>
   <body>
      <form action = "HelloForm" method = "POST">
         First Name: <input type = "text" name = "first_name">
         <br />
         Last Name: <input type = "text" name = "last_name" />
         <input type = "submit" value = "Submit" />
      </form>
   </body>
</html>

Aqui está a saída real do formulário acima, tente inserir o nome e o sobrenome e clique no botão enviar para ver o resultado em sua máquina local onde o tomcat está sendo executado.

Com base na entrada fornecida, ele geraria um resultado semelhante ao mencionado nos exemplos acima.

Passando Dados da Caixa de Seleção para o Programa Servlet

As caixas de seleção são usadas quando mais de uma opção deve ser selecionada.

Aqui está um exemplo de código HTML, CheckBox.htm, para um formulário com duas caixas de seleção

<html>
   <body>
      <form action = "CheckBox" method = "POST" target = "_blank">
         <input type = "checkbox" name = "maths" checked = "checked" /> Maths
         <input type = "checkbox" name = "physics"  /> Physics
         <input type = "checkbox" name = "chemistry" checked = "checked" /> 
                                          Chemistry
         <input type = "submit" value = "Select Subject" />
      </form>
   </body>
</html>

O resultado deste código é o seguinte formulário

A seguir está o programa de servlet CheckBox.java para lidar com a entrada fornecida pelo navegador da web para o botão de caixa de seleção.

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

// Extend HttpServlet class
public class CheckBox extends HttpServlet {
 
   // Method to handle GET method request.
   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      
      // Set response content type
      response.setContentType("text/html");

      PrintWriter out = response.getWriter();
      String title = "Reading Checkbox Data";
      String docType =
         "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";

      out.println(docType +
         "<html>\n" +
            "<head><title>" + title + "</title></head>\n" +
            "<body bgcolor = \"#f0f0f0\">\n" +
               "<h1 align = \"center\">" + title + "</h1>\n" +
               "<ul>\n" +
                  "  <li><b>Maths Flag : </b>: "
                  + request.getParameter("maths") + "\n" +
                  "  <li><b>Physics Flag: </b>: "
                  + request.getParameter("physics") + "\n" +
                  "  <li><b>Chemistry Flag: </b>: "
                  + request.getParameter("chemistry") + "\n" +
               "</ul>\n" +
            "</body>"
         "</html>"
      );
   }

   // Method to handle POST method request.
   public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      
      doGet(request, response);
   }
}

Para o exemplo acima, ele exibiria o seguinte resultado -

Reading Checkbox Data

  • Maths Flag : : on
  • Physics Flag: : null
  • Chemistry Flag: : on

Lendo todos os parâmetros do formulário

A seguir está o exemplo genérico que usa getParameterNames()método de HttpServletRequest para ler todos os parâmetros de formulário disponíveis. Este método retorna uma Enumeração que contém os nomes dos parâmetros em uma ordem não especificada

Assim que tivermos uma Enumeração, podemos fazer um loop da Enumeração de maneira padrão, usando o método hasMoreElements () para determinar quando parar e usando o método nextElement () para obter cada nome de parâmetro.

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

// Extend HttpServlet class
public class ReadParams extends HttpServlet {
 
   // Method to handle GET method request.
   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      
      // Set response content type
      response.setContentType("text/html");

      PrintWriter out = response.getWriter();
      String title = "Reading All Form Parameters";
      String docType =
         "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";

      out.println(docType +
         "<html>\n" +
         "<head><title>" + title + "</title></head>\n" +
         "<body bgcolor = \"#f0f0f0\">\n" +
         "<h1 align = \"center\">" + title + "</h1>\n" +
         "<table width = \"100%\" border = \"1\" align = \"center\">\n" +
         "<tr bgcolor = \"#949494\">\n" +
            "<th>Param Name</th>"
            "<th>Param Value(s)</th>\n"+
         "</tr>\n"
      );

      Enumeration paramNames = request.getParameterNames();

      while(paramNames.hasMoreElements()) {
         String paramName = (String)paramNames.nextElement();
         out.print("<tr><td>" + paramName + "</td>\n<td>");
         String[] paramValues = request.getParameterValues(paramName);

         // Read single valued data
         if (paramValues.length == 1) {
            String paramValue = paramValues[0];
            if (paramValue.length() == 0)
               out.println("<i>No Value</i>");
               else
               out.println(paramValue);
         } else {
            // Read multiple valued data
            out.println("<ul>");

            for(int i = 0; i < paramValues.length; i++) {
               out.println("<li>" + paramValues[i]);
            }
            out.println("</ul>");
         }
      }
      out.println("</tr>\n</table>\n</body></html>");
   }
   
   // Method to handle POST method request.
   public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      
      doGet(request, response);
   }
}

Agora, tente o servlet acima com a seguinte forma -

<html>
   <body>
      <form action = "ReadParams" method = "POST" target = "_blank">
         <input type = "checkbox" name = "maths" checked = "checked" /> Maths
         <input type = "checkbox" name = "physics"  /> Physics
         <input type = "checkbox" name = "chemistry" checked = "checked" /> Chem
         <input type = "submit" value = "Select Subject" />
      </form>
   </body>
</html>

Agora, chamar o servlet usando o formulário acima geraria o seguinte resultado -

Reading All Form Parameters

Param Name Param Value(s)
maths on
chemistry on

Você pode tentar o servlet acima para ler os dados de qualquer outro formulário, tendo outros objetos como caixa de texto, botão de rádio ou caixa suspensa, etc.