обработка форм с несколькими кнопками / сообщениями - PullRequest
8 голосов
/ 27 января 2010

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

<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 ]

3 голосов
/ 27 января 2010

Как и для любого другого обычного элемента <input>, пара name-value <input type="button"> будет отправлена ​​в качестве параметра запроса.

Главное предостережение заключается в том, что элементы <input type="button"> и <button> не работают должным образом в MSIE. Во всех версиях MSIE атрибут value элемента кнопки не будет отправлен в качестве значения параметра, но вместо этого будет отправлено его тело (содержимое тега)!

Кроме того, в IE6 есть еще одна удивительная ошибка: будет отправлена ​​не только пара «имя-значение» нажатой кнопки, но и любая другая не нажатая кнопка в форме! Таким образом, вы вообще не сможете различить нажатую кнопку на стороне сервера.

Решение, которое работает в сочетании со всеми браузерами, состоит в том, чтобы использовать <input type="submit"> и дать им другое имя (или одно и то же имя, но другое значение).

* 1016 Е.Г. *

<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">

в сочетании с

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.

Кстати, я, конечно, предполагаю, что вы уже используете Apache Commons FileUpload для обработки данных многокомпонентной формы, при необходимости с помощью фильтра , который возвращает данные многочастной формы обратно в карте параметров запроса , иначе вы ничего не получите от HttpServletRequest#getParameter().

2 голосов
/ 27 января 2010

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

Таким образом, вы можете определить, какая кнопка была нажата, проверив наличие значений для каждой клавиши, связанной с изменяющимися кнопками (или, если вы называете свои кнопки одинаковыми, вы можете просто проверить, какое значение клавиши).

Кроме того, элементам BUTTON необходимы обработчики onClick для фактической отправки формы и / или выполнения какой-либо работы (для элементов SUBMIT стандартный обработчик onClick вызывает submit()) формы

1 голос
/ 27 января 2010

Кнопки type = "button" не отправляют форму автоматически. Будет только type = "submit".

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

   String btn = request.getParameter("submitbuttonname");
   if(btn != null){
      //this was the button clicked.
   }

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

0 голосов
/ 27 января 2010

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

0 голосов
/ 27 января 2010

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

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

...

<input name="download" onClick="submitTo('/download')" ... />
0 голосов
/ 27 января 2010

Apache Commons FileUpload может обработать все это для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...