Бутон за множествено изпращане в 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 (един клас на действие, подобен на точка 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

Има друг по-прост начин да направите това, както следва:

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

В jsp, във всеки от таговете html:submit добавете това свойство.

Сега в метода за изпълнение на действие просто проверете стойността на това свойство, т.е.

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

и така нататък...

person mike    schedule 27.05.2013
comment
смятам, че това не е ефективен начин да се направи това. С 10 формуляра например, които имат бутони за двойно или тройно изпращане, не можете да продължите да добавяте променливи за сесия или заявка или да добавяте повече променливи към вашия bean. - person fresh learner; 24.02.2016