Учебники

Сервлеты — Данные формы

Вы, должно быть, сталкивались со многими ситуациями, когда вам нужно передать некоторую информацию из вашего браузера на веб-сервер и, в конечном итоге, в вашу бэкэнд-программу. Браузер использует два метода для передачи этой информации на веб-сервер. Это методы GET и POST.

ПОЛУЧИТЬ метод

Метод GET отправляет закодированную информацию пользователя, добавленную к запросу страницы. Страница и закодированная информация разделены знаком ? (знак вопроса) следующим образом —

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

Метод GET является методом по умолчанию для передачи информации из браузера на веб-сервер, и он создает длинную строку, которая появляется в поле «Местоположение:» вашего браузера. Никогда не используйте метод GET, если у вас есть пароль или другая конфиденциальная информация для передачи на сервер. Метод GET имеет ограничение по размеру: в строке запроса можно использовать только 1024 символа.

Эта информация передается с использованием заголовка QUERY_STRING и будет доступна через переменную среды QUERY_STRING, а сервлет обрабатывает запросы такого типа с помощью метода doGet () .

Метод POST

Как правило, более надежным методом передачи информации в бэкэнд-программу является метод POST. Это упаковывает информацию точно так же, как метод GET, но вместо отправки ее в виде текстовой строки после символа? (вопросительный знак) в URL он отправляет как отдельное сообщение. Это сообщение поступает в бэкэнд-программу в виде стандартного ввода, который вы можете проанализировать и использовать для обработки. Сервлет обрабатывает этот тип запросов с помощью метода doPost () .

Чтение данных формы с помощью сервлета

Сервлеты автоматически обрабатывают данные, используя следующие методы в зависимости от ситуации:

  • getParameter () — Вы вызываете метод request.getParameter (), чтобы получить значение параметра формы.

  • getParameterValues ​​() — Вызовите этот метод, если параметр появляется более одного раза и возвращает несколько значений, например, флажок.

  • getParameterNames ()вызовите этот метод, если вы хотите получить полный список всех параметров в текущем запросе.

getParameter () — Вы вызываете метод request.getParameter (), чтобы получить значение параметра формы.

getParameterValues ​​() — Вызовите этот метод, если параметр появляется более одного раза и возвращает несколько значений, например, флажок.

getParameterNames ()вызовите этот метод, если вы хотите получить полный список всех параметров в текущем запросе.

Пример получения метода с использованием URL

Вот простой URL, который передаст два значения программе HelloForm, используя метод GET.

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

Ниже приведена программа сервлета HelloForm.java для обработки входных данных, данных веб-браузером. Мы собираемся использовать метод getParameter (), который упрощает доступ к передаваемой информации —

// 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>"
      );
   }
}

Предполагая, что ваша среда настроена правильно, скомпилируйте HelloForm.java следующим образом:

$ javac HelloForm.java

Если все пойдет хорошо, приведенная выше компиляция выдаст файл HelloForm.class . Затем вам нужно будет скопировать этот файл класса в <Tomcat-installationdirectory> / webapps / ROOT / WEB-INF / classes и создать следующие записи в файле web.xml, расположенном в <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>

Теперь введите http: // localhost: 8080 / HelloForm? First_name = ZARA & last_name = ALI в поле Location: вашего браузера и убедитесь, что вы уже запустили tomcat-сервер, прежде чем запускать указанную выше команду в браузере. Это приведет к следующему результату —

Using GET Method to Read Form Data

  • First Name : ZARA
  • Last Name : ALI

Пример метода GET с использованием формы

Вот простой пример, который передает два значения, используя HTML FORM и кнопку отправки. Мы собираемся использовать тот же Servlet HelloForm для обработки этого ввода.

<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>

Сохраните этот HTML-файл в файле Hello.htm и поместите его в каталог <Tomcat-InstallationDirectory> / webapps / ROOT. Когда вы обращаетесь к http: // localhost: 8080 / Hello.htm , вот фактический результат вышеприведенной формы.

Имя: Фамилия:

Попробуйте ввести имя и фамилию, а затем нажмите кнопку «Отправить», чтобы увидеть результат на локальном компьютере, на котором запущен tomcat. На основе предоставленного ввода, он будет генерировать результат, аналогичный указанному в приведенном выше примере.

Пример метода POST с использованием формы

Давайте немного изменим вышеприведенный сервлет, чтобы он мог обрабатывать как методы GET, так и методы POST. Ниже приведена программа сервлета HelloForm.java для обработки входных данных, данных веб-браузером, с использованием методов GET или 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);
   }
}

Теперь скомпилируйте и разверните вышеупомянутый сервлет и протестируйте его, используя Hello.htm с методом POST следующим образом:

<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>

Вот фактический результат вышеприведенной формы. Попробуйте ввести имя и фамилию, а затем нажмите кнопку «Отправить», чтобы увидеть результат на локальном компьютере, на котором запущен tomcat.

Имя: Фамилия:

Основываясь на предоставленных входных данных, он будет генерировать аналогичный результат, как указано в приведенных выше примерах.

Передача данных флажка в программу сервлета

Флажки используются, когда требуется выбрать более одной опции.

Вот пример HTML-кода CheckBox.htm для формы с двумя флажками

<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>

Результатом этого кода является следующая форма

математика физика Химия

Ниже приведена программа сервлета CheckBox.java для обработки ввода, заданного веб-браузером для кнопки-флажка.

// 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);
   }
}

Для приведенного выше примера будет отображаться следующий результат —

Reading Checkbox Data

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

Чтение всех параметров формы

Ниже приведен общий пример, который использует метод getParameterNames () из HttpServletRequest для чтения всех доступных параметров формы. Этот метод возвращает перечисление, которое содержит имена параметров в неопределенном порядке

Как только у нас будет Enumeration, мы можем зациклить Enumeration стандартным способом, используя метод hasMoreElements (), чтобы определить, когда остановиться, и используя метод nextElement (), чтобы получить имя каждого параметра.

// 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);
   }
}

Теперь попробуйте приведенный выше сервлет в следующей форме:

<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>

Теперь вызов сервлета с использованием вышеуказанной формы приведет к следующему результату:

Reading All Form Parameters

Param Name Param Value(s)
maths on
chemistry on

Вы можете попробовать приведенный выше сервлет, чтобы прочитать данные любой другой формы, имеющие другие объекты, такие как текстовое поле, переключатель или раскрывающийся список и т. Д.