Вы, должно быть, сталкивались со многими ситуациями, когда вам нужно передать некоторую информацию из вашего браузера на веб-сервер и, в конечном итоге, в вашу бэкэнд-программу. Браузер использует два метода для передачи этой информации на веб-сервер. Это методы 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 |
Вы можете попробовать приведенный выше сервлет, чтобы прочитать данные любой другой формы, имеющие другие объекты, такие как текстовое поле, переключатель или раскрывающийся список и т. Д.