request.getParameter для кнопки отправки с нулевым значением

При нажатии кнопки "Создать PDF/ Создать файл Excel" он запрашивает сервлет FileUpload для выполнения обработки. Теперь, когда я пытаюсь получить значение нажатой кнопки " Отправить", он дает мне значение как ноль. почему это происходит?

Вот мой HTML-код:

<form action="FileUpload" method="post" enctype="multipart/form-data">
<input type="file" id="filename" name="filename"><br>
<input type="button" value="Upload"><br>
<input type="submit"  value= "Generate PDF" name="pdf">
<input type = "submit" value="Generate Excel" name="xls">
</form>

Это мой код сервлета:

String generatePDF= request.getParameter("pdf");//null
if(generatePDF.equals("Generate PDF"))//Giving NullPointerException at this step
{
  System.out.println("generatePDF button pressed");
}

5 ответов

Решение

Насколько я понимаю, проблема, похоже, в том, что у вас есть многокомпонентный запрос, отправляемый на сервер. Второй ответ на этот вопрос, кажется, имеет решение вашей проблемы. По сути, вы должны использовать методы, предоставляемые классом FileItem в пакете Apache Commons FileUpload. Или, как предлагается здесь, вы можете использовать getPart() метод класса HttpServletRequest.

ОБНОВИТЬ

Извините, я изначально пропустил enctype="multipart/form-data" часть. Итак, как правильно заметил пользователь @tomor, причина вашей проблемы в том, что вы используете enctype="multipart/form-data", Прочитайте его ответ.

Для более подробного объяснения вашей проблемы прочитайте следующий ответ BalusC: Как загрузить файлы на сервер, используя JSP/Servlet?,

Следующее решение для Servlet v3.0. Для более старых версий наиболее популярным решением является использование Apache Commons FileUpload (подробности см. В ответе BalusC).


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

Пример:
HTML

<form action="FileUpload" method="post" enctype="multipart/form-data">
    <input type="file" id="filename" name="filename"><br>
    <input type="button" value="Upload"><br>
    <input type="submit" value="Generate PDF"   name="submitAction">
    <input type="submit" value="Generate Excel" name="submitAction">
</form>

Servlet
NB! Обратите внимание на аннотацию @MultipartConfig (доступна с версии Servlet 3.0). Таким образом, вы можете правильно обрабатывать запросы multipart/form-data.

TestServlet.java

package com.example;

import javax.servlet.http.HttpServlet;
import javax.servlet.annotation.WebServlet;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;

import java.io.IOException;

@WebServlet(urlPatterns = {"/TestSubmit.do"})
@MultipartConfig
public class TestServlet extends HttpServlet {

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
                    throws ServletException, IOException {

        String submitAction= request.getParameter("submitAction");
        if (submitAction != null) {
            if (submitAction.equals("Generate PDF")) {
                System.out.println("Generate PDF button pressed");
            } else if (submitAction.equals("Generate Excel")) {
                System.out.println("Generate Excel button pressed");
            }
        } else {
            // do something about it
        }
    }
}


НОТА:
Вместо @WebServlet (опять же, начиная с Servlet 3.0), вы, конечно же, можете настраивать сервлеты внутри web.xml. То же самое для @MultipartConfig: вместо этой аннотации вы можете добавить <multipart-config> как дочерний элемент элемента конфигурации сервлета в файле web.xml.

Пример (выдержка из web.xml):

<servlet>
    <servlet-name>Test Servlet</servlet-name>
    <servlet-class>com.example.TestServlet</servlet-class>
    <multipart-config>
        <!-- In this case empty, but can contain additional nested elements -->
    </multipart-config>
</servlet>
<servlet-mapping>
    <servlet-name>Test Servlet</servlet-name>
    <url-pattern>/TestSubmit.do</url-pattern>
</servlet-mapping>

Еще полезные ссылки:

Вы должны изменить свой код для проверки на ноль в первую очередь. Это предотвратит нежелательные ошибки позже. Попробуйте проверить отправленный запрос, чтобы увидеть, что в нем содержится. В Firefox есть плагин, который называется Tamper data, который позволяет вам отлавливать и редактировать запрос перед его отправкой. Я уверен, что будут другие, если вы будете искать.

Это позволит вам увидеть данные непосредственно перед их отправкой. Помните, что к тому времени, когда он попадает на ваш сервер, он уже прошел несколько этапов, поэтому его раннее обнаружение помогает. Также подумайте о наличии фильтра для регистрации состояния запроса, имен параметров и т. Д. Он может помочь при первой разработке и может быть легко удален позже без вмешательства в ваш бизнес-код.

Изменение кода сервлета

String generatePDF= request.getParameter("pdf");

в

String generatePDF= request.getParameter("filename");

потому что: имя атрибута для типа ввода будет значением getParameter

`String generatePDF= request.getParameter("filename");
if(generatePDF.equals("Generate PDF")
{
 System.out.println("generatePDF button pressed");
}`

Если ваша форма имеет MIME-тип multipart/formdata, она должна быть настроена как аннотация @MultipartConfig в сервлете или в web.xml, как описано здесь

Другие вопросы по тегам