Несколько кнопок отправки в Struts 1.3

У меня есть этот код в моем JSP:

<%@taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
..
..
<html:form action="update" >
  ..
  ..
  <html:submit value="delete" />
  <html:submit value="edit" />
  <html:sumit value="update" />
</html:form>

А это в файле struts-config.xml:

<action path="/delete" name="currentTimeForm" input="/viewall.jsp" type="com.action.DeleteProduct">
   <forward name="success" path="/viewall.jsp" />
   <forward name="failure" path="/viewall.jsp" />
</action>

Как и действие delete, у меня есть edit и update. Он отлично работает, если я даю имя именно как <html:form action="delete">, но как заставить его динамически работать для update и edit?


person Nageswaran    schedule 12.09.2011    source источник


Ответы (2)


У вас есть одна форма и несколько кнопок отправки. Проблема в том, что форма может быть отправлена ​​​​только для одного действия, независимо от того, сколько кнопок отправки у вас есть внутри формы.

Сразу приходят на ум три решения:

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 (один класс Action, аналогичный пункту 1), но без необходимости проверять, какая кнопка была нажата, поскольку это обрабатывается классом DispatchAction.

Вы просто предоставляете три метода выполнения с правильными именами delete, edit и update. Вот пример, объясняющий, как вы можете это сделать .

В заключение: Что касается № 1, мне не очень нравятся эти уродливые тесты…. Что касается № 2, мне не очень нравится тот факт, что вам приходится играть с формой действия с помощью JavaScript. , так что лично я выбрал бы номер 3.

person Community    schedule 12.09.2011
comment
очень хорошее руководство, данное вами - +1 - person Naved; 13.09.2011
comment
Вот это да. Именно то, что мне нужно. Огромное спасибо! - person ykombinator; 23.05.2013
comment
@ user159088: Что, если использовать i18n? Значение также является меткой кнопки. - person Sefran2; 20.06.2013

Есть еще один более простой способ сделать это следующим образом:

В форму currentTimeForm ActionForm добавьте свойство String (пример: buttonClicked).

В jsp в каждом из тегов html:submit добавьте это свойство.

Теперь в методе выполнения действия просто проверьте значение этого свойства, т.е.

if(currentTimeForm.getButtonClicked().equals("delete"){
}
else if((currentTimeForm.getButtonClicked().equals("edit"))

и так далее...

person mike    schedule 27.05.2013
comment
я считаю это не эффективным способом сделать это. Например, с 10 формами, которые имеют двойные или тройные кнопки отправки, вы не можете продолжать добавлять переменные сеанса или запроса или добавлять другие переменные в свой компонент. - person fresh learner; 24.02.2016