English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Формулярные данные Servlet

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

Метод GET

Метод GET отправляет закодированные данные пользователя на страницу. Параметры и закодированные данные разделены символом ?, например:

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

Метод GET является стандартным способом передачи информации от браузера к веб-серверу, он создает очень длинную строку,出现的浏览器的 адресной строке. Если вы хотите передать на сервер пароль или другие конфиденциальные данные, не используйте метод GET. Метод GET имеет ограничение по размеру: в строке запроса может быть максимум 1024 символов.

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

Метод POST

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

Использование Servlet для чтения данных формы

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

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

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

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

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

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

http://localhost:8080/TomcatTest/HelloForm?name=Основной учебник сети&url=ru.oldtoolbag.com

Вот пример обработки ввода веб-браузера: HelloForm.java Программа Servlet. Мы будем использовать getParameter()  Метод, который позволяет легко получить переданные данные:

package com.w3codebox.test;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * Класс реализации Servlet HelloForm
 */
@WebServlet("/HelloForm")
public class HelloForm extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public HelloForm() {
        super();
        // TODO Автоматически сгенерированный конструктор шаблона
    }
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置响应内容类型
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        String title = "Использование метода GET для чтения данных формы";
        // Обработка китайского языка
        String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "UTF-8");
        String docType = "<!DOCTYPE html> \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>Имя сайта</b> :"
            + name + "\n" +
            "<li><b>Адрес</b> :"
            + request.getParameter("url") + "\n" +
            "</ul>\n" +
            "</body></html>
    }
    
    // Обработка метода запроса POST
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

Затем мы в web.xml Создайте следующие записи в файле:

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <servlet>
    <servlet-name>HelloForm</servlet-name>
    <servlet-class>com.w3codebox.test.HelloForm</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>HelloForm</servlet-name>
    <url-pattern>/TomcatTest/HelloForm</url-pattern>
  </servlet-mapping>
</web-app>

Теперь введите адрес в строке адреса браузера: http://localhost:8080/TomcatTest/HelloForm?name=Основной учебник сети&url=ru.oldtoolbag.com Убедитесь, что Tomcat сервер уже запущен перед выполнением вышеуказанных команд. Если все идет хорошо, вы получите следующий результат:

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

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

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Основной учебник сайта (oldtoolbag.com)</title>
</head>
<body>
<form action="HelloForm" method="GET">
Имя сайта: <input type="text" name="name">
<br />
Адрес сайта: <input type="text" name="url" />
<input type="submit" value="Подтвердить" />
</form>
</body>
</html>

Сохраните этот HTML в файл hello.html, структура каталога приведена ниже:

Попробуйте ввести имя веб-сайта и адрес, а затем нажмите кнопку "Подтвердить", как показано ниже:

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

Давайте внесем небольшие изменения в приведенный выше Servlet, чтобы он мог обрабатывать методы GET и POST. Ниже приведен пример использования метода POST формы: HelloForm.java Servlet-программа использует методы GET и POST для обработки ввода, предоставляемого веб-браузером.

Примечание: если данные формы содержат китайские данные,则需要 кодировать:

String name = new String(request.getParameter("name").getBytes("ISO8859-1"),"UTF-8");
package com.w3codebox.test;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * Класс реализации Servlet HelloForm
 */
@WebServlet("/HelloForm")
public class HelloForm extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public HelloForm() {
        super();
        // TODO Автоматически сгенерированный конструктор шаблона
    }
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置响应内容类型
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        String title = "Чтение данных формы с помощью метода POST";
        // Обработка китайского языка
        String name = new String(request.getParameter("name").getBytes("ISO8859-1"),"UTF-8");
        String docType = "<!DOCTYPE html> \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>Имя сайта</b> :"
            + name + "\n" +
            "<li><b>Адрес</b> :"
            + request.getParameter("url") + "\n" +
            "</ul>\n" +
            "</body></html>
    }
    
    // Обработка метода запроса POST
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

Теперь скомпилируйте и разверните приведенный выше Servlet и проверьте его с помощью hello.html, который использует метод POST, как показано ниже:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Основной учебник сайта (oldtoolbag.com)</title>
</head>
<body>
<form action="HelloForm" method="POST">
Имя сайта: <input type="text" name="name">
<br />
Адрес сайта: <input type="text" name="url" />
<input type="submit" value="Подтвердить" />
</form>
</body>
</html>

