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>
Еще полезные ссылки:
- Официальная документация по Java EE 6: загрузка файлов с помощью технологии сервлетов Java
- Статья BalusC: Загрузка файлов в Servlet 3.0
Вы должны изменить свой код для проверки на ноль в первую очередь. Это предотвратит нежелательные ошибки позже. Попробуйте проверить отправленный запрос, чтобы увидеть, что в нем содержится. В 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, как описано здесь