У вас есть одна форма и несколько кнопок отправки. Проблема заключается в том, что форма может отправляться только на одно действие, независимо от того, сколько кнопок отправки у вас внутри формы.
На ум приходят три решения:
1. Есть только одно действие, в котором вы отправляете все. Оказавшись внутри класса Action, проверьте, какая кнопка использовалась для отправки формы, и выполните соответствующую обработку на основании этого.
<html:form action="modify">
..
..
<html:submit value="delete"/>
<html:submit value="edit" />
<html:sumit value="update" >
</html:form>
В методе ModifyAction.execute(...)
есть что-то вроде:
if (request.getParameter("delete") != null || request.getParameter("delete.x") != null) {
//... delete stuff
} else if (request.getParameter("edit") != null || request.getParameter("edit.x") != null) {
//...edit stuff
} else if (request.getParameter("update") != null || request.getParameter("update.x") != null) {
//... update stuff
}
2. Перед отправкой формы измените атрибут действия формы HTML с помощью JavaScript. Сначала вы изменяете кнопки отправки на простые с прикрепленными обработчиками кликов:
<html:form action="whatever">
..
..
<html:button value="delete" onclick="submitTheForm('delete.do')" />
<html:button value="edit" onclick="submitTheForm('edit.do')" />
<html:button value="update" onclick="submitTheForm('update.do')" />
</html:form>
С обработчиком:
function submitTheForm(theNewAction) {
var theForm = ... // get your form here, normally: document.forms[0]
theForm.action = theNewAction;
theForm.submit();
}
3. Используйте DispatchAction
(один класс действий, аналогичный пункту 1), но без необходимости проверять, какая кнопка была нажата, поскольку она обрабатывается DispatchAction
,
Вы просто предоставляете три метода исполнения с именами delete
, edit
и update
. Вот пример, который объясняет, как вы можете это сделать .
В заключение: Для номера 1 мне не очень нравятся эти уродливые тесты ... для номера 2 мне не очень нравится тот факт, что вы должны играть с формой действия используя JavaScript, поэтому я бы лично пошел на номер 3 .