Ниже приведен реальный вывод上面 приведенной формы. Введите имя сайта и адрес сайта, затем нажмите кнопку "Подтвердить", как показано ниже:


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

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

Ниже приведен пример HTML-кода checkbox.html, форма с двумя флажками.

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Основной учебник сайта (oldtoolbag.com)</title>
</head>
<body>
<form action="CheckBox" method="POST" target="_blank">
<input type="checkbox" name="w3codebox" checked="checked" /> Основной учебный ресурс
<input type="checkbox" name="google" /> Google
<input type="checkbox" name="taobao" checked="checked" /> Таobao
<input type="submit" value="Выбрать сайт" />
</form>
</body>
</html>

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

package com.w3codebox.test;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * Класс реализации сервлета CheckBox
 */
@WebServlet("/CheckBox")
public class CheckBox extends HttpServlet {
    private static final long serialVersionUID = 1L;
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        // 设置响应内容类型
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        String title = "Чтение данных флажков";
        String docType = "<!DOCTYPE html> \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>Цзиньъяо по учебнику идентификатор:</b>: "
                + request.getParameter("w3codebox") + "\n" +
                "    <li><b>Google идентификатор:</b>: "
                + request.getParameter("google") + "\n" +
                "    <li><b>Таobao идентификатор:</b>: "
                + request.getParameter("taobao") + "\n" +
                "</ul>\n" +
                "</body></html>
    }
    
    // Обработка метода запроса POST
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

Установите соответствующий web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <servlet>
    <servlet-name>CheckBox</servlet-name>
    <servlet-class>com.w3codebox.test.CheckBox</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>CheckBox</servlet-name>
    <url-pattern>/TomcatTest/CheckBox</url-pattern>
  </servlet-mapping>
</web-app>

Адрес доступа к примеру: http://localhost:8080/TomcatTest/checkbox.html , посмотрите на результат.

для чтения всех формальных параметров

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

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

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * Класс реализации сервлета ReadParams
 */
@WebServlet("/ReadParams")
public class ReadParams extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ReadParams() {
        super();
        // TODO Автоматически сгенерированный конструктор шаблона
    }
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置响应内容类型
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        String title = \
        String docType = ;
            "<!doctype html public \
            "transitional//en\">\n"
            out.println(docType +
            "<html>\n" +
            "<head><meta charset=\"utf-8\"><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>参数名称</th><th>参数值</th>\n"+
            "</tr>\n");
        Enumeration paramNames = request.getParameterNames();
        while(paramNames.hasMoreElements()) {
            String paramName = (String)paramNames.nextElement();
            out.print("<tr><td>" + paramName + "</td>\n");
            String[] paramValues = ;
            request.getParameterValues(paramName);
            // Чтение данных одного значения
            if (paramValues.length == 1) {
                String paramValue = paramValues[0];
                if (paramValue.length() == 0)
                    out.println("<td><i>Нет значений</i></td>");
                else
                    out.println("<td>" + paramValue + "</td>");
            }
                // Чтение данных нескольких значений
                out.println("<td><ul>");
                for(int i=0; i < paramValues.length; i++) {
                out.println("<li>" + paramValues[i]);
            }
                out.println("</ul></td>");
            }
            out.print("</tr>");
        }
        out.println("\n</table>\n</body></html>");
    }
    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Автоматически сгенерированный метод
        doGet(request, response);
    }
}

Теперь попробуйте上面的 Servlet через следующую форму:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Основной учебник сайта (oldtoolbag.com)</title>
</head>
<body>
<form action="ReadParams" method="POST" target="_blank">
<input type="checkbox" name="maths" checked="checked" /> Математика
<input type="checkbox" name="physics" /> Физика
<input type="checkbox" name="chemistry" checked="checked" /> Химия
<input type="submit" value="Выберите предмет" />
</form>
</body>
</html>

Установите соответствующий web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <servlet>
    <servlet-name>ReadParams</servlet-name>
    <servlet-class>com.w3codebox.test.ReadParams</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ReadParams</servlet-name>
    <url-pattern>/TomcatTest/ReadParams</url-pattern>
  </servlet-mapping>
</web-app>

Теперь вызовите Servlet из вышеуказанной формы, адрес доступа: http://localhost:8080/TomcatTest/test.html, чтобы увидеть результат.

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