обработка форм с несколькими кнопками / постами
У меня есть следующая настройка формы:
<html>
<head></head>
<body>
<form method="post" enctype="multipart/form-data" action="FileUpload">
<table>
<th>WEX SI Online Validation</th>
<tr>
<td>Step 1: Select File for Validation: </td>
<td><input name="filename" type="file"/></td>
</tr>
<tr>
<td>Step 2: Validate File:</td>
<td><input name="validate" type="button" value="Validate"/></td>
</tr>
<tr>
<td>Step 3: Download and Fix Errors:</td>
<td><input name="download" type="button" value="Download"/></td>
</tr>
<tr>
<td>Step 4: Submit</td>
<td><input name="submit" type="submit" value="Submit"/></td>
</tr>
</table>
</form>
</body>
</html>
Как я должен справиться с этим? Я использую Java / JSP / Servlets, но не уверен, как обрабатывать сообщение для части загрузки этого и других действий.
Я думаю, что было бы лучше создать какой-то контроллер формы, который обрабатывал сообщение формы и делегировал другим сервлетам в зависимости от того, что делает пользователь. Я не уверен, как сказать, что пользователь выбрал, хотя.
6 ответов
как и для любого другого нормального <input>
элемента name-value
пара <input type="button">
будет отправлено как параметр запроса.
главное предостережение только в том, что <input type="button">
и <button>
элементы не работают должным образом в MSIE. Во всех версиях MSIE value
атрибут элемента button не будет отправлен в качестве значения параметра, но вместо этого будет отправлено его тело (содержимое тега)!
кроме того, в IE6 есть еще одна удивительная ошибка: не только пара имя-значение нажатой кнопка будет отправлена, но те из всех других несжатых кнопок в форме будут отправлены, а также! Таким образом, вы не можете различить нажатую кнопку на стороне сервера вообще.
решение, которое работает в сочетании со всеми браузерами является использование <input type="submit">
и дать им всем другое имя (или то же имя, но другое значение).
Э. Г.
<input type="submit" name="validate" value="Validate">
<input type="submit" name="download" value="Download">
<input type="submit" name="submit" value="Submit">
в сочетании с
if (request.getParameter("validate") != null) {
// Validate button pressed.
} else if (request.getParameter("download") != null) {
// Download button pressed.
} else if (request.getParameter("submit") != null) {
// Submit button pressed.
}
или
<input type="submit" name="action" value="Validate">
<input type="submit" name="action" value="Download">
<input type="submit" name="action" value="Submit">
in комбинация с
String action = request.getParameter("action");
if ("Validate".equals(action)) {
// Validate button pressed.
} else if ("Download".equals(action)) {
// Download button pressed.
} else if ("Submit".equals(action)) {
// Submit button pressed.
}
последний способ предоставляет больше возможностей для абстрагирования одного и другого более красиво на уровне Java.
кстати, я конечно предполагаю, что вы уже используете Апач Викискладе Fileupload С для обработки данных составных форм, при необходимости с помощью фильтр, который помещает данные составной формы обратно в карту параметров запроса, иначе вы ничего не получите от HttpServletRequest#getParameter()
.
значение кнопки Отправить передается в запросе POST вместе со всеми другими значениями формы, причем имя является именем кнопки, а значение-значением кнопки.
таким образом, вы можете определить, какая кнопка была нажата, проверив наличие значений для каждого ключа, связанного с различными кнопками (или если вы называете свои кнопки одинаковыми, вы можете просто проверить, какое значение ключа).
кроме того, элементы кнопок нуждаются в обработчиках onClick для отправки форма и / или выполнить любую работу (для элементов отправки обработчик onClick по умолчанию вызывает форму submit()
)
кнопки type= "button" не отправляют форму автоматически. Только type="submit" будет.
Если вы хотите различные кнопки, которые каждый отправить и выполнять различные действия, то у вас есть несколько вариантов. Я думаю, что вариант, который вы упомянули, чтобы один сервлет решал, что делает пользователь, и переадресовывал на другой сервлет, - хорошая идея. Вы можете сказать, что делает пользователь, ища имя кнопки на карте атрибутов.
String btn = request.getParameter("submitbuttonname");
if(btn != null){
//this was the button clicked.
}
второй вариант, который я могу придумать, - разбить форму на несколько форм. Вам нужно отправить файл для каждой кнопки? Если не создать форму с данными, которые необходимо отправить каждый со своей собственной кнопкой отправки.
его можно обрабатывать с помощью JavaScript.
function submitTo(url) {
form.action = url;
form.submit();
}
...
<input name="download" onClick="submitTo('/download')" ... />
лучший подход - иметь контроллер формы для делегирования логики другим классам, в зависимости от значений входного типа, передаваемых в качестве параметров.