обработка форм с несколькими кнопками / постами

У меня есть следующая настройка формы:

<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.
   }

второй вариант, который я могу придумать, - разбить форму на несколько форм. Вам нужно отправить файл для каждой кнопки? Если не создать форму с данными, которые необходимо отправить каждый со своей собственной кнопкой отправки.


Апач Викискладе Fileupload С может обрабатывать все это для вас.


его можно обрабатывать с помощью JavaScript.

function submitTo(url) {
    form.action = url;
    form.submit();
}

...

<input name="download" onClick="submitTo('/download')" ... />

лучший подход - иметь контроллер формы для делегирования логики другим классам, в зависимости от значений входного типа, передаваемых в качестве параметров.