Сервлеты - данные формы

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

GET метод

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

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

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

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

Метод POST

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

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

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

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

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

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

Пример метода GET с использованием 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 и кнопки отправки. Мы собираемся использовать тот же сервлет 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

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